找回密码
 立即注册
查看: 5668|回复: 110

uC/OS-II @ STC32G 移植

[复制链接]

该用户从未签到

19

主题

519

回帖

1642

积分

荣誉版主

积分
1642
发表于 2023-10-20 11:19:26 | 显示全部楼层 |阅读模式
本帖最后由 tzz1983 于 2024-4-30 08:02 编辑

uC/OS-II @ STC32位8051 移植: 使用硬件中断模拟PendSv机制切换任务的原始版本:
* 特点: 切换任务最快, 响应速度最快
* 特色: 移植代码最精简
* 缺点: RAM使用量大
* 选择: RAM足够时, 很好的选择
uCOSII_STC251(PendSv_V1.00).rar (1.14 MB, 下载次数: 10)

uC/OS-II @ STC32位8051 移植: 使用硬件中断模拟PendSv机制切换任务的综合性能版本:
* 特点: 综合性能最好.  通过软件实现中断专用栈MSP与任务栈PSP分离. RAM使用量明显降低.
* 特色: 不受OS管理的中断选项
* 缺点: 配制选项偏多
* 选择: 本人喜欢用这个版本
uCOSII_STC251(PendSv_V1.08).rar (1.27 MB, 下载次数: 19)

uC/OS-II @ STC32位8051 移植: 综合性能版本(不使用PendSv机制)
* 特点:
极简配制, 且高效. 通过软件实现中断专用栈MSP与任务栈PSP分离. RAM使用量明显降低.
* 特色: 切换任务不依赖
额外的中断源
* 缺点: 尚不能证明中断内OSIntNesting++是否来得及
* 选择: 历史51核移植基本上都是走这条线路,目前没发现因为OSIntNesting++的原因出现问题

uCOSII_STC251(No_PendSv_V1.00).rar (1.26 MB, 下载次数: 7)


回复 送花

使用道具 举报

该用户从未签到

19

主题

519

回帖

1642

积分

荣誉版主

积分
1642
 楼主| 发表于 2023-10-20 11:46:33 | 显示全部楼层
本帖最后由 tzz1983 于 2023-10-28 08:36 编辑

RETI "特殊指令"引起BUG的描述:
"特殊指令"的概念参考STC32G用户手册
在UCOS应用中, 调用OSTimeDly() 或  OSSemPend() 等其它等待事件类应用时, 会调用OS_Sched()来切换任务,如下图:
捕获1.JPG

在临界区内,除 OS_TASK_SW();外可能还会发生其它的中断请求。
退出临界区后,会优先响应除PendSv外的其它中断, 这些中断使用RETI返回时, 会强迫代码继续往下执行一条指令。多个中断并发则可能继续执行多条指令,然后再切换任务。
被多执行的这些代码,本来是要等到时间到或者事件到才能够执行的。现在提前执行,所以据此做出的相关动作违背了等待的意愿,从而产生错误


解决这个BUG的方法是在退出临界区后, 等待任务切换,如下代码

#define  PendSv_flag() T4IF  //返回软中断标志的表达式或函数


    while(PendSv_flag());   //等待任务切换,此处是唯一改原代码的地方,2023/10/19


中断里的OSIntExit() 不会发生这种BUG, 原因是 中断本来就是随机发生的, 能被中断打断的代码, 可以被打断, 也可以继续执行, 所以多往后执行几条指令没有关系, 不必处理.








回复 支持 反对 送花

