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

RTOS 教学视频回放:全局不关总中断的CosyOS for STC

 火... [复制链接]

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
发表于 2023-8-6 00:07:05 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-6 00:10 编辑

抢占式OS。需要用户单独处理中断函数的时候,处理不同的USING比较麻烦。
当然是有提升效率。也就16条指令。16MHz主频的话1us。32MHz主频0.5us,对于1T的STC 51单片机提升零点几us用处不是很大。
对于12T运行的,提升就很大了。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9291

回帖

1万

积分

管理员

积分
14057
发表于 2023-8-6 07:54:10 | 显示全部楼层
新设计可以不考虑 12T 的 STC89C52RC,
现在的主流是 1T的 STC8H8K64U,和32位8051【STC32G12K128,STC32G8K64】
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    487

    回帖

    2110

    积分

    荣誉版主

    积分
    2110
     楼主| 发表于 2023-8-6 12:40:58 | 显示全部楼层
    的确,不使用using优点更为突出,不用就不会出错,又何必自找麻烦呢?
    所以,如非必要还是不用为好。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    62

    回帖

    300

    积分

    中级会员

    积分
    300
    发表于 2023-8-8 05:59:23 | 显示全部楼层
    神农鼎 发表于 2023-5-5 15:31
    《STC32位8051原理及国产CosyOS应用》
    ===大学本科教材

    神农鼎是老姚吧,说话一贯的公司本位
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    487

    回帖

    2110

    积分

    荣誉版主

    积分
    2110
     楼主| 发表于 2023-8-8 18:58:55 | 显示全部楼层
    本帖最后由 CosyOS 于 2023-8-9 06:43 编辑

    CosyOS 最新版 V3.3.4-beta 发布!

    版本更新记录

    V3.3.1-beta
    取消了报警信息:rts(任务栈重分配发生),因为任务栈重分配机制被定义为一种标准功能、常规手段。

    V3.3.2-beta
    调整了互斥信号量,使其均支持递归,最大嵌套深度:255。
    也就是说,从V3.3.2-beta版开始,互斥信号量就是递归互斥信号量。
    释放互斥信号量,由返回结果调整为返回错误码。
    优化并调整了系统配置文件和MCU配置文件。

    V3.3.3-beta
    新增服务:“设置延时”、“清除延时”,支持在任务、滴答、中断中调用。
    设置延时:设置指定任务的阻塞延时时间,前提是该任务当前为阻塞延时状态。
    清除延时:清除指定任务的阻塞延时状态,并使其就绪。

    V3.3.4-beta
    1、中断中释放/上锁二值信号量,调整为中断异步服务,原有的直接写true/false的方式,会有机会与uWaitBin、uTakeBin、tTakeBin等形成冲突访问。
    2、任务超时服务的再次进入临界区,由PendSV中再次进入调整为服务函数中再次进入。
    3、创建飞信,增加了volatile。
    4、优化并调整了任务调度并修复了一个重要漏洞。
    5、删除了MCUCFG_80251.h、MCUCFG_cmx.h中,mEvery_Monitor中的无效代码。


    CosyOS最新版下载(内核版本 V3.3.4-beta,附带所有说明文档):
    cosyos-master.zip (824.17 KB, 下载次数: 63)


    说明文档也做了必要的更新,尤其是《开发流程.md》中,部分视图用红色方框标注了重点。



    另外,再补充说明一下,在 Keil C51、C251下编译时,优化级别应如何选择?

    Keil C51
    可选级别:4~8级
    推荐级别:8级(default)

    CosyOS支持高等级优化,您完全可以选择8级(default),speed偏向于代码执行效率,size偏向于减少代码量。
    最低不能低于4级(必须启用寄存器变量优化),最高不能高于8级。即使代码放不下,您也不能把优化级别
    设置为9级或以上,可通过删减代码或增大flash来解决。

    Keil C251
    可选级别:3~7级
    推荐级别:7级(default)

    CosyOS支持高等级优化,您完全可以选择7级(default),speed偏向于代码执行效率,size偏向于减少代码量。
    最低不能低于3级(必须启用寄存器变量优化),最高不能高于7级。即使代码放不下,您也不能把优化级别
    设置为8级或以上,可通过删减代码或增大flash来解决。

    “以前的说明中,C251下优化级别最高可为8级的描述是错误的,特此更正”。







    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    487

    回帖

    2110

    积分

    荣誉版主

    积分
    2110
     楼主| 发表于 2023-8-12 14:11:02 | 显示全部楼层
    本帖最后由 CosyOS 于 2023-8-12 14:14 编辑

    CosyOS - 专业版测试程序V2.0.0 发布

    本测试程序采用的是CosyOS最新版 V3.3.5-beta。
    本测试程序是通过上一版测试程序的测试经验,全新规划设计并开发的,

    专门用于测试CosyOS的各项系统服务在极限条件下运行的稳定性、可靠性及性能。
    极限条件是指除了系统服务以外,仅执行一些必要的操作,如计数、数据校验等。
    现在的版本仅包含对任务中调用服务的测试,未来会增加对中断中调用服务的测试。

    相较于上一版本,各测试项目已分立为各自独立的C文件,层次和结构更为清晰,便于读者理解。
    20230812_01.png
    test.h:在此选择测试项目
    test_ressus.c:恢复挂起测试
    test_settpl.c:设置任务优先级测试
    test_bin.c:二值信号量测试
    test_sem.c:计数信号量测试
    test_mut.c:互斥信号量测试
    test_dm.c:私信测试
    test_fetion.c:飞信测试
    test_mailbox.c:消息邮箱测试
    test_queue.c:消息队列测试
    test_group.c:事件标志组测试

    可在test.h中选择不同的测试项目进行测试:
    20230812_02.png

    有些测试项,在C文件中还有更为详细的测试定义,如消息队列测试:
    20230812_03.png

    飞信测试以及私信、邮箱、队列的标准测试,均采用高可靠性的循环数据校验,来验证通信数据是否正常。

    用户任务:
    无论选择哪个测试项目,共有三个用户任务:TASK_0、TASK_A、TASK_B。
    TASK_0:每间隔1秒钟,串口printf输出计数。
    TASK_A、TASK_B:在不同的测试项目下,均可实现这两个任务的循环合作并计数。

    串口printf输出的内容:
    TASK_A | TASK_B | TASK_A - TASK_B
    依次为TASK_A的计数、TASK_B的计数、TASK_A的计数减去TASK_B的计数。
    TASK_A - TASK_B:正常运行时可为 -1、0、1,如果出现其它数值证明任务运行异常。

    任务管理器:
    任务管理器已配置好,默认未启用,一般也不建议启用。
    当测试项目为互斥信号量时,可启用任务管理器,监控TASK_B的优先级变化,
    TASK_B会时常继承TASK_A的优先级而后再恢复原优先级。

    STC8的测试程序:
    printf输出、任务管理器输出,均采用UART1_4,波特率为115200。相关配置均在init_hook.c中,可自行调整。

    STC32G的测试程序:
    printf输出采用UART4,UART4_SW(UART4_SW_P02_P03),波特率为115200。
    任务管理器输出采用UART1,UART1_SW(UART1_SW_P16_P17),波特率为115200。

    CosyOS-STC8-TEST-V2.0.0-20230810下载:

    CosyOS-STC8-TEST-V2.0.0-20230810.zip (329.02 KB, 下载次数: 47)


    CosyOS-STC32G-TEST-V2.0.0-20230810下载:

    CosyOS-STC32G-TEST-V2.0.0-20230810.zip (4.13 MB, 下载次数: 43)



    本测试程序不仅可用于CosyOS的测试,更是入门CosyOS的捷径,可使读者快速掌握CosyOS的开发流程及各项服务的应用。






    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-11-29 20:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    3

    回帖

    37

    积分

    新手上路

    积分
    37
    发表于 2023-8-21 16:15:06 | 显示全部楼层
    请问有C51的系统版本示例代码吗,或者如果要移植CosyOS需要怎能操作呢?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    487

    回帖

    2110

    积分

    荣誉版主

    积分
    2110
     楼主| 发表于 2023-8-21 18:07:12 来自手机 | 显示全部楼层
    这个测试程序当前是比较好的示例代码了,暂时没有更好的了。
    如果一个使用了RTOS开发的项目替换为CosyOS,我认为大概可分为三步:
    1:先看一下《开发流程.md》,熟悉并了解整个开发流程。
    2:看一遍示例代码,把整个开发流程再捋一遍。
    3:创建一个新工程,把原项目中的任务和函数拷贝过来,然后参照API参考手册和示例代码重新调整各API。

    CosyOS最新版为V3.3.5-beta,请下载最新版试用。

    由于CosyOS有很多创新设计,相较于传统RTOS还是有明显区别,最好还是多熟悉一下,可参考《技术要点.md》和相关帖子。



    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    61

    主题

    626

    回帖

    1万

    积分

    荣誉版主

    积分
    10830
    发表于 2023-8-27 13:36:50 | 显示全部楼层
    (1)正在与熊仔讨论临界区保护嵌套的问题,也就是说如果采用关闭总中断来进行临界区保护时,临界区保护能不能嵌套使用的问题。

    (2)楼主的“开创性的实现了所有内核全局不关总中断(零中断延迟),保证了中断中用户代码的实时性”,我理解也就是在进行临界区保护时不用关闭总中断,只是关闭RTOS系统任务切换和功能,这样就避免了用户中断被关闭,影响用户程序实时响应的能力。
    (3)临界区保护嵌套的指标有两个,一个是能不能,二是能嵌套几层,比如用字节变量做嵌套计数,可以嵌套255层。我初看楼主的CosyOS的临界区保护是允许嵌套的,也间接提过嵌套层数,建议楼主也就专门为大家介绍一下,当然最好与移植的uC-OS2对比一下,这样有助于大家对两种RTOS的理解。
    (4)据我了解,开源的FreeRTOS、RT-Thread、uC/OS-III以及对uC/OS-II稍加改造,都提供了另一种“不关闭总中断就可以实现临界区保护”的标准方法。
    (5)我觉得楼主的“开创性”如果是指在主流的RTOS领域,那么就应该将CosyOS的方法与上面几种RTOS进行比较,说明自己的开创性在哪里,避免让人产生主流RTOS在进行临界区保护都必须关闭总中断,实时性能差的错觉。
    (6)我建议楼主对开创性加一些限制词,比如开创性的在STC单片机上实现了所有内核全局不关总中断(零中断延迟),保证了中断中用户代码的实时性”,因为在80x51架构的单片机上已经被人移植过主流的具有临界区保护不关全局中断的RTOS了。例如STC uC/OS-II资深专家移植版使用了定时器0的不可屏蔽中断模式,在进行“OSTimeTick”涉及到时间节拍处理过程时,就已经使用了关闭和打开TR0来进行临界区保护了(原因是该过程要在8位CPU上对4字节时间变量进行处理).


    OSTickISR:                
            USING 0                ;工作寄存器0
            CLR  EA                ;关中断,防止中断嵌套
            PUSHALL                ;现场保护
            LCALL _?OSIntEnter        ;通知内核进入中断              
            CLR  TR0         
                   LCALL _?OSTimeTick        ;调用中断服务子程序
            SETB TR0
            LCALL _?OSIntExit        ;通知内核退出中断
            POPALL                ;恢复现场   
            SETB EA         ;开中断   
            RETI


    (7)下面是STC8 uC/OS-II网上流行的移植版和熊仔uC-OS2移植版中的中断任务切换函数:
    void  OSIntExit (void) large reentrant
    {
    #if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
        OS_CPU_SR  cpu_sr = 0u;
    #endif
        if (OSRunning == OS_TRUE) {

            OS_ENTER_CRITICAL();
            if (OSIntNesting > 0u) {                           /* Prevent OSIntNesting from wrapping       */
                OSIntNesting--;
            }
            if (OSIntNesting == 0u) {                          /* Reschedule only if all ISRs complete ... */
                if (OSLockNesting == 0u) {                     /* ... and not locked.                      */
                    OS_SchedNew();
                    OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                    if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
    #if OS_TASK_PROFILE_EN > 0u
                        OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
    #endif
                        OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */
                        OSIntCtxSw();                          /* Perform interrupt level ctx switch       */
                    }
                }
            }
            OS_EXIT_CRITICAL();
        }
    }
    其中要进行任务调度的条件有一条为判断“任务调度锁”的语句:    “if (OSLockNesting == 0u) { ”。因此在这两个uC/OS-II移植版中只需要写一行加锁语句“OSLockNesting ++;”就可以实现进入临界区保护而无需关闭任何中断,同样只需要写一行解锁语句“OSLockNesting --;”就可以实现退出临界区保护而无需打开任何中断,而且这种临界区保护方法是可以嵌套的。
    (7)我在熊仔的帖子里提到过,“加锁和解锁”是操作系统原理中进行临界区/核心区以及临界过程/核心过程保护的基本方法,无需一定要关闭中断(谁见过Windows/Linux系统关闭过中断?),所以所有主流的RTOS都提供了这种不关闭任何中断的临界区保护方法。所以对网络上那些临界区保护影响实时性的观点要加一个定语:对于那些采用关闭总中断的临界区保护方法。
    (8)关于在单片机RTOS上的这两种临界区保护方法的理论和优缺点,有机会我单独开帖子介绍。



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    487

    回帖

    2110

    积分

    荣誉版主

    积分
    2110
     楼主| 发表于 2023-8-27 17:44:01 | 显示全部楼层
    感谢杨老师对操作系统临界区的精彩讲解并对CosyOS的相关描述提出异议,我也从中受益匪浅并虚心接受建议,并在日后对相关描述做出适当调整。
    稍后,我将介绍一下“CosyOS的全局不关总中断”的技术特征。

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-2 17:53 , Processed in 0.125491 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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