基于STM32F103 UCOS-II临界区无法关闭中断的问题

2020-01-01 17:34发布

说一下事情的经过,首先我自己移植了一份基于UCOS操作系统的代码,一直以来用的也挺好,当然使用的也是小项目,什么TCP/IP,USB之类的没有用过,最多的任务量也就用到7—8个,可最近有个项目任务量用了12个,一下子出问题了(不是堆栈溢出),现象是调用了操作系统进入临界区的代码后,然后退出调用代码,再进去观察中断仍然是开着的,最后导致系统逻辑混乱。
大家用UCOS也用得多,所以这里进行简单的修改就可以测试。
首先修改os_cpu.a.asm文件中的OS_CPU_SR_Save,OS_CPU_SR_Restore函数,修改后如下,其实就是添加了红 {MOD}字体的2条语句,意思就是在执行OS_CPU_SR_Save后监视有没有对primask操作成功,同时在进入OS_CPU_SR_Restore时监控当前的中断是否是处于屏蔽状态。

OS_CPU_SR_Save
MRS     R0, PRIMASK                                       
CPSID   I
        MRS     R1, PRIMASK
    BX      LR

OS_CPU_SR_Restore
    MRS     R1, PRIMASK
    MSR     PRIMASK, R0
BX      LR


在用户的任务里面先进行初始化工作,然后进行临界区的进入和退出函数调用
void Task_1(void *p_arg)
{           
    OS_CPU_SR  cpu_sr = 0u;
        (void)p_arg;
        
        RCC_Config();
        NVIC_Config();
        
        while(1)
        {               
        OS_ENTER_CRITICAL();   //在这里加断点,然后单步调试
        OS_EXIT_CRITICAL();
                OSTimeDly(1000);
        }
} 5.JPG (79.09 KB, 下载次数: 0) 下载附件 2017-1-11 19:50 上传
可以看到从PRIMASK寄存器里面读出来的值仍然是0,说明中断并没有关闭成功,于是把自己搞蒙了。大家如何解释这个问题呢?
附件是基于KEIL的工程 stm32f103c8t6 ucos_II(v2.91).rar (3.27 MB, 下载次数: 8) 2017-1-11 19:53 上传 点击文件名下载附件

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
amxx
1楼-- · 2020-01-03 15:31
security 发表于 2017-1-12 17:00
你用仿真模式试验过了吗?
换个高版本的 MDK 吧,你的版本太 low 了啊,我已经 2 年多没用 MDK 了,2 年 ...

测试了一下,在仿真模式下目前的KEIL V4版本是可以的,但实际接了硬件不知道为什么不行,晚点我换个高版本的KEIL测试一下
security
2楼-- · 2020-01-03 20:42
 精彩回答 2  元偷偷看……
amxx
3楼-- · 2020-01-04 00:11
security 发表于 2017-1-19 09:44
楼主同学,
过了好多天了,问题解决了没有?
分享一下?

说起来惭愧,是KEIL的版本问题导致的,后来换了高版本的KEIL问题,仿真也就没有出现这个问题了
security
4楼-- · 2020-01-04 03:07
amxx 发表于 2017-2-6 11:53
说起来惭愧,是KEIL的版本问题导致的,后来换了高版本的KEIL问题,仿真也就没有出现这个问题了 ...

解决了就好。
所以说要紧跟时代潮流,尽量用用新的版本,不要一直停留在过老的版本。

一周热门 更多>