- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-04-30 07:46:22
荣誉版主
- 积分
- 2319
|
发表于 2023-9-22 16:31:06
|
显示全部楼层
本帖最后由 tzz1983 于 2023-9-22 16:40 编辑
据说作者开发了一个可以在临界区切换任务的代码, 我们来测试一下, 以下代码是作者自己的, 除了任务, 其它的都没变过. 就是刚下载的原码. 来看图:
这是一个正常的代码, 没有在临界区做什么出格的事情. 在任务A挂起自己的同时, 最高优先级已经不是任务A, OS切换到任务B. 并且不再执行任务A的代码. 可以看到任务B正常运行, P24上的LED闪烁.
接下来看另一个代码:
此时我们把挂起自己的操作放到临界区内, 在仿真时我可以看到, 执行完挂后, 优先级变成了3(任务B的优先级)并成功的切换到了任务B, 可P24的LED再也不闪了.
没有再花时间去研其原因. 我大概估计得到, 在执行任务B时, EA是没开的, 所以GAME OVER 了 .
这个实验结果表明, 作者的在临界区切换任务有很大的隐患,这只是找出其中一项而已.
可能作者不服, 他会告诉我, 你不可以在临界区调用OS服务.
呵呵, 我已经习惯了这种说法. 今天上午我和作者聊了一些时间, 在另一个贴上"关于"访问"的描述是否准确那张贴, 有兴趣的朋友可以自己去看.
当证据有利于他们的时候, 他会这么说, "你不可以在临界区调用OS服务." 当证据不利于他们的时候, 他会这样说, "除了阻塞还有很多OS服务呀, 你都可以调用的".
说这些没有意义, 我想问的是, 当你做一段代码说可以在临界区切换任务时: 说明了哪些OS应用是可以调用的, 哪些是不可以调用的了吗? 你说明了吗?
可能他还会这样说, 你这样切换任务不对, 你要用我做的那个 OSCtxSw();来切换呀, 我笑了, 具体这样做到底行不行暂且不说. 你这样做不是给自己添堵吗, 也给将来可能用到你代码的用户添堵啊, 要费多少口舌才能解释清楚这样做的可靠性. 并且现在你自己都很难证明这样做I没有BUG.
作为一个官方论坛的版主, 还悬赏200元找BUG. 我想问, STC8那个是不是最后证明了, 把那个OSIntNesting++放在函数中, 可能会执行不到就发生后来的高优先级中断. 你最终代码没有表现出来没把这条语句放在中断向量口, 请问这算不算BUG, 那我的奖金呢? 在哪里?
|
|