CosyOS 发表于 2023-12-29 19:13:16

本帖最后由 CosyOS 于 2023-12-29 19:47 编辑

13918210822 发表于 2023-12-29 18:12
我提一些实际需求, 请教Cosy老师如何从RTOS角度来支持会比较好
以下需求考虑适配STC32F或资源更多的平台( ...
1、对于 CosyOS 来说,SysTick 和 PendSV 是做为系统专用中断,在进入任务临界区时,会关闭这两个中断,也不允许用户私自操作这两个中断。
2、CosyOS 会在系统初始化时自动开启总中断,而后不会再操作总中断和任何用户中断。
3、CosyOS 也提供了全局临界区给用户(进入全局临界区时会关闭总中断,但CosyOS内核中从来不会关闭总中断)。
4、只要用户中断不是最低优先级,就可实现零中断延迟。其实,即使是最低优先级,也是零中断延迟的,只不过是上述两个系统中断可能会与其抢占。
5、CosyOS 提供了各种常用线程通信工具给用户,如 飞信、私信、邮箱、队列、标志组等。
6、CosyOS 的任务创建模式分为静态、平衡、动态,三种方式,其中,平衡和动态方式,任务栈均为动态分配,并适配有任务栈重分配机制,可抵御任务栈溢出的风险。但这种机制仅限于51、251的MSP栈模式可用。对于平衡和动态方式,当任务被删除时,任务栈内存会被回收(free)。
综上所述,CosyOS 应该可以满足你的需求。
但需要注意,
1、flash是否够用,对于251来说,Keil编译器的优化级别最高可为7级size。
2、对于80251,CosyOS提供有两种任务栈模式(MSP模式、PSP模式),如果内存较大,可考虑PSP模式提高任务切换效率,否则只能用MSP模式以节约内存。
   MSP模式时,一般每个任务栈几十个字节即可够用;PSP模式时,如果中断优先级4级都用的话,每个任务栈一般至少也得160个字节以上,具体得实测+计算。

若有其它疑问,可以提出来,我会尽可能的快速解答。也可多看下帖子,会有收获的。

13918210822 发表于 2023-12-29 20:02:15

CosyOS 发表于 2023-12-29 19:13
1、对于 CosyOS 来说,SysTick 和 PendSV 是做为系统专用中断,在进入任务临界区时,会关闭这两个中断,也 ...

1、对于 CosyOS 来说,SysTick 和 PendSV 是做为系统专用中断,在进入任务临界区时,会关闭这两个中断,也不允许用户私自操作这两个中断。
mcucfg_80251.h内的默认定义:
#define MCUCFG_SYSTICK_ATTRIBUTEinterrupt 1 MCUCFG_USING
#define MCUCFG_PENDSV_ATTRIBUTE   interrupt MCUCFG_PENDSVIRQ MCUCFG_USING
对应中断 0:INT0, 1:Timer0, 这个我其他部分功能可以不用。 OK

2、CosyOS 会在系统初始化时自动开启总中断,而后不会再操作总中断和任何用户中断。
就是这样最好, OK

3、CosyOS 也提供了全局临界区给用户(进入全局临界区时会关闭总中断,但CosyOS内核中从来不会关闭总中断)。
全局临界区我宁可用FIFO来替代,基于FIFO的消息/命令 队列,可以替代大部分临界区
而标志位,或者标志bdata可以不用管是否全局重入--我的理解
只要CosyOS不替我关中断,就是一个好同志:) OK


4、只要用户中断不是最低优先级,就可实现零中断延迟。
那我的理解就这样处理:操作系统用0级中断, 用户ISR用2和3。1留着万一有啥用

5、CosyOS 提供了各种常用线程通信工具给用户,如 飞信、私信、邮箱、队列、标志组等。
这个要去学习一下, 这个可能使用了操作系统才有的福利

6、CosyOS 的任务创建模式分为静态、平衡、动态,三种方式,其中,平衡和动态方式,任务栈均为动态分配,并适配有任务栈重分配机制,可抵御任务栈溢出的风险。但这种机制仅限于51、251的MSP栈模式可用。对于平衡和动态方式,当任务被删除时,任务栈内存会被回收(free)。
这部分代码似乎不小, 要好好理解下, 目前不太理解MSP栈的概念,似乎是从ARM M?系列中延伸过来的, 251的硬件并没有区分MSP或者其他栈模式,因为只有一种SP?
如果有空帮忙推荐下文档及代码段,让我进一步学习理解。

谢谢Cosy老师的回复。
综上所述,CosyOS 应该可以满足你的需求。

CosyOS 发表于 2023-12-29 20:16:53

13918210822 发表于 2023-12-29 20:02
1、对于 CosyOS 来说,SysTick 和 PendSV 是做为系统专用中断,在进入任务临界区时,会关闭这两个中断, ...

CosyOS - 任务栈模式

CosyOS把栈的处理方式称之为任务栈模式,共分为三种,MSP模式、PSP模式、MSP+PSP模式。
1、对于51来说,CosyOS采用了搬栈这一传统方案,也就是MSP模式。
2、对于Arm来说,CosyOS所采用的方法当然是主流的双栈指针了,也就是MSP+PSP模式。
3、对于251来说,CosyOS支持MSP模式、PSP模式,这两种模式供用户选择。
    (1)MSP模式,当然还是搬栈;
    (2)PSP模式,每个任务的任务栈都是主栈,当哪个任务运行时,哪个任务的任务栈就是当前的主栈。

