嵌入式学习小组
直播中

林霆景

7年用户 213经验值
私信 关注

ucos控制SIM900任务切换进入硬件错误死循环

本人初学 ucos ,用了发烧友的开发板提供的  实验54  作为  使用ucos  的 基础
我创建了 三个任务:
Task1 :  纯粹计数该任务执行次数;
void Task1(void *pdata){// OS_CPU_SR cpu_sr=0;pdata = pdata; while(1){cnt++;OStimeDlyHMSM(0,0,1,0);}}Task2 : 发送AT指令;
void Task2(void *pdata){// OS_CPU_SR cpu_sr=0;pdata = pdata; while(1){OSSemPend(SIM900_Device, 0, &err);//请求占用SIM900SIM_TxStr("AT");//发送AT指令SIM_TxByte(CR);OSSemPend(SIM900_CMD_Ans, 0, &err);//等待Task3发出的结果OSSemPost(SIM900_Device);//释放对SIM900的占用}}Task3 : 处理SIM900的相应结果;
void Task3(void *pdata){// OS_CPU_SR cpu_sr=0;pdata = pdata;while(1){OSMboxPend(SIM900_Msg, 0, SIM900_err_msg);//等待SIM900响应//...... 处理响应结果OSSemPost(SIM900_CMD_Ans);//发送处理结果}}串口中断:
判断并提取 SIM900 响应字符,通过 邮箱 将该字符串 发送给 Task3 处理;
问题:
运行会死机,进入
HardFault_Handler                PROC                EXPORT  HardFault_Handler          [WEAK]                B       .                ENDP
不知道什么情况,请求高手们指点!!
附件中做了详细注释
实验54 UCOSII实验2-信号量和邮箱.rar (1.62 MB )

回帖(6)

王军

2019-4-16 09:09:06
一般是内存访问错误,检查指针,访问是否异常。
仿真跟踪看看。
举报

谢芳芳

2019-4-16 09:28:45
站长,我运行的时候,是进入 串口中断(SIM900有对AT响应) 后出来时候出错的。出来后进入  空闲任务,然后就出错了,
我这里面 没使用什么指针啊····   不过在中断里面,用了 个 memncpy(); 来拷贝所需的字符串 
您方便试着用战舰开发板试一试我提供的工程吗?
举报

张依弛

2019-4-16 09:44:03
和memcpy关系不大,主要考虑是不是你的任务堆栈设置小了,我看你的任务都是用邮箱传递的,去掉邮箱试试。看还死机不。
举报

王蓓

2019-4-16 10:01:24
全部都改成 信号量了,堆栈大小也修改过,仍然是死机,
我看了 0xE000_ED2A (用法fault状态寄存器)这地方的内存,是02,权威指南  解释是 INVSTATE 错误,
可能出错原因:
1.  加载到PC中的跳转地址值是偶数(LSB=0 )。通过检查入栈 C的值,一下子
就可以查出该问题。 
2.  向量地址的LSB=0 ,诊断方法同上。 
3.  入栈的PSR 在异常处理过程中被破坏,使得在返回时内核尝试进入 ARM 状态。
但我不确定,而且这方面也不知道怎么改···
举报

更多回帖

发帖
×
20
完善资料,
赚取积分