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重定向。
还有一些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()作用于单个任务 还有要补充的吗