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

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

[复制链接]

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-26 09:47:53 | 显示全部楼层
杨为民 发表于 2023-8-26 01:36
(1)首先祝贺,方法4通过临界区保护嵌套验证。

(2)下面是FreeRTOS的标准临界区保护方法,请对照你自己 ...

当时按照自己的想法弄的,看来也正确。
FreeRTOS的更严谨,每次进入都关中断,避免用户不当操作打开中断。

嵌套计数变量使用8位,255层应该足够了,如果不够那也说明太不实时了,已经影响系统实时性。

貌似经过我修改内核代码后,方法2和方法3也能移植成功,晚点弄下。
之前的想法是尽量不要去改动动内核代码,移植方法4,必须改动内核源码,因为进入切换任务的时候进入了临界区。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-26 09:53:12 | 显示全部楼层
杨为民 发表于 2023-8-26 02:08
“最新版本uC-OS2许可改成 APACHE 2.0 也就是可以商业使用不用授权。”

按我的理解“uC/OS-II”不是免费开 ...

关于这个,开始是有放源码下载链接的。
内核代码里应该加上LICENSE文件,后面统一加上。
内核代码每一个文件开头都有注明版权的
/*
*********************************************************************************************************
*                                              uC/OS-II
*                                        The Real-Time Kernel
*
*                    Copyright 1992-2021 Silicon Laboratories Inc. www.silabs.com
*
*                                 SPDX-License-Identifier: APACHE-2.0
*
*               This software is subject to an open source license and is distributed by
*                Silicon Laboratories Inc. pursuant to the terms of the Apache License,
*                    Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-26 11:06:20 | 显示全部楼层
熊仔 发表于 2023-8-26 09:53
关于这个,开始是有放源码下载链接的。
内核代码里应该加上LICENSE文件,后面统一加上。
内核代码每一个 ...


回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-27 00:27:33 | 显示全部楼层
熊仔 发表于 2023-8-26 00:17
今天比较忙,挺晚才开始弄。终于弄好了临界区保护方法4

(1)首先 要向楼主和看官说对不起,对楼主的方法4的例子我昨天没有实际烧录验证,只看了帖子中的逻辑分析仪图就错误地认为方法4已经成功了。但是今天实际烧录到打狗棒实验板上才发现:方法4只是第1轮循环是正确的,运行10秒钟左右就会死机。希望楼主多运行一下验证一下。

(2)泰山x51-RTOS的正确的验证范例连续运行见下面的截图:
泰山x51_正确.jpg

图中左面的三个负脉冲是main()函数开始的LOGO信号,然后就重复地循环一直运行下去。
(3)楼主方法4的连续运行结果见下图:
方法4_司机.jpg

在左面main()函数的三个LOGO负脉冲后,先执行了任务A(优先级高)后挂起,然后执行了任务B后挂起,然后执行任务C开始第一轮循环的测试,到这里都是正确的。但是后面疑似出现了系统重启(又出现LOGO信号),然后死机的严重故障。
因此楼主的方法4没有能通过验证程序,甚至可能存在致命的BUG
(4)因为BUG严重,我看了你的源程序,有许多地方不太理解你的思路,所以不好评价。建议楼主认真再检查一下你的程序和思路

点评

中断例子,对比代码的时候搞错了,最后整理的时候和另一份测试IE入栈的例子对比,中断的代码全弄过来了。导致栈不对了。  详情 回复 发表于 2023-8-27 23:55
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-27 17:03:54 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-28 00:06 编辑

代码重新整理了。
方法2和方法4都在杨老师提供的例子能工作。
方法3不工作。

对于方法3

#define  OS_ENTER_CRITICAL()  (cpu_sr = OS_CPU_SR_Save()) /*关闭中断*/
#define  OS_EXIT_CRITICAL()   (OS_CPU_SR_Restore(cpu_sr)) /*使能中断*/


如果在一个函数里面嵌套使用。相当于变量覆盖。

1层 进入临界区
cpu_sr = OS_CPU_SR_Save();
    2层临界区
    cpu_sr = OS_CPU_SR_Save();
.
.
.
    2层 退出临界区
    OS_CPU_SR_Restore(cpu_sr);
1层 退出临界区
OS_CPU_SR_Restore(cpu_sr);


变量在2层改变了,最后cpu_sr的值只能是关闭中断
所以uCOSII的方法3是无法完成杨老师例子的测试。


可以参考RT-Thread临界区保护方法
  1. rt_base_t level1;
  2. rt_base_t level2;
  3. /* 临界段代码 */
  4. {
  5.     /* 临界段 1 开始 */
  6.     level1 = rt_hw_interrupt_disable(); /* 关中断,level1=0,PRIMASK=1 */
  7.     {
  8.         /* 临界段 2 */
  9.         level2 = rt_hw_interrupt_disable();  /* level2=1,PRIMASK=1 */
  10.         {
  11.         }
  12.         rt_hw_interrupt_enable(level2); /* level2=1,PRIMASK=1 */
  13.     }
  14.     /* 临界段 1 结束 */
  15.     rt_hw_interrupt_enable(level1); /* 开中断,level1=0,PRIMASK=0 */
  16. }
