找回密码
 立即注册
楼主: Cos***

RTOS临界区中(仅指关闭总中断的方法),用户是否可以任务切换的初步思考

[复制链接]
  • TA的每日心情
    奋斗
    昨天 13:03
  • 签到天数: 176 天

    [LV.7]常住居民III

    5

    主题

    581

    回帖

    2383

    积分

    荣誉版主

    积分
    2383
     楼主| 发表于 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个字节以上,具体得实测+计算。

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

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    5

    主题

    92

    回帖

    415

    积分

    中级会员

    积分
    415
    发表于 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_ATTRIBUTE  interrupt 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 - 任务管理器 中的 “RAM” 项 https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1807&extra=page%3D1&page=17  详情 回复 发表于 2023-12-29 20:38
    CosyOS - 任务栈模式 CosyOS把栈的处理方式称之为任务栈模式,共分为三种,MSP模式、PSP模式、MSP+PSP模式。 1、对于51来说,CosyOS采用了搬栈这一传统方案,也就是MSP模式。 2、对于Arm来说,CosyOS所采用的方法当  详情 回复 发表于 2023-12-29 20:16
    等我给你介绍一下任务栈模式  发表于 2023-12-29 20:08
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 13:03
  • 签到天数: 176 天

    [LV.7]常住居民III

    5

    主题

    581

    回帖

    2383

    积分

    荣誉版主

    积分
    2383
     楼主| 发表于 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的内存有限,既要节约着用还不要栈溢出就得用点策略了。
    任务栈重分配机制的意义就在于此。
    但重点还是说,任务栈重分配机制是做为一种补救手段,不建议用户过分依赖。
    开发调试时,还是要配置够用的任务栈,保证测试阶段不会溢出(不会发生重分配)。
    任务栈重分配次数多了会导致内存碎片,如果过分依赖的话,反而会导致内存更加不够用了。
    任务栈重分配机制,就是为了当 “万一哪一天任务栈溢出了呢?”  能够满血复活。




    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 13:03
  • 签到天数: 176 天

    [LV.7]常住居民III

    5

    主题

    581

    回帖

    2383

    积分

    荣誉版主

    积分
    2383
     楼主| 发表于 2023-12-29 20:38:19 | 显示全部楼层
    13918210822 发表于 2023-12-29 20:02
    1、对于 CosyOS 来说,SysTick 和 PendSV 是做为系统专用中断,在进入任务临界区时,会关闭这两个中断, ...

    你可以再看一下,
    CosyOS - 任务管理器 中的 “RAM” 项
    https://www.stcaimcu.com/forum.p ... age%3D1&page=17
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    5

    主题

    92

    回帖

    415

    积分

    中级会员

    积分
    415
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

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

    我是个退休多年的老头了
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    5

    主题

    92

    回帖

    415

    积分

    中级会员

    积分
    415
    发表于 2023-12-29 21:42:36 | 显示全部楼层
    “RISC-V的作者David Patterson 在加州大学伯克利分校担任计算机科学教授 40 年后于 2016 年退休,随后加入 Google 担任杰出工程师(distinguished engineer, Google 的职位)。”
    最近这几年RISCV火,好像他也在继续站台。

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

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

    使用道具 举报

    该用户从未签到

    5

    主题

    92

    回帖

    415

    积分

    中级会员

    积分
    415
    发表于 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


    感谢你的耐心指导

    点评

    8k的edata,10几个任务,PSP模式,一般来说内存是能够用的。 可以把不关键的、占用内存多的变量、数组等放到xdata。  详情 回复 发表于 2023-12-29 22:27
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 13:03
  • 签到天数: 176 天

    [LV.7]常住居民III

    5

    主题

    581

    回帖

    2383

    积分

    荣誉版主

    积分
    2383
     楼主| 发表于 2023-12-29 22:27:14 | 显示全部楼层
    13918210822 发表于 2023-12-29 21:49
    感谢你的指导
    我要去看看代码,才能知道PSP到底是啥,我倾向于尽可能少“搬移”
    一次调用才入栈几个字节 ...

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

    点评

    好的, 我去学习下代码再请教。谢谢  发表于 2023-12-29 22:59
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9556

    回帖

    1万

    积分

    管理员

    积分
    14035
    发表于 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

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-21 09:59 , Processed in 0.068561 second(s), 63 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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