找回密码
 立即注册
楼主: 杨为民

单片机RTOS实时响应时间排行榜重大宣布:STC32G12K128单片机 全面碾压 STM32F103C

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-5-11 16:29:08 | 显示全部楼层
tzz1*** 发表于 2024-5-11 15:37
可以这样认为,其实大家都知道怎么回事。
如果说,在高优中断里不调用OS服务,基本上都是零改就能实现的 ...

(1)回答正确,你最近给出的作品 uC/OS-II@STC8H确实是一个“能在高优先级零延迟中断”中调用系统服务的RTOS。祝贺你的这个作品成为本论坛“零中断延迟”RTOS的第二匹黑马
(2)这是你的测试程序中的测试中断ISR:
void Timer3_ISR_Handler (void) interrupt 19{
        T4T3M &= ~0x08;     //定时器3停止计数
    IE2 &= ~0X20;       //关闭定时器3中断   
    P00 = ~P00;   
    P01 = 1;            //开始唤醒任务
    OSTaskResume_FROM_ISR(APP_CFG_START_TASK_PRIO);
}
其中这个在中断里的语句“OSTaskResume_FROM_ISR(APP_CFG_START_TASK_PRIO);”就是调用系统服务功能实现唤醒最高优先级的任务的,这就是赤裸裸的“中断里”调用呀。

(3)为了实现功能,你特地在uC/OS-II的系统内核文件“os_task.c”里新增加了这个在中断内使用的系统服务
INT8U  OSTaskResume_FROM_ISR (INT8U prio)FunctionProperties
{
    OS_TCB    *ptcb;
#if OS_CRITICAL_METHOD == 3u                                  /* Storage for CPU status register       */
    OS_CPU_SR  cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0u
    if (prio >= OS_LOWEST_PRIO) {                             /* Make sure task priority is valid      */
        return (OS_ERR_PRIO_INVALID);
    }
#endif
    OS_ENTER_CRITICAL();
    ptcb = OSTCBPrioTbl[prio];
    if (ptcb == (OS_TCB *)0) {                                /* Task to suspend must exist            */
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_RESUME_PRIO);
    }
    if (ptcb == OS_TCB_RESERVED) {                            /* See if assigned to Mutex              */
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_NOT_EXIST);
    }
    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended                */
        ptcb->OSTCBStat &= (INT8U)~(INT8U)OS_STAT_SUSPEND;    /* Remove suspension                     */
        if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) == OS_STAT_RDY) { /* See if task is now ready         */
            if (ptcb->OSTCBDly == 0u) {
                OSRdyGrp               |= ptcb->OSTCBBitY;    /* Yes, Make task ready to run           */
                OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                OS_TRACE_TASK_READY(ptcb);
                OS_EXIT_CRITICAL();
                if (OSRunning == OS_TRUE) {
                    OS_TRACE_TASK_RESUME(ptcb);
                    OS_Sched_FROM_ISR();                      /* Find new highest priority task        */
                }
            } else {
                OS_EXIT_CRITICAL();
            }
        } else {                                              /* Must be pending on event              */
            OS_EXIT_CRITICAL();
        }
        return (OS_ERR_NONE);
    }
    OS_EXIT_CRITICAL();
    return (OS_ERR_TASK_NOT_SUSPENDED);
}
其中调用的是中断内的任务切换函数“OS_Sched_FROM_ISR(); ”,这就是赤裸裸的从内核开始了“在中断内进行系统功能的调用”的设计

