杨为民 发表于 2024-3-26 11:53:48

本帖最后由 杨为民 于 2024-3-26 12:23 编辑

LAOXU 发表于 2024-3-26 10:53
所谓的[考题],是 XX 强加于我的, 原来只是列出供大伙开心,

也没考虑到 有人会认真考虑解决,

好好学习,天天向上。

相互切磋,共同提高。


相比库函数,STC单片机RTOS事业需要更多的懂指令、懂汇编、懂编译和能实践的人才来参与建设。
期待LAOXU早日在本版块发第一个帖子,
期待LAOXU早日在本版块成为荣誉版主。

杨为民 发表于 2024-3-26 12:21:29

本帖最后由 杨为民 于 2024-3-26 12:22 编辑

LAOXU 发表于 2024-3-26 10:53
所谓的[考题],是 XX 强加于我的, 原来只是列出供大伙开心,

也没考虑到 有人会认真考虑解决,


我想再次强调一下, 本题的两个核心,

1. 关闭总中断, OS 切换任务能正常运行.
2. OS 切换任务的实时性, 越快越好.


LAOXU,你这个题目其实非常好,斗胆建议修改为:

1. 对于STC单片机RTOS,关闭总中断, 采用什么技术才能保证OS 切换任务能正常运行?
2. 对于STC单片机RTOS,采用什么技术才能保证OS 切换任务的实时性, 越快越好?


由于这个话题可抽象可具体,若是考试题的话大家压力太大,不敢被评分或点评,因此建议你用技术探讨话题的形式单独发贴,发表你的看法、大家一起探讨。
这样我们就可以自由地发表看法,哪怕说错了也就算了,达到交流的目的就行

gentleman 发表于 2024-3-26 12:33:09

杨为民 发表于 2024-3-26 00:56
(1)“FreeROTS其实留了个 portYIELD_FROM_ISR() 接口,但移植后port里没实现”

是的,所以在官方范例 ...

谢谢杨老师指导

学生仿照该例,尝试去设计中断嵌套计数器 来修复bug

tzz1983 发表于 2024-3-26 13:36:47

本帖最后由 tzz1983 于 2024-3-26 13:41 编辑

gentleman 发表于 2024-3-26 12:33
谢谢杨老师指导

学生仿照该例,尝试去设计中断嵌套计数器 来修复bug
我给你提几个建议:
1. 不要再花精力到用最高优先级切换任务,这个没有性能提升优势,反而是可预测的响应下降。
2. 研究方向仍为最低优先级切换任务。加中断嵌套计数器,可适用于FreeRTOS。对你进一步了解OS切换过程也很有好处。
但你得有心里准备,FreeRTOS本身不存在中断嵌套计数器,加了以后,不但改动范围大,并且使用规则也可能要更改。
(比如以前是直接用中断,现在可能要在进入中断后给嵌套计数器加1,退出中断也要求用户有额外的操作,很不友好)
3. 最好是,改用中断切换任务,不需要额外加嵌套计数器就能实现所有功能,用户体验也基本保持不变。
FreeRTOS原本就是用中断切换任务的,如果在STC上也改用中断切换任务,则可在改动较少的情况下,轻易实现中断内即时切换任务。弥补官网例子的不足。
(我估计STC官方的例子是不愿意额外多用一个中断源)


祝你一切顺利。

gentleman 发表于 2024-3-26 14:10:59

tzz1983 发表于 2024-3-26 13:36
我给你提几个建议:
1. 不要再花精力到用最高优先级切换任务,这个没有性能提升优势,反而是可预测的响应 ...
谢谢兄弟建议{:4_196:}


加了计数器,中断要额外跳转一次
好像的确有影响。


我先尝试写一下计数器,不懂再来问{:4_183:}

LAOXU 发表于 2024-3-26 16:15:02

tzz1983
就是开个玩笑,活跃一下,也没什么大错。你说“没有任何标志位通知 OS” 嵌套计数器本身就是通知呀

============================================

我还没学到这, 是否 现在的 OS规定, 用户的每个中断中, 都需要加个 嵌套计数器 ?

这有这样, 才能通知 OS , 请帮忙确认, 谢谢 .

tzz1983 发表于 2024-3-26 16:41:18

本帖最后由 tzz1983 于 2024-3-26 17:26 编辑

LAOXU 发表于 2024-3-26 16:15
tzz1983
就是开个玩笑,活跃一下,也没什么大错。你说“没有任何标志位通知 OS” 嵌套计数器本身就是通知 ...
只用中断切任务的OS是不需要嵌套计数器的, 比如FreeRTOS的设计中,就没有嵌套计数器.
中断切换任务的原理是,PendSv为最低优先中断, 除PendSv之外的中断如果想要切换任务,就触发PendSv中断, 退出当前中断后才能进入PendSv中断, 也就是说, 除了PendSv以外,别的中断只是提交请求,没有真的切换(延时切换,由PendSv代劳). 所以中断切换任务永远不会发生嵌套问题,硬件自动搞定了.用中断的方式就和没有OS一样.
uC/OS出现的年份早一些,支持更多的切换方式,本身源码就包含嵌套计数器, 有两个目的,一是防止嵌套中断时直接返回任务级. 二是,OS可以由此知道当前代码是否为中断例程,OS服务针对此有不同的处理方式.
从嵌套的中断直接返回任务是严重的BUG,如果是M3, 你将会被硬件Faults伺候

函数切换任务的本质是用代码操作直接跳转到另一个任务。
在中断里用函数切换任务,分两种情况,如果是嵌套,正确的操作是返回到之前的那个中断,切换任务将由最后一个将要退出的中断来完成。
如果不是嵌套中断,则自已就是最后退出的那个中断,可以直接切换任务。
通过判断嵌套计数器非0值来判断当前是否为嵌套中断

gentleman 发表于 2024-3-26 17:16:09

本帖最后由 gentleman 于 2024-3-26 17:27 编辑

tzz1983 发表于 2024-3-26 16:41
只用中断切任务的OS是不需要嵌套计数器的, 比如FreeRTOS的设计中,就没有嵌套计数器.
中断切换任务的原理是 ...
兄弟参考了你好多代码这样处理有问题吗
现在os跑起来了


在想一个合适的 嵌套中断例子去测试
改入口


计数器加/减出入栈
freeRTOS 中的portRESTORE_CONTEXT();只有出栈内容

带参数#define



定时器0中断 存在1个/多个中断就直接退出
无其他中断正常调度


用上次的关EA的任务测试可以运行
多级嵌套的测试例子还在想



LAOXU 发表于 2024-3-26 17:36:02

理解了, 是选项, 现在基本不用,

gentleman 发表于 2024-3-26 17:46:25

LAOXU 发表于 2024-3-26 17:36
理解了, 是选项, 现在基本不用,

这次 不存在理论上的 bug了吗{:4_165:}
页: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16
查看完整版本: 【全部暂停】【方向改为完善官方的FreeRTOS】 随时关EA的 FreeRT