天天看点

RTP之编程限制

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重定向。

RTP之编程限制

还有一些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()作用于单个任务

    还有要补充的吗