Xenomai 3 的rtdm驅動更像一般的Linux驅動,named device會在/dev/rtdm/xxx創建一個設備文件。而用戶空間使用時,寫得來也和Linux的一般char設備相似,open/close/read/write/ioctl,只不過實際上在link的時候這些函數都被做了手腳,替換成了libcobalt.so中的函數(參見 /usr/xenomai/lib/cobalt.wrappers)。這樣就導致在使用rtdm驅動時無須 xeno-config --skin=rtdm --cflags / --ldflags,而是用api對應的配置即可,例如如果用posix api,則應使用 xeno-config --posix --cflags / --ldflags
自動初始化
默認link時會自動加上 /usr/xenomai/lib/xenomai/bootstrap.o,並配合上相應的ldflags,直接把用戶的main函數替換為xenomai_main,讀取相關的命令行參數,同時調用xenomai_init初始化xenomai各個模塊。如果一個動態庫使用了rtdm,那么 xeno-config --rtdm --ldflags也會默認帶上 bootstrap.o,最后link的時鍾會導致 xenomai_main重復定義無法編譯過,即使編譯過也會導致assert錯誤或者xenomai_init被多次調用,所以庫使用的ldflags應該在生成時加上--no-auto-init,即 xeno-config --rtdm --ldflags --no-auto-init
nrt和rt的函數調用
rtdm驅動中有一些函數有兩個版本,例如 ioctl_nrt和ioctl_rt,在Xenomai 2時會根據當前是primary還是secondary來調用rt或nrt,但是Xenomai 3不是這樣了,如果有rt版本,那么會先切到primary去調用rt的版本,如果rt返回-ENOSYS(也可不實現ioctl_rt),就會切到secondary再調用nrt的版本。這個在 https://xenomai.org/migrating-from-xenomai-2-x-to-3-x/#Adaptive_syscalls 講了,如果不注意這一項,在primary時調用了其他linux內核函數,可能導致系統死機(不響應)
mmap
和普通的Linux驅動一樣,也支持mmap系統調用了。rtdm驅動只要實現ops->mmap即可,這個函數實現也比較簡單,根據內存的性質調用 rtdm_mmap_vmem/rtdm_mmap_kmem/rtdm_mmap_iomem等函數即可。