UCOSII里面为什么调用OS_ENTER_CRITICAL()或OS_EXIT_CRITICAL()会出错,出错信息为:undeclared identifier `cpu_sr‘

 可以观察到OSTickISR_Init()函数内部调用了OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),并且:

     1、该OSTickISR_Init()函数所在的.C文件包含了includes.h文件

                        #include "includes.h"

     2、OS_CPU.H 有如下宏定义

                  #define  OS_CRITICAL_METHOD    3

但是编译系统报错,错误信息为:undeclared identifier `cpu_sr'。

原因

        uCOSII有3种临界区方案,系统默认选择第3种临界区方案(参见OS_CPU.H)。这个方案是把CPU的中断状态保存到一个局部变量,在退出临界区的时候再从这个变量里读取出来,恢复到状态寄存器。
        但这个局部变量ucos并没有定义出来,目的可能是为了兼容第1和2种方案的临界区(这个我没仔细研究)。
        本体是这个: #define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();},效果相当于你自己在这个地方写了一句代码,代码内容是  cpu_sr = OS_CPU_SR_Save();
        所以你需要自己定义一个cpu_sr变量。

解决方法

       具体来说,你需要在OSTickISR_Init()函数自己定义一个cpu_sr变量(局部变量)。一般定义成下面的格式

#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif

下面是改进的OSTickISR_Init()函数

 代码

void  OSTickISR_Init (void)
{      
	#if  OS_CRITICAL_METHOD == 3
	 OS_CPU_SR  cpu_sr;
	#endif   

	//CLI();
    OS_ENTER_CRITICAL();
	TCCR0 = 0x00; //stop
	ASSR  = 0x00; //set async mode
	TCNT0 = 0x06; //set count
	OCR0  = 0xFA;
	TCCR0 = 0x04; //start timer
    TIMSK |= 0x02; //timer interrupt sources
	//SEI();
    OS_EXIT_CRITICAL(); 
}

改进后编译一次性成功。

 下载到板子里跑,一切正常。

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值