找回密码
 立即注册
楼主: fanxsp

原创极简的51-MCU专用RTOS TinyRTOS51

  [复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-3-31 23:17:17 | 显示全部楼层
本帖最后由 fanxsp 于 2024-3-31 23:33 编辑
tzz1*** 发表于 2024-3-31 21:28
楼主真

今晚才开始,看了一小会.代码和说明文档,都特别工整,正规军!

关于你说到是第一次看到这种情况,是因为这个方法只有在 keil C51中可以用。其它的编译器,包括 ARM  ,STC32的C251都不能用。因为c51 寄存器很少,
R0~R7 都是调用者保存的。ARM,C251 因为寄存器比较多,寄存器有分为两组,一组是调用者保存,另一组是被调用者保存。被调用者保存的一组还是
必须入栈的。再加上ARM是用 SV 、PendSV指令进行任务切换,好象寄存器是自动入栈的。所以一般在任务级切换也是采用全部寄存器入栈了。
关于寄存器的使用,X86 和 ARM 都有专门的调用约定,C251在帮助中有详细说 明。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 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)不知道楼主对这个不完善的地方有什么特殊的考虑吗?如果没有,建议楼主还是完善它,给用户更大的编程空间。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-4-1 14:16:16 | 显示全部楼层
杨*** 发表于 2024-4-1 12:20
(1)我觉得楼主的TinyRTOS51存在一个很重要的不完善的地方:

在进行任务调度的时候,没有保存和恢复C51的 ...

暂时是不支持reentrant函数,后面会考虑。现在主要问题是测试还很不充份,现在重点是多做一些测试例程进行测试。

点评

期待TinyRTOS51 坚持初衷,不断成长  详情 回复 发表于 2024-4-1 17:52
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-4-1 17:52:06 | 显示全部楼层
fan*** 发表于 2024-4-1 14:16
暂时是不支持reentrant函数,后面会考虑。现在主要问题是测试还很不充份,现在重点是多做一些测试例程进 ...

期待TinyRTOS51 坚持初衷,不断成长
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2024-4-1 22:41:56 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-4-2 07:49:30 | 显示全部楼层
TinyRTOS51  V1.01  增加一个用消息队列进行串口通讯的例程,欢迎大家下载测试。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:246
  • 最近打卡:2025-04-30 10:10:32

3

主题

155

回帖

537

积分

高级会员

积分
537
发表于 2024-4-2 09:53:22 | 显示全部楼层
现在RTOS是越来越多了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-4-2 11:31:53 | 显示全部楼层
本帖最后由 tzz1983 于 2024-4-2 11:34 编辑

栈深度估算=任务调用深度*2+16 , 这个不够吧, 这里是指不允许中断嵌套吗?

想叉了,知道了,penDSV切换任务,不考虑中断嵌套级数.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-4-2 11:50:00 | 显示全部楼层
tzz1*** 发表于 2024-4-2 11:31
栈深度估算=任务调用深度*2+16 , 这个不够吧, 这里是指不允许中断嵌套吗?

想叉了,知道了,penDSV切换任务, ...

允许中断嵌套,由于采用移栈的方法,类似你的 PSP+MSP,工作的栈是在 idata 中的,任务切换是发生在最低优先级的PendSV中断中,这时嵌套的中断都已经退出。

点评

是的, 我一下子没从251转过来, 在你这里, 分为"运行时栈IDATA", 和"存储栈XDATA". 你的估算实际上是"存储栈XDATA"的估算. 我一直在思考, 51核有没有不搬栈就能实现OS的办法. 看到你的栈估算,想叉了, 眼前一亮,  详情 回复 发表于 2024-4-2 12:10
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-4-2 12:10:23 | 显示全部楼层
fan*** 发表于 2024-4-2 11:50
允许中断嵌套,由于采用移栈的方法,类似你的 PSP+MSP,工作的栈是在 idata 中的,任务切换是发生在最低 ...

是的, 我一下子没从251转过来, 在你这里, 分为"运行时栈IDATA", 和"存储栈XDATA".  你的估算实际上是"存储栈XDATA"的估算.

我一直在思考, 51核有没有不搬栈就能实现OS的办法.
看到你的栈估算,想叉了, 眼前一亮,  如果一个任务只用30Byte, 那等于不用搬家也能做8个任务. 后来一想到中断, 瞬间就没脾气了

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:59 , Processed in 0.208450 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表