找回密码
 立即注册
查看: 3445|回复: 68

UCOSII - STC32G12K128 移植

[复制链接]

该用户从未签到

20

主题

575

回帖

1191

积分

荣誉版主

积分
1191
发表于 2023-9-8 14:53:31 | 显示全部楼层 |阅读模式
本帖最后由 tzz1983 于 2024-3-29 13:57 编辑



UCOS2.93版转至新贴:  https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4702



回复 送花

使用道具 举报

该用户从未签到

552

主题

9492

回帖

1万

积分

管理员

积分
14057
发表于 2023-9-8 15:37:26 | 显示全部楼层
感谢分享,大家帮忙查错
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    0

    主题

    18

    回帖

    398

    积分

    中级会员

    积分
    398
    发表于 2023-9-10 21:57:28 | 显示全部楼层
    又是一位大师。感谢分享
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    11

    主题

    331

    回帖

    886

    积分

    荣誉版主

    积分
    886
    发表于 2023-9-11 13:23:30 来自手机 | 显示全部楼层
    任务切换部分。参考ARM cortex的pendSV方式,好处就是流程简单。

    但是8051或者80251这么做,不能够实现临界区切换任务。
    ARM cortex可以屏蔽15号以上中断。实现临界区任务切换。

    当然,使用者不考虑这个情况,使用也是没问题的。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    575

    回帖

    1191

    积分

    荣誉版主

    积分
    1191
     楼主| 发表于 2023-9-11 15:58:31 | 显示全部楼层
    临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务.  

    点评

    “临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务. ” 看来这个问题不说清楚不行了: (1)这是uC/OS-III [attachimg]21549[/attachimg] [attachimg]21550[/attachimg] 这个“  详情 回复 发表于 2023-9-17 13:21
    楼主的问题“临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务. ” 我今天想到了一个证明方法: 大前提:在OS中,凡是不能够被打断的过程都要置于临界区中保护起来。 小前提:OS中  详情 回复 发表于 2023-9-13 13:08
    这个是杨为民老师弄的例子。我移植的那份stc8-ucos有交流的记录,你去看看。  详情 回复 发表于 2023-9-11 22:08
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    11

    主题

    331

    回帖

    886

    积分

    荣誉版主

    积分
    886
    发表于 2023-9-11 22:08:26 | 显示全部楼层
    tzz1983 发表于 2023-9-11 15:58
    临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务.   ...

    这个是杨为民老师弄的例子。我移植的那份stc8-ucos有交流的记录,你去看看。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    575

    回帖

    1191

    积分

    荣誉版主

    积分
    1191
     楼主| 发表于 2023-9-12 09:50:11 | 显示全部楼层
    你的代码我早就刷到过, 但是我没有耐心仔细看.  首先表明, 我很喜欢STC-51内核的单片机, 用它的时间也超过了十年. UCOS早就可以运行在51内核上了, "杨屹" 那个版本有人还记得吗? 多少年了! 可有多少实际项目会运用呢?
    这次我发出这个贴出来, 是有一点想抛砖引玉的意思. 想表明的意思有几点:
        1. STC32G 这个251内核的比51内核的更适合运行OS, 你自己移植过OS, 你应该明白51内核运行OS时需要"栈搬家", 这就是51内核运行OS的最大短板,且无法绕过.  251内核就没有这个问题, 运行更流畅
        2. 学最终的目的是用, 如果同意我的观点. 为何不把现在用在51运行OS的精力放在251内核上来呢. (再次表明,STC8(51内核)是一款非常优秀的单片机,并不是所有的应用都要用到OS,实际上大多数的应用都不需要用到OS,适不适合运行OS和产品本身好坏是两码事) 初发贴时我是在没有找到STC32G(251核)对应的UCOS版本, 才发出来的,希望是有人能接下去, 这样对于那些真正要用它做项目的人来说, 是可以提高很多效率的
        3. 对于STC来说, 我是一名客户, 对于本论谈来说, 我只是一个小小的游客. 我发出代码, 不代表我的代码很优秀. 那些细节还是需要有专业的人去打磨的. 或者说大家在这里共同探讨, 排除BUG, 取长补短, 那也是非常好的

    再说一下这个临界区切换任务的话题吧, 说实话, 这个东西我还真的是不明白, 有知情人的好心人可以用简明易懂的方式告诉我为什么吗? 非常期待.  
    在我的印象中, 临界区对于程序来说是一段不可分割代码, 并且为了整个OS的快速响应, 临界区是要尽量做得精简的. 现在说要在临界区切换任务, 有几点我不明白:
    1.什么场景下有这种需求?
    2. 临界区内切换任务了, 那还叫临界区吗? 新的任务是在临界区内运行吗? 又或者在切换任务时就自动退出了临界区, 那那些本来就在临界区内未运行代码又算是什么, 它们不是临界区的一部分?
    3.进临界区和出临界区不对配对使用的吗, 你不可以运行完临界区再切换任务吗?
    4.和楼上说的恰恰相反, 使用中断方式, 反而是可以在临界区切换任务的, 因为退出临界区(实际上就是开中断)后就会自动立刻切换任务.

    顺便说一下我发的这个代码最新测试结果, 我没有专门去测试, 但是已经用在了一个小项目上面,  目前除了"邮箱队列"和"内存管理"的功能没有用到外, 其它的功能基本都用过了 (已经用过的功能有 信号量, 互斥, 邮箱 ,标志集, 软定时器. 统计任务, 堆栈检查), 目前没有发现问题.

    点评

    “你的代码我早就刷到过, 但是我没有耐心仔细看”。如果楼主仔细去看熊仔网友的帖子,那么你就不会提出下面的问题了。一开始他也不理解,觉得:“这个问题我早就发现,后面细想,正常临界区保护的时候不会去切换任务  详情 回复 发表于 2023-9-12 16:41
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10904
    发表于 2023-9-12 16:41:53 | 显示全部楼层
    本帖最后由 杨为民 于 2023-9-12 17:16 编辑
    tzz1983 发表于 2023-9-12 09:50
    你的代码我早就刷到过, 但是我没有耐心仔细看.  首先表明, 我很喜欢STC-51内核的单片机, 用它的时间也超过 ...

    “你的代码我早就刷到过, 但是我没有耐心仔细看”。如果楼主仔细去看熊仔网友的帖子,那么你就不会提出下面的问题了。
    一开始他也不理解,觉得:“这个问题我早就发现,后面细想,正常临界区保护的时候不会去切换任务的。
    我的答复是:“达不到嵌套保护的目的,要么是根本不可能实现嵌套保护,要么是你没有能力实现,要么是你想实现的方法是对的,只是存在BUG
    结果他努力去探求,不仅找到了解决的方法,并且还改正了uC/OS-II本身从一开始就存在的BUG!

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10904
    发表于 2023-9-12 17:20:08 | 显示全部楼层
    C251-UCOSII存在的一个大BUG
    楼主移植的C251-UCOSII中存在一个大BUG,但是这不是移植者移植过程中的BUG,而是uC/OS-II从一开始的PC版就延续下来的BUG。
    这个BUG由于其特殊性很难发现,因此我特地编写了“临界区保护嵌套方法测试程序”来证明。
    下面是C251-UCOSII中的原始uC/OS-II代码:
    C251_1.jpg
    C251_2.jpg
    从上面程序中可以看到,当系统执行第1648行或者第685行程序进行任务切换后,当前任务被挂起,程序不会从任务切换函数中返回,CPU控制权交给新任务去执行。
    这样与第1638行和第672行临界区保护进入配对的第1652行和第689行临界区保护退出得不到执行,产生严重的“临界区保护不配对”的BUG。只是uC/OS-II程序结构的特殊性,这个BUG不会表现出来,难以被发现。

    熊仔网友经过探索,直接修改了uC/OS-II程序,消除了这个BUG,下面是他的移植版中的这两段程序:
    XZ_1.jpg
    XZ_2.jpg
    大家可以看到在熊仔网友的移植版中,在第1739行和第727行进行任务切换之前的第1738行和第723行先退出了临界区保护,完成了配套,克服了原始程序的BUG。

    当然这个方法还有不足,熊仔也在其帖子中指出来了。

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10904
    发表于 2023-9-13 13:08:20 | 显示全部楼层
    tzz1983 发表于 2023-9-11 15:58
    临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务.   ...

    楼主的问题“临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务.  
    我今天想到了一个证明方法:
    大前提:在OS中,凡是不能够被打断的过程都要置于临界区中保护起来。
    小前提:OS中任务切换是一个不能够被打断的过程。
    逻辑推论:任务切换一定是在临界区中进行的。
    重要的结论:“所有的任务切换一定是在临界区中进行的,没有例外!”,
    本结论接受反驳







    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-17 21:00 , Processed in 0.099465 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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