fanxsp
发表于 2024-3-31 23:17:17
本帖最后由 fanxsp 于 2024-3-31 23:33 编辑
tzz1983 发表于 2024-3-31 21:28
楼主真
今晚才开始,看了一小会.代码和说明文档,都特别工整,正规军!
关于你说到是第一次看到这种情况,是因为这个方法只有在 keil C51中可以用。其它的编译器,包括 ARM,STC32的C251都不能用。因为c51 寄存器很少,
R0~R7 都是调用者保存的。ARM,C251 因为寄存器比较多,寄存器有分为两组,一组是调用者保存,另一组是被调用者保存。被调用者保存的一组还是
必须入栈的。再加上ARM是用 SV 、PendSV指令进行任务切换,好象寄存器是自动入栈的。所以一般在任务级切换也是采用全部寄存器入栈了。
关于寄存器的使用,X86 和 ARM 都有专门的调用约定,C251在帮助中有详细说 明。
杨为民
发表于 2024-4-1 12:20:17
本帖最后由 杨为民 于 2024-4-1 12:22 编辑
(1)我觉得楼主的TinyRTOS51存在一个很重要的不完善的地方:
在进行任务调度的时候,没有保存和恢复C51的“重入函数堆栈指针”(对于大模式函数,这个指针是“?C_XBP”,对于小模式函数,这个指针是“?C_IBP”),
也没有对它们进行初始设置。这意味用户在编写TinyRTOS51项目程序时不能使用任何由“reentrant”关键字来定义的“可重入函数”。
这对TinyRTOS51用户编程来说是一个极大的限制。
(2)一个实际的RTOS项目程序,分为楼主的RTOS系统程序和用户自己编写的用户程序两个部分。前面的讨论楼主已经证明了TinyRTOS51的系统程序均满足了函数重入的要求,不需要重入函数堆栈指针的参与。
但是用户在编写自己的可重入函数时,未必能优化到不需要重入函数堆栈指针的参与的程度,这时如果TinyRTOS51系统再不支持C51标准的“reentrant”关键字来定义的,那么用户怎么办?
(3)函数重入的需求对于抢占式实时多任务操作系统比通常的裸机编程更经常发生,函数重入的现象不但在中断的时候会发生,在多个任务之间切换的时候也会发生。
尤其是多个任务共用一个设备时(比如多个任务向同一个串口发送信息时),设备的驱动函数就可能发生重入现象。
(4)不知道楼主对这个不完善的地方有什么特殊的考虑吗?如果没有,建议楼主还是完善它,给用户更大的编程空间。
fanxsp
发表于 2024-4-1 14:16:16
杨为民 发表于 2024-4-1 12:20
(1)我觉得楼主的TinyRTOS51存在一个很重要的不完善的地方:
在进行任务调度的时候,没有保存和恢复C51的 ...
暂时是不支持reentrant函数,后面会考虑。现在主要问题是测试还很不充份,现在重点是多做一些测试例程进行测试。
杨为民
发表于 2024-4-1 17:52:06
fanxsp 发表于 2024-4-1 14:16
暂时是不支持reentrant函数,后面会考虑。现在主要问题是测试还很不充份,现在重点是多做一些测试例程进 ...
期待TinyRTOS51 坚持初衷,不断成长
神农鼎
发表于 2024-4-1 22:41:56
向【64位超算中心】前进 ! DSP + TFPU, DPU32@全新32位8051+DSP指令 讨论稿 - 视频教学,《单片机原理及应用》教学改革及实践研讨会,实战技术交流会,会务通知 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
fanxsp
发表于 2024-4-2 07:49:30
TinyRTOS51V1.01增加一个用消息队列进行串口通讯的例程,欢迎大家下载测试。
咫尺天涯
发表于 2024-4-2 09:53:22
现在RTOS是越来越多了
tzz1983
发表于 2024-4-2 11:31:53
本帖最后由 tzz1983 于 2024-4-2 11:34 编辑
栈深度估算=任务调用深度*2+16 , 这个不够吧, 这里是指不允许中断嵌套吗?
想叉了,知道了,penDSV切换任务,不考虑中断嵌套级数.
fanxsp
发表于 2024-4-2 11:50:00
tzz1983 发表于 2024-4-2 11:31
栈深度估算=任务调用深度*2+16 , 这个不够吧, 这里是指不允许中断嵌套吗?
想叉了,知道了,penDSV切换任务, ...
允许中断嵌套,由于采用移栈的方法,类似你的 PSP+MSP,工作的栈是在 idata 中的,任务切换是发生在最低优先级的PendSV中断中,这时嵌套的中断都已经退出。
tzz1983
发表于 2024-4-2 12:10:23
fanxsp 发表于 2024-4-2 11:50
允许中断嵌套,由于采用移栈的方法,类似你的 PSP+MSP,工作的栈是在 idata 中的,任务切换是发生在最低 ...
是的, 我一下子没从251转过来, 在你这里, 分为"运行时栈IDATA", 和"存储栈XDATA".你的估算实际上是"存储栈XDATA"的估算.
我一直在思考, 51核有没有不搬栈就能实现OS的办法.
看到你的栈估算,想叉了, 眼前一亮,如果一个任务只用30Byte, 那等于不用搬家也能做8个任务. 后来一想到中断, 瞬间就没脾气了{:lol:}
页:
1
2
3
4
[5]
6
7
8
9
10
11
12
13
14