admin管理员组文章数量:1566634
可以观察到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();
}
改进后编译一次性成功。
下载到板子里跑,一切正常。
本文标签: 信息OSEXITCRITICALOSENTERCRITICALUCOSIIidentifier
版权声明:本文标题:UCOSII里面为什么调用OS_ENTER_CRITICAL()或OS_EXIT_CRITICAL()会出错,出错信息为:undeclared identifier `cpu_sr‘ 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726269311a1063623.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论