刚接触RTX,分享下
"RTX是一个实时OS,在用户中断函数中调用OS函数必定会切换任务
RTX是一个为CM设计的不关中断的OS,运用了CM的先进特性避免任务间的并发
用户能在中断中使用的OS函数是有限的.且只有3个是写操作,如:
isr_evt_set,
isr_sem_send,
isr_mbx_send
且同样有另外3个相同功能函数供任务使用,如:
os_evt_set,
os_sem_send,
os_mbx_send,
任务用的这3个函数运行在特权级(经SVC调用),由于RTX是不关中断的,所以这3个函数随时可能被中断
而在用户中断中又调用了另外3个对应的函数,如果isr函数直接写操作的话就出现了经典的并发问题
举例:任务A等待0x0011事件,任务B会择机设置任务A的0x0001事件,某用户中断设置任务A的0x0010事件,如果刚好在
任务B执行os_evt_set期间的p_tcb->events |= 0x0001 语句发生用户中断,如果isr_evt_set直接设置
p_tcb->events |= 0x0010的话,当中断返回,p_tcb->events |= 0x0010设置是无效的.也就意味着丢失了一个重要的信号,
对于应用是致命的,一般结构的OS选择关中断避免此类并发.
但是聪明的RTX在isr函数中并没有直接写操作,而是将参数入队,然后悬起PendSV,用户中断返回后继续执行刚才被中断的os_evt_set函数
os_evt_set函数返回时由于咬尾中断特性CPU转而运行PendSV,在PendSV中检查是否需要处理队列.这样就保证了os_evt_set与isr_evt_set
的执行是串行化的.
只有"精妙绝伦"4个字才能形容RTX的这个设计,
RTX是一个绝对可靠的OS,永不关中断,用户的任何中断都能立即得到响应.ARM官网说到"您可以信心十足的将RTX用于您的产品设计中"" |