(4)并且,你增加的不是一个,而是新增加了一组供中断内调用的常用的系统功能服务
* 针对所有需要中断调用并且会引起任务切换的OS服务,移植版本提供了额外的中断调用版本,以下是新增中断服务的函数.
INT8U  OSTaskSuspend_FROM_ISR (INT8U prio)FunctionProperties;
INT8U  OSTaskResume_FROM_ISR (INT8U prio)FunctionProperties;
INT8U  OSTaskChangePrio_FROM_ISR (INT8U  oldprio,INT8U  newprio)FunctionProperties;
INT8U  OSTimeDlyResume_FROM_ISR (INT8U prio)FunctionProperties;
INT8U  OSSemPendAbort_FROM_ISR (OS_EVENT *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U  OSSemPost_FROM_ISR (OS_EVENT *pevent)FunctionProperties;
OS_FLAGS  OSFlagPost_FROM_ISR (OS_FLAG_GRP  *pgrp, OS_FLAGS flags, INT8U opt, INT8U *perr)FunctionProperties;
INT8U  OSMboxPostOpt_FROM_ISR (OS_EVENT  *pevent, void *pmsg, INT8U opt)FunctionProperties;
INT8U  OSMboxPost_FROM_ISR (OS_EVENT  *pevent, void *pmsg)FunctionProperties;
INT8U  OSMboxPendAbort_FROM_ISR (OS_EVENT  *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U  OSQPendAbort_FROM_ISR (OS_EVENT  *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U  OSQPost_FROM_ISR (OS_EVENT  *pevent, void *pmsg)FunctionProperties;
INT8U  OSQPostFront_FROM_ISR (OS_EVENT  *pevent, void *pmsg)FunctionProperties;
INT8U  OSQPostOpt_FROM_ISR (OS_EVENT  *pevent, void *pmsg, INT8U opt)FunctionProperties;

你的主贴的19楼介绍自己用的 uC/OS-II@STC8H, 51核移植版本
https://www.stcaimcu.com/forum.p ... page%3D1&page=1


(5)经过这些操作,你已经成功地将uC/OS-II移植到STC8H单片机上(本不具备RTX4/5需要的片上中断条件),必将会成为一个比CosyOS-II还强的“零中断延迟”的STC单片机RTOS
强就强在uC/OS-II是一个主流的单片机RTOS可以移植很多开源库在上面,比如本尊在本论坛已经移植的“uGFX”图形接口和“znFAT”文件系统,这些是CosyOS-II一时半会难以做到的。


点评

杨老师,我补充一下,不是 “新增加了一组供中断内调用的常用的系统功能服务”, 是 所有需要中断调用并且会引起任务切换的OS服务. 这个移植版本不存在功能裁剪,所有uC/OS-II的功能都可用,并且针对51核IDATA的  详情 回复 发表于 2024-5-11 16:37
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-5-11 16:37:11 | 显示全部楼层
杨*** 发表于 2024-5-11 16:29
(1)回答正确,你最近给出的作品 uC/OS-II@STC8H确实是一个“能在高优先级零延迟中断”中调用系统服务的 ...

杨老师,我补充一下,不是 “新增加了一组供中断内调用的常用的系统功能服务”,

所有需要中断调用并且会引起任务切换的OS服务.

这个移植版本不存在功能裁剪,所有uC/OS-II的功能都可用,并且针对51核IDATA的栈还增加了一个检查功能。



点评

所以要你本尊来介绍呀  发表于 2024-5-11 16:46
回复 支持 反对

使用道具 举报 送花

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

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-5-11 16:49:51 | 显示全部楼层
本帖最后由 fanxsp 于 2024-5-11 16:55 编辑
tzz1*** 发表于 2024-5-11 16:37
杨老师,我补充一下,不是 “新增加了一组供中断内调用的常用的系统功能服务”,

是 所有需要中断调用 ...

你的堆栈检查,是用什么方法?我采用最简单的,就是把堆栈数据通过回调函数处理,回调函数可以直接把堆栈数据发往串口,我们自己直接分析堆栈数据,连续为0的区域,就是空余的堆栈空间。
如果是仿真运行,就停止运行,然后直接查看堆栈数据。

点评

和我的方法基本一致  详情 回复 发表于 2024-5-11 16:55
我把代码贴出来吧,省得你下载了 /*-----------------------------------------------------------* * idata公共运行栈检查, 检查方法是查找栈中连续0最大的块 * 此函数在统计任务中自动调用,也可主动调用. 没有返  详情 回复 发表于 2024-5-11 16:54
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-5-11 16:54:39 | 显示全部楼层
fan*** 发表于 2024-5-11 16:49
你的堆栈检查,是用什么方法?我采用最简单的,就是把堆栈数据通过回调函数处理,回调函数可以直接把堆栈 ...

我把代码贴出来吧,省得你下载了

/*-----------------------------------------------------------*
* idata公共运行栈检查, 检查方法是查找栈中连续0最大的块
* 此函数在统计任务中自动调用,也可主动调用. 没有返回值,通过全局变量回传数据.
* 使用此功能时,必须在STARTUP.A51中清零所有的IDATA.
* 有多种可能导致检查的结果不准确
* 当剩余的栈容量小余栈正常数据中连续的0时,将得到错误的结果.
* 极端的可能是正常的栈数据中含有大量的连续0
* 所以,只有在栈剩余量较大时才有参考意义
* 虽然结果可能不准确,但是,当栈剩余量较大时仍有参考意义.
*-----------------------------------------------------------*/
void IDStkChk(void)FunctionProperties
{
    INT8U addr=ID_CH_Start+1,maxFree=0,cnt=0;
   
    for(;addr;addr++){
        if( ((u8 idata *)0)[addr] == 0){
            cnt++;
        }else{
            maxFree = (cnt>maxFree)? cnt:maxFree;
            cnt=0;
        }
    }
    maxFree = (cnt>maxFree)? cnt:maxFree;
   
    if(maxFree<ID_STK_Free){
        ID_STK_Free = maxFree;
        ID_STK_Used = ID_STK_Size-ID_STK_Free;
    }
}
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-5-11 16:55:21 | 显示全部楼层
本帖最后由 tzz1983 于 2024-5-11 17:01 编辑
fan*** 发表于 2024-5-11 16:49
你的堆栈检查,是用什么方法?我采用最简单的,就是把堆栈数据通过回调函数处理,回调函数可以直接把堆栈 ...

我的方法和你的方法基本一致, 我只是检查一个大概,作为参考。并不是很准确, 但也无伤大雅。
这个功能只会在调试代码时用到,基本上是为了方便程序员查看,而不是要一个准确的结果
回复 支持 反对

使用道具 举报 送花

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

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-5-11 17:02:13 | 显示全部楼层
tzz1*** 发表于 2024-5-11 16:54
我把代码贴出来吧,省得你下载了

/*-----------------------------------------------------------*

ucos 本身好象也是这个办法,我的情况是有多个堆栈区,想来想去,没有什么好办法,就采用最简单的,把堆栈数据上传,人工判断。
回复 支持 反对

使用道具 举报 送花

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

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2024-5-12 13:33:24 | 显示全部楼层
本帖最后由 CosyOS 于 2024-5-12 14:17 编辑

首先,我从未说过只有 CosyOS 才能实现 “零中断延迟” 。
而且,我相信,只要进行适当调整,很多 RTOS 都可以实现 “零中断延迟”。
只是 实现 “零中断延迟” 的技术手段不同,效果也不尽相同。

对于 坛友 tzz1983 的作品 我不慎了解,不敢妄加评论,
但只想 问问他本尊,他的这个测试程序中,定时器3中断,
void Timer3_ISR_Handler (void) interrupt 19{
    T4T3M &= ~0x08;     //定时器3停止计数
    IE2 &= ~0X20;       //关闭定时器3中断   
    P00 = ~P00;   
    P01 = 1;            //开始唤醒任务
    OSTaskResume_FROM_ISR(APP_CFG_START_TASK_PRIO);
}
是否真的实现了 “零中断延迟” ?

如果确实实现了 “零中断延迟”,
那么,
INT8U  OSTaskResume_FROM_ISR (INT8U prio)FunctionProperties
中的 “OS_ENTER_CRITICAL();”
是否会影响其它高优先级中断的实时响应 ?
进而导致其它高优先级中断无法实现 “零中断延迟” ?


如果  该定时器3中断  未能实现 “零中断延迟”,

那么 其它高优先级中断 是否可以实现 “零中断延迟” ?是否支持随意调用服务?

请 坛友 tzz1983 把你的先进技术也简单介绍一下,
也让 大家 都能从中受益 !




点评

那么 其它高优先级中断 是否可以实现 “零中断延迟” ?是否支持随意调用服务? (1)对于一个结论,首先要把结论成立的条件说清楚,否则就没有评判的标准了。作为本论坛“零中断延迟”的定义者,你有任意的解释  详情 回复 发表于 2024-5-12 18:46
“uC/OS-II@STC8H确实是一个“能在高优先级零延迟中断”中调用系统服务的RTOS” 这个结论是我下的,我正在专门写文章来说明,你先等一等我的说明。你也不用再问他道理,他只是不经意在沙滩上捡到宝贝的玩家。  详情 回复 发表于 2024-5-12 17:42
没人和你较真,但需要通过你,没你不行啊!  详情 回复 发表于 2024-5-12 14:20
即然是戏台,就接着唱,接着舞  发表于 2024-5-12 14:18
你要较真,不要跟我较,大主, 我说了,科技这东西有一说一,你回头看大部分说的话. 然后你们呢, 你们都是畏首畏尾的, 然后最后指向了我?  发表于 2024-5-12 14:16
回复 支持 反对

使用道具 举报 送花

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

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2024-5-12 14:20:55 | 显示全部楼层
本帖最后由 Cos*** 于 2024-5-12 14:25 编辑
CosyOS 发表于 2024-5-12 13:33
首先,我从未说过只有 CosyOS 才能实现 “零中断延迟” 。
而且,我相信,只要进行适当调整,很多 RTOS 都 ...

没人和你较真,但需要通过你,没你不行啊!
我也不想和任何人较真。

点评

好吧, 正面回答你, 要实现0延时, 需要改一下进入临界区的宏, 把关闭总中断改为只关闭一部分中断, 未被临界区关闭的中断才可以实现零中断延迟, 作为代价, 不可以调用OS服务, 并且进入临界区的宏也会变得复杂一点.  详情 回复 发表于 2024-5-12 14:36
那你自己知道就行了,我相信不只你知道. 你自己的问题都不正面解决, 我这里没有问题, 我也没有乱说话 [attachimg]43794[/attachimg]  详情 回复 发表于 2024-5-12 14:24
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-5-12 14:24:08 | 显示全部楼层
Cos*** 发表于 2024-5-12 14:20
没人和你较真,但需要通过你,没你不行啊!

那你自己知道就行了,我相信不只你知道. 你自己的问题都不正面解决,
我这里没有问题, 我也没有乱说话
截图202405121424047269.jpg

回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-5-12 14:36:35 | 显示全部楼层
本帖最后由 tzz1983 于 2024-5-12 14:39 编辑
Cos*** 发表于 2024-5-12 14:20
没人和你较真,但需要通过你,没你不行啊!
我也不想和任何人较真。

好吧, 正面回答你,  要实现0延时, 需要改一下进入临界区的宏,
把关闭总中断改为只关闭一部分中断, 未被临界区关闭的中断才可以实现零中断延迟,
作为代价, 不可以调用OS服务, 并且进入临界区的宏也会变得复杂一点.

虽然最终可以实现这个功能, 但我个人认为使用uC/OS-II 时是没有必要这样做的

点评

首先,感谢你的正面回答! 其次,对你做出的对 uC/OS-II 的改进,提出表扬并点赞!  详情 回复 发表于 2024-5-12 14:46
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:47 , Processed in 0.159556 second(s), 121 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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