PSP模式与MSP+PSP模式的异同
PSP模式,中断入栈也入任务栈,所以需要更大的任务栈;
MSP+PSP模式,中断时为Handler模式,入栈入的是主栈;任务时为Thread模式,入栈入的是当前任务的任务栈。
可以看出,PSP模式相比MSP+PSP模式,需要更大的任务栈(保存中断入栈),也就是需要更大的edata内存,然而这也是没有办法的事情。

MSP模式的优势
凡事都是辩证的,有一利必有一弊。
MSP模式虽然在任务切换时保存现场/恢复现场的效率低下,但只要主栈和内存池足够大,就可确保所有任务栈永不溢出,当然,前提是任务栈得是动态的(CosyOS将自动启用任务栈重分配机制,以抵御任务栈溢出的风险)。
这一点是PSP模式、MSP+PSP模式所不具备的。
PSP模式、MSP+PSP模式,一旦任务栈溢出,既成事实,数据覆盖可能已经发生,无法挽回。

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




CosyOS 发表于 2023-12-29 20:38:19

13918210822 发表于 2023-12-29 20:02
1、对于 CosyOS 来说,SysTick 和 PendSV 是做为系统专用中断,在进入任务临界区时,会关闭这两个中断, ...

你可以再看一下,
CosyOS - 任务管理器 中的 “RAM” 项
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1807&extra=page%3D1&page=17

13918210822 发表于 2023-12-29 21:02:28

杨为民 发表于 2023-12-29 18:09
(1)这是我研发的RTOS,RTOS的每一行代码都是我写的。
https://www.stcaimcu.com/forum.php?mod=viewt ...

你不但写了CC, 还写了AS, 扩展了汇编,
我觉得你的星辰大海其实在扩展体系结构,当初RISCV就是几个老师头脑一热搞出来的

STC应该也是需要新内核去贴近AI。
国内有复旦在搞,也是经费多出货少。

你们大学搞搞架构创新,更符合时代责任。

杨为民 发表于 2023-12-29 21:19:37

13918210822 发表于 2023-12-29 21:02
你不但写了CC, 还写了AS, 扩展了汇编,
我觉得你的星辰大海其实在扩展体系结构,当初RISCV就是几个老师 ...

我是个退休多年的老头了

13918210822 发表于 2023-12-29 21:42:36

“RISC-V的作者David Patterson 在加州大学伯克利分校担任计算机科学教授 40 年后于 2016 年退休,随后加入 Google 担任杰出工程师(distinguished engineer, Google 的职位)。”
最近这几年RISCV火,好像他也在继续站台。

国内这部分起步晚,芯片工艺其实国内也够用,但是指令集和数字实现和工具链这部分投入有些晚。最早龙芯也是拿来主义,后劲不足。
我们做产品的更远离了底层创新。

要么是大学搞,要么是独立的公司搞(国内似乎还没有),对于指令集基本都是拿来主义,主要是投入周期长。

13918210822 发表于 2023-12-29 21:49:24

CosyOS 发表于 2023-12-29 20:38
你可以再看一下,
CosyOS - 任务管理器 中的 “RAM” 项
https://www.stcaimcu.com/forum.php?mod=viewth ...

感谢你的指导
我要去看看代码,才能知道PSP到底是啥,我倾向于尽可能少“搬移”
一次调用才入栈几个字节。一次任务切换到拷贝上百字节,似乎有些奢侈。

毕竟stc32f的8k edata也似乎能支持10来个任务折腾

#if MCUCFG_TASKSTACK_MODE == __PSP__

// <o> 任务管理器的任务栈大小(Bytes)
// <i> 任务管理器的任务栈大小,单位为字节数
#define MCUCFG_STACKSIZE_TASKMGR      192

// <o> 系统调试任务的任务栈大小(Bytes)
// <i> 系统调试任务的任务栈大小,单位为字节数
#define MCUCFG_STACKSIZE_DEBUGGER       128

// <o> 系统启动任务的任务栈大小(Bytes)
// <i> 系统启动任务的任务栈大小,单位为字节数
#define MCUCFG_STACKSIZE_STARTER      128

// <o> 系统空闲任务的任务栈大小(Bytes)
// <i> 系统空闲任务的任务栈大小,单位为字节数
#define MCUCFG_STACKSIZE_SYSIDLE      128

#endif


感谢你的耐心指导

CosyOS 发表于 2023-12-29 22:27:14

13918210822 发表于 2023-12-29 21:49
感谢你的指导
我要去看看代码,才能知道PSP到底是啥,我倾向于尽可能少“搬移”
一次调用才入栈几个字节 ...

8k的edata,10几个任务,PSP模式,一般来说内存是能够用的。
可以把不关键的、占用内存多的变量、数组等放到xdata。

神农鼎 发表于 2023-12-30 08:49:09

我只关心:
STC32G8K64,2K EDATA, 6K XDATA,   跑 RTOS 顺畅 ?
STC8051H,      2K EDATA, 32K XDATA, 跑 RTOS 顺畅 ?
===管脚兼容 STC89C52RC/STC12C5A60S2, 跑 RTOS 顺畅

估计5年内,STC89C52系列的用户会全面进入 STC8051H-32位8051新时代
51的夏天已然来临

   TF@100M
STC8051H
34K64-LQFP44
yyww*****.A
==================================
你可以当32位8051用
也可以当8051编译:【KEIL C51, IAR C++, SDCC】
===照样使用: 硬件MDU32 + 硬件三角函数/浮点-TFPU

页: 1 2 [3] 4
查看完整版本: RTOS临界区中(仅指关闭总中断的方法),用户是否可以任务切换的初步思考