打印
[应用相关]

RTX 临界段处理

[复制链接]
1137|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
efen|  楼主 | 2018-3-16 09:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚接触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用于您的产品设计中""
沙发
kingkits| | 2018-3-16 09:32 | 只看该作者
事无绝对,‘绝对可靠’这四个字在软件界就是个笑话

使用特权

评论回复
板凳
mmuuss586| | 2018-3-16 19:01 | 只看该作者
感谢分享;

使用特权

评论回复
地板
yiy| | 2018-3-19 22:18 | 只看该作者
哈哈,没有真正靠谱的东西,包括人

使用特权

评论回复
5
antusheng| | 2018-3-20 11:29 | 只看该作者
好学不

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

615

帖子

1

粉丝