- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-04-30 07:46:22
荣誉版主
- 积分
- 2319
|
发表于 2023-9-14 22:28:46
|
显示全部楼层
下班了, 休息一会了, 想着杨老师的 “临界区保护嵌套测试程序” , 于是又认真回顾了一下前面的几贴, 本以为杨老师发了测试代码被我疏忽了, 然而并没有可运行的代码, 只是几张代码截图, 并且大多数话题前面都已经说过.
熊仔是一个做事很认真的人, 像是个孩子, 他说他在嵌套时遇到了问题, 然后杨老师也来了个"估计你那个程序测试通不过, STM32的例子也不一定能通过" . 现在我真的怀疑了, 难道你们手上真的憋了什么大招, 我完全够不着的那种大招? 如果真的有, 那就直接说出来吧, 也不用吊着我了, 
还是一件一件的来说吧:
一. 我是认为任务切换是不会嵌套的, 但你们说任务切换会嵌套, 我认真想了一下, 就按照你们的思维来, 切换方式也用你们那种代码方式, 从而又可分为两种情况: 1.任务级的主动做任务切换, 用的一般是OSCtxSw()函数, 而一旦进入OSCtxSw(), 就是进入了切换序列, 在没有执行完本函数之前不会返回, 怎么可能会有别的任务级代码嵌套调用OSCtxSw()呢, 根本不可能发生嘛. 这时你肯定会说了, 任务级不行, 那中断行啊, 开玩笑, 用这种方一旦进入切换序列, 必须得关中断. 原因是中断肯定不知道任务级的切换. 所以必须屏蔽中断, 否则就起飞了. 最后得出结论, 中断也不能使任务切换发生嵌套. 2, 中断级的主动任务切换, 对于大多数OS, 其实本身都已经考虑到了中断嵌套, UCOS 也是如此, 比如说那个中断嵌套计数器,(是一个8位的全局变量) 就是为了防止嵌套中断时, 直接返回任务级, (当然他还有一些别的作用,这里不说) . 所以说, 中断主动任务切换也不会发生任务切换嵌套 . 即如此, 那你们的任务切换嵌套又从何而来呢. 这本身就是个伪命题 ,没什么好研究的, 当然, 也期盼你能真正的驳倒我,才能共同进步. (这里又多说一点, 用你们这个方法切换任务的确是要全程临界段的, 但是不代表别的方法也需要全程开临界段,这点放到最后来说)
二. 临界区保护嵌套. 这个应该是和进出临界段的方式有关的, UCOS定义了三个模式, 其中模式三是支持临界区嵌套的, 那即然如此, 怎么又会通不过了呢. 是我有未想到的大疏忽 , 还是你测试的出发点本来就有问题, 其实我大至已经估算到了,你所说的问题, 可能只会出现在你那个特定的方法上. 然而我并不十分了解你的方法, 所以不再各说各话了吧. 如果你说的是个普适性问题, 那么你用实例来说明, 不要闹乌龙. 也不要用你特定的格局来说明问题, 所举的例子也需要是普适性的例子. 你说UCOS有重大BUG, 并且是从娘胎里就带来的, 但光UCOSII就有那么多版本, 并延续了那么多年, 难道这么明显的东西就只能你发现? 又或者说有别的人已经发现了, 但是就是不说, 也不改, 直到等着你来揭开迷底. 是个人认知的局限还是盲目自信?
三, 再说任务切换, 上面第一点已经说了, 用你们那个方法切换任务是不会发生嵌套的, 那用中断的方法就更不用担心了, 甚至中断嵌套计数器都可以不用, 自身的中断代码又怎么可能打断自身执行顺序呢, 无非是在执行过程中, 中断标志又被重新置位了,退出后又重新来了一次. 又或者被高优级中断打断, 回来以后继续工作. 特别说明一下, 用这种方法, 如果正在任务切换, 并且发生了中断嵌套, 高优先级中断是不会直接返回到任务级的, 他遵循的是, 从哪来的, 回到哪去, 除了占用了一此执行时间以外(栈也会有额外使用), 别的都没变. 所以这种方法并不需要全程开临界段. 你也不用担心他会切换任务, 或都说他调用的代码间接的,隐性的切换任务, 不管怎么样, 它要切换任务(其实只是做了个标志, 表明了它的需求), 最终的切换还是那个最低级的, 任务切换中断函数, 你们都是高级中断, 苦活累活就让我这个最低级的来干吧^^
杨老师比较认死理, "一直坚持操作系统理论里“任务切换不可被打断”原则" , 这个话题呢, 虽小, 并且实际上全程临界段也不会有太多的开销, 所以各人玩各人的吧, 喜欢怎样就怎样. 当然了, 熊仔和杨老师的例子肯定不能开着中断切换任务, 这是由于他们的切换机制造成的.
但是, 你有没有发现FREERTOS那个不受OS控制的高优先级中断这个理念, 虽然说不适用51核, 也不能用到251核上. 但是, 不受OS控制这个概念, 是不是可以反面映证任务切换是可以被打断的(还是那句话,你可以打断我,但返时不要改变我什么,就不会有问题), 当然为了不和OS产生冲突, 相应的代价是不能直接或间接调用OS系统函数或应用. 中国文字博大精深, 一不小心就说错话, 与其说任务切换不可被打断, 不如说, 大多数情况下是不可以被打断的, 但条件成熟了呢, 还是可以被打断.
|
|