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

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条回答
正点原子
1楼-- · 2019-07-21 02:11
帮顶....
zc123
2楼-- · 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};  定义为全局变量都可以,建议这种。
龙之谷
3楼-- · 2019-07-21 11:28
 精彩回答 2  元偷偷看……
龙之谷
4楼-- · 2019-07-21 13:52
 精彩回答 2  元偷偷看……
zc123
5楼-- · 2019-07-21 14:30
回复【4楼】龙之谷:
---------------------------------
如果不是这个问题的话你去检查下os_cfg.h里面109~117行,正确的应该是
#define OS_Q_EN                              1u
#define OS_Q_ACCEPT_EN                1u                    
#define OS_Q_DEL_EN                      1u 
#define OS_Q_FLUSH_EN                  1u 
#define OS_Q_PEND_ABORT_EN        1u   
#define OS_Q_POST_EN                    1u   
#define OS_Q_POST_FRONT_EN        1u   
#define OS_Q_POST_OPT_EN            1u    
#define OS_Q_QUERY_EN                  1u

一周热门 更多>