硬汉嵌入式论坛

 找回密码
 立即注册
查看: 694|回复: 5
收起左侧

[μCOS-III] 死机,中断中调用OSIntEnter(); OSIntExit(); 会加速死机

[复制链接]

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2025-1-21 10:49:42 | 显示全部楼层 |阅读模式

各位大佬好,小弟在移植完UCOS-III后遇到了一个奇怪的死机问题,环境及现象如下,希望能够得到您的指导,非常感谢
硬件:STM32F427 软件:标准库 UCOS-III3.8.2

现象:
1、中断函数中没有加入OSIntEnter();  OSIntExit(); 时,能连续运行12小时然后死机
2、在几个中断中加入该函数对后,2分钟后就能死机
现有措施:
1、开大了系统堆栈,任务堆栈,还有ucos的ISR堆栈,能够确定中断没有溢出。
2、使用了systemview软件抓取了运行过程,发现在最后只运行Systick任务和调度任务,如图所示:前面任务正常切换,后面就一直任务调度(黑色长条) Systick任务  中断任务中来回切换,此时中断程序后,发现OSTCBCurPtr的值为0x00000000,OSTickList中任务句柄值也是0x00000000,然后再运行一会就死机了
3、加入了条件断点,看是哪里把这两个关键结构体给误写了,但是加入条件断点后运行速度非常慢,被放慢了几十倍,所以这个措施相当于也没成功抓取到

或者有没有高版本的基于F4标准库的UCOS-III(高版本的,因为需要用trace功能)
死机1.png
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-1-21 11:03:55 | 显示全部楼层
中断函数使用了形如下面的调用方式
void DMA2_Stream6_IRQHandler(void)
{
    OSIntEnter();  
        if (DMA_GetFlagStatus(DMA2_Stream6, DMA_FLAG_TCIF6) == SET) {
        DMA_ClearFlag(DMA2_Stream6, DMA_FLAG_TCIF6);
        DMA_Cmd(DMA2_Stream6, DISABLE);
        UsartTxIdle(&Usart6Status);
        Usart6Write();
    }
        OSIntExit();
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-1-21 11:43:11 | 显示全部楼层
Lihongxiang 发表于 2025-1-21 11:03
中断函数使用了形如下面的调用方式
void DMA2_Stream6_IRQHandler(void)
{

对于新版uCOS,中断里面没有调用uCOS的API,不需要加OSIntEnter(); 和OSIntExit();

应该是程序实现问题,你再排查下
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-1-21 11:58:42 | 显示全部楼层
最新进度分享:
参考了硬汉哥的“[μCOS-III] 使用最新版uCOS-III V3.08.00要特别注意自带开关中断函数控制的中断优先级范围”链接为https://www.armbbs.cn/forum.php? ... ;highlight=uCOS-III
1、将中断分组设置为NVIC_PriorityGroup_4
2、CPU_CFG_KA_IPL_BOUNDARY配置为1,中断等级重新分配了一下,并且最高为1, 保证所有应用中断受UCOS控制,再次启动后,不会立刻死机,不知道后面时间长了会不会死机,后面再告知大家,希望这次是找到根上了
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-1-21 13:38:49 | 显示全部楼层
eric2013 发表于 2025-1-21 11:43
对于新版uCOS,中断里面没有调用uCOS的API,不需要加OSIntEnter(); 和OSIntExit();

应该是程序实现问 ...

您好,感谢您的回复,看到了硬汉哥关于“UCOS新版本中自带开关中断函数控制的中断优先级范围”的说明,做出了如下修改:
1、将CPU_CFG_KA_IPL_BOUNDARY 设置为1,中断分组按照NVIC_PriorityGroup_4进行分组,并将中断的等级分配为1及以下,设置完成后不会立刻出现,现在还在跑,感觉这次应该是抓到根上了

另外,想要咨询您一个问题,我想在中断里面加入OSIntEnter(); 和OSIntExit();是为了分析系统的中断情况,次数 频率等等,这样做是不是不合适,还是说直接利用systemview的打桩函数进行跟踪
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-1-22 07:49:46 | 显示全部楼层
Lihongxiang 发表于 2025-1-21 13:38
您好,感谢您的回复,看到了硬汉哥关于“UCOS新版本中自带开关中断函数控制的中断优先级范围”的说明,做 ...

不需要加入OSIntEnter(); 和OSIntExit();的中断,加入后影响中断执行速度。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 21:38 , Processed in 0.266845 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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