先说问题: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程序模版前段时间测试信号量、邮箱都正常,今天测试队列出现以上情况。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
void * MsgGrp[N_MESSAGE] = {NULL};
是局部变量吧,建立在栈区,在创建函数调用结束后这块地址就释放了,后续处理就是可能正确(相当于free的野指针)
两种解决办法:
void * MsgGrp[N_MESSAGE] = (void *)malloc(sizeof(int));
或者将
void * MsgGrp[N_MESSAGE] = {NULL}; 定义为全局变量都可以,建议这种。
---------------------------------
如果不是这个问题的话你去检查下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
一周热门 更多>