硬汉嵌入式论坛

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

[μCOS-II] UCOSII OSIntEnter()问题

[复制链接]

6

主题

18

回帖

36

积分

新手上路

积分
36
发表于 2021-8-19 15:44:33 | 显示全部楼层 |阅读模式
void SysTick_Handler(void)
{
    OS_CPU_SR cpu_sr;   
    OSIntEnter();       //之前一直没加
   
    OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
    OSIntNesting++;
   
    eB_systickHook();
   
    OS_EXIT_CRITICAL();
    OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */
    OSIntExit();

}

今天闲来无事排查了一遍程序的一些隐患,发现个问题。SysTick_Handler 是个中断,按UCOS的说明

You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call
*                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
*                 end of the ISR.OSIntEnter() 和 OSIntExit();
这两个必须成对出现,发现SysTick_Handler我居然没加OSIntEnter()  但是程序跑了一年也没见有什么问题。
请教各位,加还是不加。 有什么隐患吗。 硬汉大神快来。



回复

使用道具 举报

6

主题

18

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2021-8-19 15:55:39 | 显示全部楼层
   看了一下,之前没加OSIntEnter(); 是因为下面的OSIntNesting++实现了和OSIntEnter()一样的效果。 看来这里没问题。

OS_ENTER_CRITICAL();
    OSIntNesting++;
OS_EXIT_CRITICAL();

void  OSIntEnter (void)
{
    if (OSRunning == OS_TRUE) {
        if (OSIntNesting < 255u) {
            OSIntNesting++;                      /* Increment ISR nesting level                        */
        }
    }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-8-19 17:38:33 | 显示全部楼层
硬汉的小粉丝 发表于 2021-8-19 15:55
看了一下,之前没加OSIntEnter(); 是因为下面的OSIntNesting++实现了和OSIntEnter()一样的效果。 看来这 ...

是的,这个是老版本的玩法。

现在uCOS-III从3.08,uCOS-II从2.93开始,也都开始采用BASEPRI寄存器开关中断的玩法了。

特别注意,现在的新版uCOS-II和III的开关中断也开始采用BASEPRI寄存器设置
http://www.armbbs.cn/forum.php?m ... 3572&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 06:09 , Processed in 0.149717 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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