复制代码
修改测试例子,不要使用宏,直接用函数,可行。

1层 进入临界区
cpu_sr1 = OS_CPU_SR_Save();
    2层 进入临界区
    cpu_sr2 = OS_CPU_SR_Save();
.
.
.
    2层 退出临界区
    OS_CPU_SR_Restore(cpu_sr2);
1层 退出临界区
OS_CPU_SR_Restore(cpu_sr1);



还有测试例子估计在STM32上也不能运行。
进入临界区时候关闭中断使用函数OS_ENTER_CRITICAL() ,实际 执行CPSID I,关闭了除NMI 和fault 以外的异常。
切换任务过程
1,OS_ENTER_CRITICAL()
2,OSCtxSw()         实际也是一个汇编代码,其作用是开启PendSV中断以实现任务的调度。
3,OS_EXIT_CRITICAL()
4,最后进入执行PendSV中断服务函数,切换任务。
如果嵌套了,1位置就是关中断的,3位置也是关闭中断。会导致PendSV中断服务函数无法得到执行(因为没有开启中断允许开关)。
RT-Thread貌似也不能通过测试


深思,实际使用中真有人会在临界区切换任务?


附近代码还有问题

点评

(1)“深思,实际使用中真有人会在临界区切换任务?”,你觉得会有人把油门当刹车踩吗?RTOS是作为一个平台提供给用户使用的,RTOS通常是要作为机械等控制平台使用的,所以对于RTOS系统软件,可靠性第一,安全性第  详情 回复 发表于 2023-8-27 19:37
“还有测试例子估计在STM32上也不能运行。”,别急着猜结论,送上电影“战狼”里我最看重的的一句话:“试试不就知道了”。  详情 回复 发表于 2023-8-27 18:53
“可以参考RT-Thread临界区保护方法”,这条道路就对了,它山之石可以攻玉  详情 回复 发表于 2023-8-27 18:48
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-27 18:48:16 | 显示全部楼层
熊仔 发表于 2023-8-27 17:03
我研究重新整理了。
方法2和方法4都在杨老师提供的例子能工作。
方法3不工作。

“可以参考RT-Thread临界区保护方法”,这条道路就对了,它山之石可以攻玉
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-27 18:53:17 | 显示全部楼层
熊仔 发表于 2023-8-27 17:03
我研究重新整理了。
方法2和方法4都在杨老师提供的例子能工作。
方法3不工作。

“还有测试例子估计在STM32上也不能运行。”,别急着猜结论,送上电影“战狼”里我最看重的的一句话:“试试不就知道了”。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-27 18:58:27 | 显示全部楼层
既然改动了内核代码,这次就改的更彻底一点。临界区使用方法不需要在os_cpu_a.A51文件里面定义。把修复的部分做成一个函数,



由于51单片机是在 OSCtxSw()和 OSIntCtxSw()里面直接切换任务,不会返回。所以切换前需要退出临界区。






点评

正道之一,足够正确,但不够完美  详情 回复 发表于 2023-8-27 19:40
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-27 19:37:18 | 显示全部楼层
熊仔 发表于 2023-8-27 17:03
代码重新整理了。
方法2和方法4都在杨老师提供的例子能工作。
方法3不工作。

(1)“深思,实际使用中真有人会在临界区切换任务?”,你觉得会有人把油门当刹车踩吗?RTOS是作为一个平台提供给用户使用的,RTOS通常是要作为机械等控制平台使用的,所以对于RTOS系统软件,可靠性第一,安全性第一。至于任务切换速度,STC这样的硬件会在不断地提高芯片速度来满足用户的要求,但是软件设计上的可靠性和安全性,是要靠系统架构师和程序员来保证的。

(2)火箭和汽车制造都有硬件实验平台,包括汽车防撞实验平台,撞个稀扒烂,楼主觉得有必要吗?
(3)上一个测试速度的范例和这次测试临界区保护嵌套的范例,只是我在研制单片机RTOS过程中使用的其中两个测试程序。你第一次在帖子提出方法2和方法3时,就准备提供给你做测试题了。
(4)你这次用的方法2、3、4,都还没有用到8051CPU为临界区保护专门提供的汇编语言硬件指令,有人听了STC讲座问什么是“原子指令”。“JBC”就是一条8051的原子指令,一条8051专门为加锁解锁操作设计的硬件指令。
(5)临界区保护嵌套如此的必要和重要,Keil的C51编译器和我的长缨8编译器都已经内嵌了使用“JBC”指令的可嵌套的临界区保护的函数,在将C语言编译为汇编语言时自动调用。
(6)楼主要不要试试用“JBC”汇编指令编写一个临界区保护方法5,我等你

点评

JBC 指令没有研究过。 我看看这个指令用法,谢谢杨老师提点。  详情 回复 发表于 2023-8-27 21:10
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-27 19:40:47 | 显示全部楼层
熊仔 发表于 2023-8-27 18:58
既然改动了内核代码,这次就改的更彻底一点。临界区使用方法不需要在os_cpu_a.A51文件里面定义。把修复的部 ...

正道之一,足够正确,但不够完美
回复 支持 反对 送花

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 13:57 , Processed in 0.111489 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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