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

uC/OS-II @Ai8051U 移植版,AI8051U,32G8K64,32G12K128

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-11-6 22:00:55 | 显示全部楼层
本帖最后由 tzz1983 于 2023-11-6 22:05 编辑
Cos*** 发表于 2023-11-6 16:43
我只是简单介绍一下CosyOS对栈的处理,仅供参考,当然也欢迎大家批评指正。
我观STC官方移植的FreeRTOS-S ...

说的很到位

我有一个想法: 进入中断时,保存一下当前的堆栈指针, 然后把MSP(main函数用的那个堆栈指针)写入SP, 中断函数内的开支就只会用MSP, 退出中断时, 恢复进入中断时的堆栈指针,然后再RETI.  
如果能以这种简单方法实现, 那就是 开支小 作用大, 确实有必要了去实践一下了.
先沉淀一些时日, 过几天再动手.

动态堆栈应该没那么简单吧, 代码会增加不少, 个人理解, 重新匹配堆栈时, 切换任务的时间会不确定.

Cosyos 有很多前卫的理念, 确实是值得学习的.


点评

你的这个想法很好。 这个想法我最早就产生过,就是让251也如同arm一样,实现MSP+PSP模式,不过还是失败了。 最近我又思考了这个问题,结果仍然是实现不了。 但你可以实现,其它的RTOS也能实现,唯有CosyOS不行。 祝  详情 回复 发表于 2023-11-6 23:24
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-11-6 22:28:21 | 显示全部楼层
我还有一个想法: 就是为每个任务单独设置临界区, 各个任务相互之间没有影响,  这样的话, 可以在临界区内进阻塞,或切换任务了, 毫无顾忌.  因为进入到新的任务时, 是用新的临界区设置, 而不是一直关闭EA, 一直关闭EA导致新的任务功能受限, 如果不是有意为之,那就是犯错.
还有一个好处就是,在临界区调用外部代码时, 有时候会无意中触发了阻塞,或切换任务, 如果没有相关的支持, 则后果无法预料。

但是也很纠结, 从原则上来说, 临界区应该是对应整体的, 进入临界区后就是不能被打断, 也不能切换.
我以前是很讨厌这种花里胡哨, 不实用的东西的. 但现在为什么自己也会往这方面想呢.
放个话题出来, 大家一起来讨论一下

点评

关于临界区的问题,我先说一下我的观点,也即CosyOS的指导建议: 对于临界区的应用,要坚持“快进快出”的基本原则,耗时长的代码尽量不用临界区,能用互斥量保护的尽量不用临界区保护, 整个临界区内代码的运行时长  详情 回复 发表于 2023-11-8 13:18
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:432
  • 最近打卡:2025-05-01 16:19:56

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2023-11-6 23:24:19 | 显示全部楼层
本帖最后由 CosyOS 于 2023-11-6 23:28 编辑
tzz1*** 发表于 2023-11-6 22:00
说的很到位

我有一个想法: 进入中断时,保存一下当前的堆栈指针, 然后把MSP(main函数用的那个堆栈指针)写 ...

你的这个想法很好。
这个想法我最早就产生过,就是让251也如同arm一样,实现MSP+PSP模式,不过还是失败了。
最近我又思考了这个问题,结果仍然是实现不了。
但你可以实现,其它的RTOS也能实现,唯有CosyOS不行。
祝你早日成功!
关于临界区的问题,我也有自己的观点,不过等再沉淀一段时间再说,时间是个好东西。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:432
  • 最近打卡:2025-05-01 16:19:56

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2023-11-7 00:01:17 | 显示全部楼层
本帖最后由 CosyOS 于 2023-11-7 00:05 编辑

任务栈重分配机制是做为一种补救手段,不建议用户过分依赖。
开发调试时,还是要配置够用的任务栈,保证测试阶段不会溢出。
但正所谓没有人能够确定明天的太阳一定会升起,但实时上它总是会升起来的。
概率问题,也许你测试一年也不会碰到一次任务栈溢出,但大批量产品投入使用后不一定哪天就会碰到。
如果内存足够大,问题也好解决,但51/251的内存有限,既要节约着用还不要栈溢出就得用点策略了。
任务栈重分配机制的意义就在于此。
时间不确定又能有多不确定呢?我经常做这种测试,没见过一次由于任务栈重分配而导致的系统卡顿,不确定总比系统瘫痪要强的多。
但重点还是说,任务栈重分配机制是做为一种补救手段,不建议用户过分依赖。
开发调试时,还是要配置够用的任务栈,保证测试阶段不会溢出(不会发生重分配)。
任务栈重分配次数多了会导致内存碎片,如果过分依赖的话,反而会导致内存更加不够用了。

任务栈重分配机制,就是为了当 “万一哪一天任务栈溢出了呢?”  能够满血复活。




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:432
  • 最近打卡:2025-05-01 16:19:56

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2023-11-8 13:18:36 | 显示全部楼层
本帖最后由 CosyOS 于 2023-11-8 13:38 编辑
tzz1*** 发表于 2023-11-6 22:28
我还有一个想法: 就是为每个任务单独设置临界区, 各个任务相互之间没有影响,  这样的话, 可以在临界区内进 ...

