OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6890|回复: 5

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

[复制链接]

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-11-29 20:31:22 | 显示全部楼层 |阅读模式
5金钱
先说问题: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程序模版前段时间测试信号量、邮箱都正常,今天测试队列出现以上情况。

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-11-29 20:31:23 | 显示全部楼层
回复

使用道具 举报

3

主题

400

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1750
金钱
1750
注册时间
2015-6-11
在线时间
309 小时
发表于 2015-11-29 20:31:23 | 显示全部楼层
#define N_MESSAGE 64 
void * MsgGrp[N_MESSAGE] = {NULL};  
是局部变量吧,建立在栈区,在创建函数调用结束后这块地址就释放了,后续处理就是可能正确(相当于free的野指针)
两种解决办法:
void * MsgGrp[N_MESSAGE] = (void *)malloc(sizeof(int));
或者将
void * MsgGrp[N_MESSAGE] = {NULL};  定义为全局变量都可以,建议这种。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-29 20:31:23 | 显示全部楼层
回复【5楼】zc123:
---------------------------------
修改了一下os_q.c文件中OSQPend函数的部分代码(如下),并不一定是问题所在,但目前能够使用OSQpend函数了,是否有不良影响还未可知

if(pq->OSQIn == pq->OSQStart)     //添加
{
pq->OSQIn = pq->OSQStart + 1;
pq->OSQEntries++;
}
    *pq->OSQIn++ = pmsg;                               /* Insert message into queue                    */
pq->OSQEntries++;                                  /* Update the nbr of entries in the queue       */
    if (pq->OSQIn == pq->OSQEnd) {                     /* Wrap IN ptr if we are at end of queue        */
        pq->OSQIn = pq->OSQStart;
    }

谢谢你的指导,Thank you~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-30 12:14:01 | 显示全部楼层
回复【3楼】zc123:
---------------------------------
谢谢指导

void * MsgGrp[N_MESSAGE] = {NULL}; 是和#define N_MESSAGE 64一起定义在函数外的全局变量

你给指了一个进一步查找测试的方向,回去再试试
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

3

主题

400

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1750
金钱
1750
注册时间
2015-6-11
在线时间
309 小时
发表于 2015-11-30 12:36:44 | 显示全部楼层
回复【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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 18:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表