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

最新版本uC-OS2-2.93.01已移植到STC8上,请帮忙查错

[复制链接]

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-25 12:18:22 | 显示全部楼层
UCOSIII  临界代码保护
为了保护一些代码完成运行,不被打断。这些不能被打断的代码称为临界段代码,也叫临界区。

使用宏 OS_CRITICAL_ENTER()进入临界区代码;使用宏 OS_CRITICAL_EXIT()和
OS_CRITICAL_EXIT_NO_SCHED()退出临界区代码。

在 UCOSIII 中可以通过关闭中断和任务调度器上锁两种方式来保护临界段代码。

OS_CFG_ISR_POST_DEFERRED_EN 为 0,使用关中断的方式进入临界区;
OS_CFG_ISR_POST_DEFERRED_EN 为 1,使用锁定调度器方式进入临界区。

OS_CFG_ISR_POST_DEFERRED_EN 在 os_cfg.h 文件中定义。


UCOSIII 通过上锁方式



UCOSII 没有这个方式


点评

(1)开始解决问题的时候,先看看别人和别的事是怎么解决问题的,这是正道! (2)“UCOSII 没有这个方式”,所以才是一般人和你的天花板呀,所以才需要突破呀 (3)希望你能把你解决问题的过程和想法不断地发布出来  详情 回复 发表于 2023-8-25 12:31
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-25 12:21:55 | 显示全部楼层
熊仔 发表于 2023-8-25 11:36
这个问题是能解决,我在19#有说到:需要保存IE入栈,出来的时候判断是否开中断
中断处理和任务切换的时候就 ...

(1)好的,加油!相信你会成功的。

(2)这是一个我写的能通过临界区保护嵌套测试的范例程序,供你观察对比效果。作为老师,肯定是我自己通过了,然后才会出题给学生的:
泰山x51_临界区保护.rar (484.27 KB, 下载次数: 22)

(3)这是范例运行的视频效果。嵌套效果就是前面我给出的正确的那张图一:


(4)程序压缩包解开后的目录如下:
目录1.jpg

其中“0000_长缨x51”子目录下是“长缨8_V33.exe”C351编译器,我写的。

“0012_TSx51_RTOS”子目录下是“泰山x51 实时多任务操作系统(TSx51-RTOS) V1.1”,我写的。
(5)在测试程序目录下有以下文件:


目录2.jpg

其中采用Keil作为IDE。当程序编辑完成并保存后,双击“长缨x51_MakeFile.bat”这个MakeFile批处理文件,就可以对编译出HEX烧录文件了。

点评

好的,谢谢,晚上研究下。  详情 回复 发表于 2023-8-25 12:30
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-25 12:30:52 | 显示全部楼层
杨为民 发表于 2023-8-25 12:21
(1)好的,加油!相信你会成功的。

(2)这是一个我写的能通过临界区保护嵌套测试的范例程序,供你观察 ...

好的,谢谢,晚上研究下。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-25 12:31:31 | 显示全部楼层
熊仔 发表于 2023-8-25 12:18
UCOSIII  临界代码保护
为了保护一些代码完成运行,不被打断。这些不能被打断的代码称为临界段代码,也叫临 ...

(1)开始解决问题的时候,先看看别人和别的事是怎么解决问题的,这是正道!
(2)“UCOSII 没有这个方式”,所以才是一般人和你的天花板呀,所以才需要突破呀
(3)希望你能把你解决问题的过程和想法不断地发布出来,让大家一起分享这个解决问题的过程。这比你闷着头干几天后只拿出一个最终成功的成果来要有意义。就像课堂上回答问题,受益的是全体听课的同学。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9237

回帖

1万

积分

管理员

积分
13955
发表于 2023-8-25 12:48:41 | 显示全部楼层
跟着我们 两位 【荣誉版主:杨老师,熊仔】 一起前进 !
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-25 16:27:48 | 显示全部楼层
突然想到一个方法,学习中断嵌套的做法,增加一个变量。
进入临界区++。退出--。到0的时候才开启中断

晚上试试。先忙活

点评

(1)终于开窍了,不再坚持原汁原味移植了? (2)这个方法在“操作系统原理”中是一种普遍的方法,叫做“加锁/解锁”。 (3)所以为什么要设工程硕士研究生,就是要先学这些理论课程,学完后一身武艺,然后下山再  详情 回复 发表于 2023-8-25 17:38
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-25 17:38:03 | 显示全部楼层
本帖最后由 杨为民 于 2023-8-25 17:50 编辑
熊仔 发表于 2023-8-25 16:27
突然想到一个方法,学习中断嵌套的做法,增加一个变量。
进入临界区++。退出--。到0的时候才开启中断

