CosyOS 发表于 2023-9-17 15:42:34

本帖最后由 CosyOS 于 2023-9-17 15:52 编辑

我也认为虽然主流RTOS都是在临界区中切换任务,但对于用户来说确实没有必要在临界段代码中切换任务。
但这也许是自己的眼界不够、见识有限,希望以后能有机会碰到这种实际应用的例子。




CosyOS 发表于 2023-9-17 15:56:30

本帖最后由 CosyOS 于 2023-9-17 15:58 编辑

tzz1983 发表于 2023-9-17 15:49
嗯, 同意您的说法, 以后"临界区中切换任务" 这个话题我不再参与.
中断切换任务的中断代码中"仅是在访问内 ...

我个人认为这种方法本身是没有问题的,只是是否存在bug的问题,否则就不会有Keil RTX4/5全局不关中断了,也不会有CosyOS。





熊仔 发表于 2023-9-17 18:06:45

杨为民 发表于 2023-9-17 13:21
“临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务. ”

看来这个问题 ...



杨老师举例的FreeRTOS例子,全程没有关闭总中断。
只是在读取系统重要变量的时候屏蔽了系统管理的中断,因为系统管理的中断会改变这些变量。

其实这个和坛友tzz1983方式一致的。


熊仔 发表于 2023-9-17 18:14:15

(6)说明:在我的认知里,任务切换的核心过程是不能被打断的,对于单片机RTOS而言,任务切换的核心过程都应该用关闭总中断的方式来保护它。



杨老师的这个观点,早就被主流RTOS打破了。
我们再看看ucos的切换任务代码


这个和FreeRTOS对比差不多,ucos的版本对BASEPRI操作之前关闭总中断。更加保守。

熊仔 发表于 2023-9-17 18:20:33

还有为啥主流RTOS在PendSVHandler里面不用规定的临界区保护方法呢?
可以看到PendSVHandler执行完毕,都是开启全部的中断。

其实,在中断函数退出前,把中断关闭,这种属于程序员的错误做法,程序员的bug,自己解决。我猜测就是这个原因。

CosyOS 发表于 2023-9-17 18:26:45

熊仔补充的正确。


CosyOS 发表于 2023-9-17 18:43:13

本帖最后由 CosyOS 于 2023-9-17 19:03 编辑

这种方法实现了脱管的高优先级中断的0延迟或低延迟,缺点是脱管的中断中不能再调用系统服务。
不过这已经比较好了。



杨为民 发表于 2023-9-17 22:45:37

熊仔 发表于 2023-9-17 18:14
(6)说明:在我的认知里,任务切换的核心过程是不能被打断的,对于单片机RTOS而言,任务切换的核心过程都 ...

如果我改成这样的表述,加一个定语:

(6)说明:在我的认知里,任务切换的核心过程是不能被打断的,对于STC8/STC32G/STC32F单片机的RTOS而言,任务切换的核心过程都应该用关闭总中断的方式来保护它。

即限定为STC的单片机,你们能接受吗?

杨为民 发表于 2023-9-17 23:12:15

熊仔 发表于 2023-9-17 18:06
杨老师举例的FreeRTOS例子,全程没有关闭总中断。
只是在读取系统重要变量的时候屏蔽了系统管理的中断 ...

“只是在写入/读取系统重要变量的时候”,这就是我的语言里说的“任务切换的核心过程”。你也标出了挑战者坛友对于这个过程是“关闭总中断”和“打开总中断”。
(1)因为我的语言表达有问题,熊仔坛友,我用你的语言,根据挑战者坛友的替代法移植版可不可以得到这个结论:
在任务切换的过程中,“在写入/读取系统重要变量的时候(我称之为任务切换的核心过程)”是不能被打断的,对于STC8/STC32G/STC32F单片机的RTOS而言,“在写入/读取系统重要变量的时候”应该用关闭总中断的方式来保护它。
(2)我就是字面上表达的这个意思,虽然我在自己的程序中关闭总中断的范围更宽,但是我也认为只要对这个核心:“在写入/读取系统重要变量的时候”关闭就够了。挑战者应该认可,那是他自己写的程序,我的这个表达不知你认不认可?

杨为民 发表于 2023-9-18 00:29:56

熊仔 发表于 2023-9-17 18:20
还有为啥主流RTOS在PendSVHandler里面不用规定的临界区保护方法呢?
可以看到PendSVHandler执行完毕,都是 ...

“还有为啥主流RTOS在PendSVHandler里面不用规定的临界区保护方法呢?
可以看到PendSVHandler执行完毕,都是开启全部的中断。
其实,在中断函数退出前,把中断关闭,这种属于程序员的错误做法,程序员的bug,自己解决。我猜测就是这个原因。”

有了你的这两段话,我觉得这个话题可以进入总结阶段了:
(1)先定义,你的“规定的临界区保护方法”表述,我认为更准确地是“关闭总中断的方法”
(2)主流RTOS都没有使用STC单片机,主流RTOS使用的像Cortex-M等类型的单片机或者CPU,在这些主流RTOS硬件平台上都有一个软中断。
(3)主流RTOS使用软中断来进行“任务切换”,由于软中断指令的特殊性,因此“不需要关闭总中断”。
(4)我在1985年-1993年期间,由于工作的需要,我在PDP-11计算机上和IBM PC/AT计算机使用、移植和自己开发的多个RTOS系统上,全部都使用了软中断(PDP-11是TRAP指令)作为任务切换方式,对于临界区保护,我自己也从来也没有用过关闭总中断的方法。
(5)我从2003年开始在8051(C8051、SST8051和STC8051)单片机上编写自己的RTOS时,发现无软中断指令可以用,所以就参考了周立功的Small RTOS和几个uC/OS-II移植版,根据以前的实际经验,我认为任务调度分为中断内调度和中断外调度是合理的。
(6)对于没有软中断(STC8类型)或者没有向用户开放软中断(STC32G/F类型)的STC单片机上的RTOS,我认为用关闭总中断来进行临界区保护是最安全的方法。是整个任务调度过程都关闭还是只关闭极其核心的任务切换部分(C251-UCOSII的替代法中的那现行的TCB和优先级改变为最高优先级的那两行程序就是任务切换的最核心部分了),这只是个选择程度问题。比如我赶飞机和火车,至少要先到一个小时,但我看到总有人在临关门时进来,当然最后结果都一样,大家都同时到达目的地。
(7)如果未来STC32位单片机对用户开放了80251的软中断“TRAP”指令,那么我认为现在版本的RTOS的任务切换等系统,都应该会改使用软中断的。



页: 1 2 3 4 5 [6] 7
查看完整版本: UCOSII - STC32G12K128 移植