xenomai是一个实时操作系统,想要使用它,先要移植I-pipe补丁
补丁在xenomai / ipipe-arm · GitLab
我的内核是4.4-248的,合并上去会有几个小错误,随便改改就好
编译内核没有报错之后,接下来需要修改arch/arm/mach-nuc970/time.c
修改方法参考补丁里面其它设备的定时器驱动,就是加一个注册tsc的接口
#ifdef CONFIG_IPIPE
258 tsc_info.freq =rate;
259 tsc_info.u.counter_paddr=(unsigned long)NUC970_PA_TIMER+0x18;
260 tsc_info.counter_vaddr=(unsigned long)REG_TMR_TDR1;
261 printk(KERN_INFO"vaddr=%x\n",tsc_info.counter_vaddr);
262 __ipipe_tsc_register(&tsc_info);
263 nuc970_itimer.irq=IRQ_TMR0;
264 nuc970_itimer.min_delay_ticks = 3;
265 nuc970_itimer.ack=nuc970_timer0_ack;
266 #endif /* CONFIG_IPIPE */
这里有个细节,tsc_info.u.counter_paddr要填时钟源的真实物理地址,tsc_info.counter_vaddr是虚拟地址,
就这么点细节,困扰了我两周,从内核的汇编一直扒到了应用层,才扒出来
接着就是修改arch/arm/kernel/ipipe_tsc.c,需要添加一个__ipipe_freerunning_24,因为972的定时器数据是24位的,加完之后,还需要在arch/arm/ker/ipipe_tsc_asm.S里面添加对应的汇编代码,汇编代码参考32位的,只是多了一个移8位的操作
整完之后,开始编译xenomai了,安装步骤参考Installing_Xenomai_3 · Wiki · xenomai / xenomai · GitLab
编译完成之后打包复制到文件系统,我编译安装的目录为/opt/arm/xenomai
移到板子上也是这个目录,不然会找不到库
执行测试程序/opt/arm/xenomai/bin/xeno-test,我这会报几个问题,原因是没有把实时驱动都装上
执行/opt/arm/xenomai/bin/latency时内核会崩溃,原因同上
后面我重新编译了内核,配置xenomai,将那些实时驱动都配置上了,再次运行以上两个测试程序时,终于可以正常打印了,运行过程中偶尔会崩溃,原因可能是内存不够吧,我将自己的应用程序全部关闭之后再运行,就没报错了
看起来移植并不难,但每一个点都浪费了大量的时候去调试,才确认下来的,当烧录都有100遍啊,nand的性能都直线下降了...之前加载系统只要6秒,现在10秒打上..
接下来就可以手撸实时应用了,具体写什么应用还不知道,慢慢摸索吧