使用道具 举报

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

    [LV.7]常住居民III

    5

    主题

    481

    回帖

    2090

    积分

    荣誉版主

    积分
    2090
    发表于 2023-10-21 10:38:30 | 显示全部楼层
    tzz1983 发表于 2023-10-20 11:46
    RETI "特殊指令"BUG描述:
    "特殊指令"的概念参考STC32G用户手册
    在UCOS应用中, 调用OSTimeDly() 或  OSSemPe ...

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 85 天

    [LV.6]常住居民II

    1

    主题

    66

    回帖

    591

    积分

    高级会员

    积分
    591
    发表于 2023-10-21 11:55:54 | 显示全部楼层
    回复 送花

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
    发表于 2023-10-26 17:07:17 | 显示全部楼层
    用一个中断模拟PendSV 进行任务切换,这个方法好,可以不用跟踪中断嵌套了。51单片机中断时不会自动关中断,用变量来跟踪中断嵌套,实际上是有问题的。缺点就是会多一次中断响应和寄存器入栈、出栈操作。

    点评

    不管用什么办法, 切换任务都需要切换上下文,所以并没有多出什么  发表于 2023-10-28 08:07
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
    发表于 2023-10-28 08:37:09 | 显示全部楼层
    本帖最后由 fanxsp 于 2023-10-28 08:47 编辑
    fanxsp 发表于 2023-10-26 17:07
    用一个中断模拟PendSV 进行任务切换,这个方法好,可以不用跟踪中断嵌套了。51单片机中断时不会自动关中断 ...

    应该是会多出一些机器周期,如果在中断中使一个高优级任务就绪,原来的方法是在中断退出时,就切换到高优级任务。中断模拟的方法是要退出当前中断,然后再响应中断,在中断里切换到高优先级任务。就是多了一次寄存器出栈、寄存器入栈及中断响应的时间。ARM 的PendSV指令就没有这个问题,PendSV指令是延时响应,是直接跟在最后退出的中断服务程序后面的,不用退出中断后再响应。ARM Cortex M0  M3 有末尾连锁,51没有。
    截图202310280844383932.jpg

    点评

    不过现地这仍是最好的办法  发表于 2023-10-28 08:48
    嗯 ,兄弟,你理解是对的,ARM这叫咬尾中断。  发表于 2023-10-28 08:47
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
    发表于 2023-10-28 09:03:36 | 显示全部楼层
    fanxsp 发表于 2023-10-28 08:37
    应该是会多出一些机器周期,如果在中断中使一个高优级任务就绪,原来的方法是在中断退出时,就切换到高优 ...

    用中断模拟的方法,我理解是可以不用跟踪中断嵌套了,也不用在每个中断退出时,调用OSIntExit()了,只要在系统服务函数中,根据需要触发中断就可以了。我理解ARM的PendSV指令,应该也是起这个作用。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    519

    回帖

    1642

    积分

    荣誉版主

    积分
    1642
     楼主| 发表于 2023-10-28 09:21:33 | 显示全部楼层
    本帖最后由 tzz1983 于 2023-10-28 09:25 编辑
    fanxsp 发表于 2023-10-28 09:03
    用中断模拟的方法,我理解是可以不用跟踪中断嵌套了,也不用在每个中断退出时,调用OSIntExit()了,只要 ...

    还是需要调用OSIntExit()了, 这里只是弱化了OSIntNesting的作用, 但是OSIntExit() 除了OSIntNesting还有一些别的操作,你去看一下原代码就清楚了。
    除非你想得特别周到,自己做了OSIntExit()的大部分活,但是如果这样就没什么意义了,还不如简单的调用一下。并且,一般不是特别的原因,我们不要轻易去违背原OS的使用规则,有时候我们一下子可能想不到那么全面,不违背可以避免一些坑,这对产品来说很重要。

    另外一个我想说的是, 如果在一个高优先级中断里没有使用任何OS应用,并且比它更高优先级的所有中断代码里也没有使用任何OS应用, 此时应该是可以不用OSIntNesting++和OSIntExit()的。
    这个应该是和FREERTOS不受OS管理的中断差不多的道理,现在我还不敢最终确认,等我好好缕缕,如果没有问题,以后再发表出来。
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
    发表于 2023-10-28 09:45:15 | 显示全部楼层
    tzz1983 发表于 2023-10-28 09:21
    还是需要调用OSIntExit()了, 这里只是弱化了OSIntNesting的作用, 但是OSIntExit() 除了OSIntNesting还有 ...

    嗯,移植的话,还是不要改动的好,我只是从原理上觉得可以取消。我也有做一个小的51的系统,自已用。就是觉得,51单片机 用变量跟踪中断嵌套不可靠。用中断模拟的办法,就可以完全解决这个问题了。这是我进这个论坛的一个大收获。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    519

    回帖

    1642

    积分

    荣誉版主

    积分
    1642
     楼主| 发表于 2023-10-28 10:08:45 | 显示全部楼层
    fanxsp 发表于 2023-10-28 09:45
    嗯,移植的话,还是不要改动的好,我只是从原理上觉得可以取消。我也有做一个小的51的系统,自已用。就是 ...

    51内核我用的型号也比较多,但是51内核植入OS就是比较烦,因为256字节IDATA的限制,我曾经也想自己做一个合适51内核的东西,但一直想不出较好的方案,不知道你是怎么实现的,发个纯系统出来看看哈。并且你发出来对你自己也是很有好处的,你想不到的东西别人可能很轻易就能想到,这就是集大众力量的好处。
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-30 14:57 , Processed in 0.073867 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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