RTP的特點是隔離保護,不能直接通路Kernel。是以,在程式設計上,會有一些限制。
最大的限制是記憶體的通路。如果RTP與RTP之間,或者RTP與Kernel之間,需要傳遞少量資料,可以使用Public的Message Queue。大量資料,可以使用共享資料區。
RTP不能直接通路Device,可以通過IO操作中轉,或使用共享資料區映射Device的Memory。
Kernel裡的IO重定向函數ioGlobalStdGet()、ioGlobalStdSet()、ioTaskStdGet()、ioTaskStdSet(),在RTP裡也就不能用了。但可以使用dup()、dup2()進行整個RTP的IO重定向。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuMmN1YWMxUWM1UzN5MWYlhjM2UGZxMjMkRmM1QjYycTMvwlN2EDO5cTNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
還有一些Kernel的機制不能在RTP裡使用了
- intLock()/intCpuLock()、intUnlock()/intCpuUnlock(),因為RTP裡不能鎖中斷
- taskLock()/taskCpuLock()、taskUnlock()/taskCpuUnlock(),因為RTP裡不能鎖排程政策
- taskInit(),可以使用taskCreate()代替
- taskOptionsSet(),因為RTP任務的option沒有可以修改的
- taskSwitchHookAdd()、taskSwitchHookDelete()
既然中斷受限,那麼RTP裡也不能使用WatchDog了,可以使用POSIX的timerLib代替。
- wdCreate() - timer_create()
- wdStart() - timer_connect() + timer_settime()
- wdCancel() - timer_cancel()
- wdDelete() - timer_delete()
還有幾個函數的作用不一樣了:exit()、kill()、raise()、sigqueue()
- 在Kernel裡,作用域是單個任務
- 在RTP裡,作用域是整個程序
-
在RTP裡,可以使用taskXxx()作用于單個任務
還有要補充的嗎