(1)终于开窍了,不再坚持原汁原味移植了?

(2)这个方法在“操作系统原理”中是一种普遍的方法,叫做“加锁/解锁”。
(3)所以为什么要设工程硕士研究生,就是要先学这些理论课程,学完后一身武艺,然后下山再行江湖。
(4)虽说加锁解锁的原理都一样,但实现起来各有不同,尤其是针对不同的CPU指令集可以不同。相信你能做成,期待你做出自己的特色

(5)补充一点,uC/OS-II的方法3已经用在RTT中做临界区嵌套保护方法,作为其特色了。而加锁解锁方法是FreeRTOS的标准的临界区嵌套保护方法,只是STC移植版只采用了最简单的不支持临界区保护嵌套的简单的关闭和打开EA的方法1。所以多看才知山外有山,遇事才有解决的方法
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-26 00:17:39 | 显示全部楼层

今天比较忙,挺晚才开始弄。终于弄好了临界区保护方法4






下面是了逻辑分析仪的波形图



改动挺多的,os_cpu_a.A51 还需要优化,今天太晚了,先这样吧。

点评

(1)首先 要向楼主和看官说对不起,对楼主的方法4的例子我昨天没有实际烧录验证,只看了帖子中的逻辑分析仪图就错误地认为方法4已经成功了。但是今天实际烧录到打狗棒实验板上才发现:方法4只是第1轮循环是正确的,  详情 回复 发表于 2023-8-27 00:27
(1)首先祝贺,方法4通过临界区保护嵌套验证。 (2)下面是FreeRTOS的标准临界区保护方法,请对照你自己的点评一下: /*-----------------------------------------------------------*/ void vPortEnterCritical(  详情 回复 发表于 2023-8-26 01:36
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-26 01:36:31 | 显示全部楼层
本帖最后由 杨为民 于 2023-8-26 01:38 编辑
熊仔 发表于 2023-8-26 00:17
今天比较忙,挺晚才开始弄。终于弄好了临界区保护方法4

(1)首先祝贺,方法4通过临界区保护嵌套验证。

(2)下面是FreeRTOS的标准临界区保护方法,请对照你自己的点评一下:
/*-----------------------------------------------------------*/
void vPortEnterCritical( void )

{
    portDISABLE_INTERRUPTS();  // 杨注:关闭中断
    uxCriticalNesting++;


    /* This is not the interrupt safe version of the enter critical function so
     * assert() if it is being called from an interrupt context.  Only API
     * functions that end in "FromISR" can be used in an interrupt.  Only assert if
     * the critical nesting count is 1 to protect against recursive calls if the
     * assert function also uses a critical section. */
    if( uxCriticalNesting == 1 )
    {
        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
    }
}
/*-----------------------------------------------------------*/
void vPortExitCritical( void )

{
    configASSERT( uxCriticalNesting );
    uxCriticalNesting--;


    if( uxCriticalNesting == 0 )
    {
        portENABLE_INTERRUPTS();   // 杨注:打开中断
    }
}
/*-----------------------------------------------------------*/

(3)你要不要再挑战一下方法2和方法3?如果不试,建议把它们删掉


点评

当时按照自己的想法弄的,看来也正确。 FreeRTOS的更严谨,每次进入都关中断,避免用户不当操作打开中断。 嵌套计数变量使用8位,255层应该足够了,如果不够那也说明太不实时了,已经影响系统实时性。 貌似经过我  详情 回复 发表于 2023-8-26 09:47
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-26 02:08:08 | 显示全部楼层
本帖最后由 杨为民 于 2023-8-26 02:55 编辑

最新版本uC-OS2许可改成 APACHE 2.0 也就是可以商业使用不用授权

按我的理解“uC/OS-II”不是免费开源软件,原创作者已经声明作为商用必须获得授权(笔者在论坛里有专门的帖子介绍)。楼主不是原创只是移植着,楼主应该没有有权利取消授权,然后修改许可把它提供给商用的。
那么是不是有STC或者别的公司像“Silabs把uC-OS3版权买了,license改为Apache2”了,请楼主介绍一下,落实一下,这样有利于STC uC/OS-II的发展。



也就是说要提供一个“版权声明”的原始版
2. 版权声明:被许可软件的副本必须包含原始版权声明和许可声明。

点评

关于这个,开始是有放源码下载链接的。 内核代码里应该加上LICENSE文件,后面统一加上。 内核代码每一个文件开头都有注明版权的 /* *****************************************************************************  详情 回复 发表于 2023-8-26 09:53
回复 支持 反对 送花

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 11:37 , Processed in 0.078948 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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