硬汉嵌入式论坛

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

[μCOS-II] UCOS里面为什么调用OS_ENTER_CRITICAL会出错?

[复制链接]

62

主题

77

回帖

263

积分

高级会员

积分
263
发表于 2018-6-27 11:11:52 | 显示全部楼层 |阅读模式
在任务里面临界区调用OS_ENTER_CRITICAL(),显示: error:  #20: identifier "cpu_sr" is undefined.

但是includes.h已经包含了




回复

使用道具 举报

0

主题

105

回帖

105

积分

初级会员

积分
105
发表于 2018-6-27 11:50:39 | 显示全部楼层
局部变量未定义。
你应该是选的第3种临界区方案吧。这个方案是把CPU的中断状态保存到一个局部变量,在退出临界区的时候再从这个变量里读取出来,恢复到状态寄存器。
但这个局部变量ucos并没有定义出来,目的可能是为了兼容第1和2种方案的临界区(这个我没仔细研究)。
本体是这个: #define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();},效果相当于你自己在这个地方写了一句代码,代码内容是  cpu_sr = OS_CPU_SR_Save();
所以你需要自己定义一个cpu_sr变量。
一般定义成下面的格式

#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-6-28 00:59:16 | 显示全部楼层
OS_CPU_SR  cpu_sr = 0;

OS_EXIT_CRITICAL()
/////
OS_ENTER_CRITICAL()

知识点补充
1.    当CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_INT_DIS_EN 时
      这种方式最简单,即直接使用处理器的开中断和关中断指令来实现宏。但是不推荐使用这种方式,因为不支持中断嵌套,
      但是考虑到有些处理器或者编译器仅支持这种方式,不得不选择这种方式。

2.    当CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_STK  时
      这种方法稍复杂些,但可使CPU中断使能标志的状态在临界段前和临界段后不发生变化。
      进入临界段前:
             (1) Push/save  中断状态保存到堆栈中
             (2) Disable    关闭中断
      退出临界段:
             (3) Pop/restore  恢复中断标志

3.    当CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL时
      这种方法的前提是,用户使用的C编译器具有扩展功能。用户可获得程序状态字的值,这样就可把该值保存在C函数的局部
      变量中,而不必压到堆栈里。上面的宏定义就是采用的这种方式,也就是(1),(2)注释的地方。





回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2018-6-28 11:18:33 | 显示全部楼层
eric2013 发表于 2018-6-28 00:59
OS_CPU_SR  cpu_sr = 0;

OS_EXIT_CRITICAL()

好的谢谢
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2018-6-28 11:19:22 | 显示全部楼层
barryxiao 发表于 2018-6-27 11:50
局部变量未定义。
你应该是选的第3种临界区方案吧。这个方案是把CPU的中断状态保存到一个局部变量,在退出 ...

好的谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 11:38 , Processed in 0.441805 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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