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秒打上..
接下來就可以手擼實時應用了,具體寫什么應用還不知道,慢慢摸索吧