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

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

[复制链接]

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-27 21:10:05 | 显示全部楼层
杨为民 发表于 2023-8-27 19:37
(1)“深思,实际使用中真有人会在临界区切换任务?”,你觉得会有人把油门当刹车踩吗?RTOS是作为一个 ...

JBC 指令没有研究过。
我看看这个指令用法,谢谢杨老师提点。

点评

到现在算我帮你找到几个BUG了?  详情 回复 发表于 2023-8-27 23:03
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-27 22:20:56 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-27 22:26 编辑

JBC指令,直接地址位为1则跳转,该位清0。
用来判断中断开关位 EA。切换任务前用这个比较好。切换前需要退出临界区,避免退出后临界区时,防止其他中断打断了。目前是进入切换函数才关中断。

还有,第一层嵌套,是否有必要判断EA,正常运行的程序 进入第一层嵌套的时候EA是1. 是否有用户使用不当弄0了,弄0系统就崩溃了
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2023-8-27 23:03:43 | 显示全部楼层
熊仔 发表于 2023-8-27 21:10
JBC 指令没有研究过。
我看看这个指令用法,谢谢杨老师提点。

到现在算我帮你找到几个BUG了?

点评

第一个使用注意问题吧,mov psw #0x00 嵌套测试问题确实有bug 我刚看了下之前发的方法4工程,是最后对比代码,整理的时候,把定时器1中断服务修改了。之前测试IE进栈,弄的。 去掉能工作的。 我测试可以运行,当时  详情 回复 发表于 2023-8-27 23:48
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-27 23:48:11 | 显示全部楼层
杨为民 发表于 2023-8-27 23:03
到现在算我帮你找到几个BUG了?

第一个使用注意问题吧,mov psw #0x00
嵌套测试问题确实有bug

我刚看了下之前发的方法4工程,是最后对比代码,整理的时候,把定时器1中断服务修改了。之前测试IE进栈,弄的。
去掉能工作的。
我测试可以运行,当时还截图了。



我现在发现不能搞太多方法,代码兼容太累。

到现在还是感觉不太完美。
临界区处理确实挺难
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-27 23:55:37 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-28 00:31 编辑
杨为民 发表于 2023-8-27 00:27
(1)首先 要向楼主和看官说对不起,对楼主的方法4的例子我昨天没有实际烧录验证,只看了帖子中的逻辑分 ...



中断例子,对比代码的时候搞错了,最后整理的时候和另一份测试IE入栈的例子对比,中断的代码全弄过来了。导致栈不对了。

刚看了下,方法4虽然测试能工作,还是有问题。



方法4切换函数最后应该这样。判断的时候,影响ACC和PSW,应该最后出栈。




回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

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

刚看了下,今晚弄的代码还有问题,

PSW 应该最后出栈

uCOSII_临界区保护_方法测试V1.03.zip

420.56 KB, 下载次数: 19

回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-28 07:29:11 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-28 07:44 编辑



切换任务前退出临界区还是不满意,
应该重新写一个函数适用于切换任务前退出临界区,保存到变量,别恢复IE的值,这样一直是关中断的,最后任务切换完毕,才恢复IE值。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-28 08:30:49 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-28 08:51 编辑



OSTaskCreate函数有进出临界区。

系统没有开启到时候,执行OSTaskCreate函数,会把中断打开。
这里就是之前有疑问是否有进入临界区前EA=0的情况。所以方法4还是得改,第一层需要保存EA状态。最后退出根据保存保存的状态恢复EA


方法1也是有这个问题。

所以OSStartHighRdy函数必须开始就关中断。

OSStartHighRdy:
        USING 0 ;
        CLR EA    ;关中断,避免用户初始化不慎打开了EA,返回任务的时候,开中断。

回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-28 10:03:24 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-28 22:16 编辑

方法4改成包含JBC汇编指令


_testbit_(bitvar )        //相当于 JBC bitvar 测试该位变量并跳转同时清除


方法4其实可以任务切换前不用退出临界区,在任务切换最后

        POP  AR7
        POP  AR6
        POP  AR5
        POP  AR4
        POP  AR3
        POP  AR2
        POP  AR1
        POP  AR0
        POP  DPH
        POP  DPL
        POP  B
        这个位置调用退出临界区函数,临界区函数用到了ACC和PSW,需要提前处理。
        POP  ACC
        POP  PSW      

为了兼容方法1,2,3,4  ,统一在任务切换前退出临界区但是不关中断,保存IE的值到变量 _bIE

定义了一个宏 OS_EXIT_CRITICAL_NOT_INT();
在任务切换最后统一处理
POPALL
MOV IE, _bIE           ;MOV dest_direct, src_direct  不会影响标志位







方法1应该也改下。

方法2和3,也应该更新下,确保进入临界区可以修改IE的bit0到bit6.
退出的时候只处理bit7,也就是EA
晚上更新,今天很忙。






回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-28 22:15:38 | 显示全部楼层

方法2,普通方式


方法2,JBC指令方式





方法3也提供2种方式



方法4 改成加入JBC指令方式,之前的方法4不完美。



任务切换函数最后使用MOV IE, _bIE   感觉还是比较完美的。





附件是修改后的代码


uCOSII_临界区保护_方法测试V1.04.zip

421.18 KB, 下载次数: 20

回复 支持 反对 送花

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 13:16 , Processed in 0.202689 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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