tzz1983 发表于 2023-9-8 14:53:31

UCOSII - STC32G12K128 移植

本帖最后由 tzz1983 于 2024-3-29 13:57 编辑



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



神农鼎 发表于 2023-9-8 15:37:26

感谢分享,大家帮忙查错{:4_196:}

youlinys 发表于 2023-9-10 21:57:28

又是一位大师。感谢分享

熊仔 发表于 2023-9-11 13:23:30

任务切换部分。参考ARM cortex的pendSV方式,好处就是流程简单。

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

当然,使用者不考虑这个情况,使用也是没问题的。

tzz1983 发表于 2023-9-11 15:58:31

临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务.

熊仔 发表于 2023-9-11 22:08:26

tzz1983 发表于 2023-9-11 15:58
临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务.   ...

这个是杨为民老师弄的例子。我移植的那份stc8-ucos有交流的记录,你去看看。

tzz1983 发表于 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:53

本帖最后由 杨为民 于 2023-9-12 17:16 编辑

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

杨为民 发表于 2023-9-12 17:20:08

C251-UCOSII存在的一个大BUG楼主移植的C251-UCOSII中存在一个大BUG,但是这不是移植者移植过程中的BUG,而是uC/OS-II从一开始的PC版就延续下来的BUG。这个BUG由于其特殊性很难发现,因此我特地编写了“临界区保护嵌套方法测试程序”来证明。下面是C251-UCOSII中的原始uC/OS-II代码:

从上面程序中可以看到,当系统执行第1648行或者第685行程序进行任务切换后,当前任务被挂起,程序不会从任务切换函数中返回,CPU控制权交给新任务去执行。这样与第1638行和第672行临界区保护进入配对的第1652行和第689行临界区保护退出得不到执行,产生严重的“临界区保护不配对”的BUG。只是uC/OS-II程序结构的特殊性,这个BUG不会表现出来,难以被发现。
熊仔网友经过探索,直接修改了uC/OS-II程序,消除了这个BUG,下面是他的移植版中的这两段程序:

大家可以看到在熊仔网友的移植版中,在第1739行和第727行进行任务切换之前的第1738行和第723行先退出了临界区保护,完成了配套,克服了原始程序的BUG。
当然这个方法还有不足,熊仔也在其帖子中指出来了。

杨为民 发表于 2023-9-13 13:08:20

tzz1983 发表于 2023-9-11 15:58
临界区切换任务? 这个确实没想过, 不过我很好奇的是, 什么时候需要在临界区切换任务.   ...

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







页: [1] 2 3 4 5 6 7
查看完整版本: UCOSII - STC32G12K128 移植