消息队列出现死机情况,请指导,谢谢

2019-07-21 00:51发布

先说问题:1.在任务中调用OSQPend函数,如果等待时间不设置为0,直接死机;如果设置为0,每次队列中最多只能有一条消息,如果第一条没处理完,OSQPost第二条直接死机;2.调用OSQAccept函数直接死机。请指导,谢谢~~~~~

相关信息如下:
1.各种变量定义的准备工作 [mw_shl_code=c,true]uchar * message1 = NULL; uchar * message2 = NULL; uchar * message3 = NULL; #define N_MESSAGE 64 void * MsgGrp[N_MESSAGE] = {NULL}; OS_EVENT *Str_Q = NULL; Str_Q = OSQCreate(&MsgGrp[0], N_MESSAGE); //开始任务中定义[/mw_shl_code] 2.对使用消息队列的任务都定义大堆栈(512) [mw_shl_code=c,true]#define LED0_TASK_PRIO 6 #define LED0_STK_SIZE 512 extern OS_STK LED0_TASK_STK[LED0_STK_SIZE]; void led0_task(void *pdata); #define BEEPKEY_TASK_PRIO 8 #define BEEPKEY_STK_SIZE 512 extern OS_STK BEEPKEY_TASK_STK[BEEPKEY_STK_SIZE]; void beepkey_task(void *pdata);[/mw_shl_code] 3.两个设计队列的任务代码如下 [mw_shl_code=c,true]/********************************************************************* 功能 :LED0任务 ********************************************************************************************/ void led0_task(void *pdata) { uchar i, err; uchar *ss = NULL; while(1) { ss = OSQPend(Str_Q, 0, &err); delay_ms(100); if(!strcmp(ss, "key0")) { for(i=0; i<5; i++) { LED0 = 0; delay_ms(1000); LED0 = 1; delay_ms(1000); } } else if(!strcmp(ss, "key1")) { for(i=0; i<5; i++) { LED0 = 0; delay_ms(300); LED0 = 1; delay_ms(300); } } else if(!strcmp(ss, "key2")) { for(i=0; i<5; i++) { LED0 = 0; delay_ms(1500); LED0 = 1; delay_ms(1500); } } delay_ms(100); } } /********************************************************************* 功能 :BEEPKEY任务 ********************************************************************************************/ void beepkey_task(void *pdata) { uchar keynum = 0xff; while(1) { keynum = Key_Scan(0); if(keynum == 0) { // BEEP = !BEEP; message1 = "key0"; OSQPost(Str_Q, message1); delay_ms(150); } else if(keynum == 1) { message2 = "key1"; OSQPost(Str_Q, message2); delay_ms(150); } else if(keynum == 2) { message3 = "key2"; OSQPost(Str_Q, message3); delay_ms(150); } else if(keynum == 3) { message1 = NULL; message2 = NULL; message3 = NULL; } delay_ms(50); } } [/mw_shl_code] 4.其他信息:按键采用循环检测(非中断)模式,os_cfg.h中配置与原子哥ucosii实验配置一样,移植ucosii程序模版前段时间测试信号量、邮箱都正常,今天测试队列出现以上情况。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
zc123
2019-07-21 06:04
#define N_MESSAGE 64 
void * MsgGrp[N_MESSAGE] = {NULL};  
是局部变量吧,建立在栈区,在创建函数调用结束后这块地址就释放了,后续处理就是可能正确(相当于free的野指针)
两种解决办法:
void * MsgGrp[N_MESSAGE] = (void *)malloc(sizeof(int));
或者将
void * MsgGrp[N_MESSAGE] = {NULL};  定义为全局变量都可以,建议这种。

一周热门 更多>