关于临界区的问题,我先说一下我的观点,也即CosyOS的指导建议:
对于临界区的应用,要坚持“快进快出”的基本原则,耗时长的代码尽量不用临界区,能用互斥量保护的尽量不用临界区保护,

整个临界区内代码的运行时长要远小于系统滴答周期,这将促使整个系统良性的运行。
CosyOS为实现零中断延迟,把系统滴答中断放到了最低优先级,如果临界区内代码的运行时间过长,可能会延误系统滴答,使系统节拍、软件定时器等计时不准(变慢)。
我认为我的这个观点是符合现代RTOS理念的,不知大家意见如何?

关于RTOS临界区内是否应该允许任务切换,我看还是专门开一个帖子讨论为好。



点评

是的,临界区是影响OS快速响应的关键因素, 要尽量减短执行时间, 商用的OS就有最大响应时间这样一个指标。 有一些技巧可以避免过长的临界区,我见过比较经典的是,在UCOS的一段代码里, 把一个长临界区分成两个,  详情 回复 发表于 2023-11-8 13:44
回复 支持 1 反对 0

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-11-8 13:44:22 | 显示全部楼层
本帖最后由 tzz1983 于 2023-11-8 13:47 编辑
Cos*** 发表于 2023-11-8 13:18
关于临界区的问题,我先说一下我的观点,也即CosyOS的指导建议:
对于临界区的应用,要坚持“快进快出” ...

是的,临界区是影响OS快速响应的关键因素, 要尽量减短执行时间, 商用的OS就有最大响应时间这样一个指标。
有一些技巧可以避免过长的临界区,我见过比较经典的是,在UCOS的一段代码里, 把一个长临界区分成两个, 先执行一部分做好名项标识, 中途退出执行一个空函数调用(这个时间如果有中断请求就可以响应,故意这样做的), 接头又一头砸进临界区了,做没做完的事情。

一般的用法都是做好标识,独占资源后就退出临界区,千万不要直接在临界区内执行大量代码

如果数据只在任务间共享是不用进临界区的,暂停一下调度器即可

点评

的确是个好方法!  发表于 2023-11-8 13:47
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2023-12-05 19:37:53

3

主题

324

回帖

363

积分

禁止发言

积分
363
发表于 2023-11-9 12:27:48 | 显示全部楼层
请问RTOS的教程应该看哪个帖子

点评

先海选, 然后根据自己的感觉挑一个重点学习, 我本人觉得UCOSII入门不错, 网上资料比较多, 代码量不大, 功能很全, (麻雀虽小, 五脏俱全)  详情 回复 发表于 2023-11-9 13:52
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-11-9 13:52:30 | 显示全部楼层
WangC*** 发表于 2023-11-9 12:27
请问RTOS的教程应该看哪个帖子

先海选, 然后根据自己的感觉挑一个重点学习, 我本人觉得UCOSII入门不错, 网上资料比较多, 代码量不大, 功能很全, (麻雀虽小, 五脏俱全)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2023-12-05 19:37:53

3

主题

324

回帖

363

积分

禁止发言

积分
363
发表于 2023-11-9 15:49:28 | 显示全部楼层
tzz1*** 发表于 2023-11-9 13:52
先海选, 然后根据自己的感觉挑一个重点学习, 我本人觉得UCOSII入门不错, 网上资料比较多, 代码量不大, 功 ...

谢谢
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-11-15 21:35:10 | 显示全部楼层
本帖最后由 tzz1983 于 2023-11-15 21:38 编辑

UCOSII - 251内核实现MSP(中断专用堆栈)  代码已实现
介绍:
STC32G12K128 内含4K EDATA, 植入UCOSII后, 去掉1500字节左右固定开销外, 实际剩下2500字节可用.
在没有MSP(中断专用堆栈)前, 中断发生在哪个任务, 即沿用哪个任务的堆栈. 实际上中断用栈量很大. 举例说明: 如果中断内调用函数, 就是寄存器全入栈, 大约38字节, 4个优先级最多嵌套3次 38*3=114字节.
使用MSP(中断专用堆栈)后, 每个任务可节省 114字节, 假设8个任务+2个系统任务(空闲, 统计),  则节省114*10=1140字节,  这都差不多是2500总数的一半了, 说性能翻倍也不过份.

代码已做完, 正在整理中, 估计明天会发出.

先给两张实测数据图:  更直观的体现出用MSP功能以后, 单个任务节省的用栈量!
捕获1.PNG

捕获2.PNG


这是由UCOSII内置统计任务产生的数据, 由prinft()函数打印到CDC串口.

测试条件: 人为故意产生4个中断,  嵌套3级, 每个中断代码都简单的调用一个空函数, 以演示寄存器全入栈的极端情况.
实测数据: 单个任务相差179-72=107字节, 与理论计算值相差不大.  (当然了, 实际上代码会变简单或复杂, 结果都会不一样的, 这里只做一个参考, 而不是绝对)

这次代码改动比较大, 正在整理中, 先发个预热估计明天发代码


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:06 , Processed in 0.130204 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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