OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 702|回复: 7

FreeRTOS发送消息队列失败的问题

[复制链接]

  离线 

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2018-5-28
在线时间
22 小时
发表于 2018-5-29 12:03:13 | 显示全部楼层 |阅读模式
1金钱
刚入门FreeRTOS,正在学习发送消息队列。程序参考原子哥的例子写的。在执行          err = xQueueSend(SI24R1Rx_Queue,&RxBuff,100);   这一句的时候。总是会进入到HardFault_Handler中断里面,我感觉是复制内存的时候出的问题,但是无法确认。作为初学者,我也看了很多消息队列的资料,介绍也都大同小异。但是在用的时候有些东西还是无法确定,比如队列里的长度和深度如何确定,这些参数跟创建任务的时候的堆栈大小有没有什么关系。我也知道这些东西是根据实际工程需求确定,但是对新手来说很重要。

言归正传,我的主要代码如下:

队列发送任务如下
[AppleScript] 纯文本查看 复制代码
//LED0任务函数 
void led1_task(void *pvParameters)
{    
    Uint8 RxBuff[8]= {8,1,2,3,4,5,6,7};
    BaseType_t err;
    
    while(1)
    {
        LED1=~LED1;
        if(SI24R1Rx_Queue != NULL)
        {
            err = xQueueSend(SI24R1Rx_Queue,&RxBuff,100);   //发送消息队列,
            #ifdef JSH_DEBUG
            if(err==errQUEUE_FULL)   	//表示队列已满
            {
                printf("SI24R1接收队列已满,发送失败!\r\n");
            }
            else if(err == pdPASS)
            {
                printf("SI24R1接收队列发送成功!\r\n");
            }
            #endif
       }
        
        vTaskDelay(1000);
    }
}   



接收队列任务如下
[AppleScript] 纯文本查看 复制代码
void TestRev_task(void *pvParameters)
{
     Uint8 RxBuff1[16]={0};
   char Rechar[64]={0};
    Uint8 i;
    
    while(1)
    {
        if(SI24R1Rx_Queue != NULL)  //SI24R1 接收队列创建成功
        {
            if(xQueueReceive(SI24R1Rx_Queue,&RxBuff1,portMAX_DELAY) == pdPASS  )//请求消息SI24R1Rx_Queue,一直等待
            {
                
                printf("接收到数据,长度为%d:",RxBuff1[0]);
               // RxBuff1[0] = 5;
                for(i = 0;i < RxBuff1[0];i++)
                {
                   ByteToChar(RxBuff1[i+1],&Rechar[i*3]);
                }
                Rechar[RxBuff1[0] * 3 ] = '\r';
                Rechar[RxBuff1[0] * 3 + 1] = '\n';
                printf((char *)&Rechar[0]);
            }
           
        }

        vTaskDelay(50); //如果队列没有创建成功,等待50个节拍

    }
}



其他的参数我不知道该提供哪些,有请大神帮帮忙!

最佳答案

查看完整内容[请看2#楼]

err = xQueueSend(SI24R1Rx_Queue,&RxBuff,100); //发送消息队列 改为err = xQueueSend(SI24R1Rx_Queue,RxBuff,100); //发送消息队列 xQueueReceive(SI24R1Rx_Queue,&RxBuff1,portMAX_DELAY) 改为xQueueReceive(SI24R1Rx_Queue,RxBuff1,portMAX_DELAY) 你试试,队列发送和接收都是用指针的,你用了指针的指针
回复

使用道具 举报

  离线 

8

主题

466

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1368
金钱
1368
注册时间
2015-8-25
在线时间
261 小时
发表于 2018-5-29 12:03:14 | 显示全部楼层
err = xQueueSend(SI24R1Rx_Queue,&RxBuff,100);   //发送消息队列
改为err = xQueueSend(SI24R1Rx_Queue,RxBuff,100);   //发送消息队列

xQueueReceive(SI24R1Rx_Queue,&RxBuff1,portMAX_DELAY)
改为xQueueReceive(SI24R1Rx_Queue,RxBuff1,portMAX_DELAY)

你试试,队列发送和接收都是用指针的,你用了指针的指针
回复

使用道具 举报

  离线 

0

主题

189

帖子

0

精华

高级会员

Rank: 4

积分
748
金钱
748
注册时间
2017-5-27
在线时间
86 小时
发表于 2018-5-29 12:19:48 | 显示全部楼层
//LED0任务函数
void led1_task(void *pvParameters)
{   
   Uint8 RxBuff[8]= {8,1,2,3,4,5,6,7};
    BaseType_t err;
     
    while(1)
    {
        LED1=~LED1;
        if(SI24R1Rx_Queue != NULL)
        {
           err = xQueueSend(SI24R1Rx_Queue,&RxBuff,100);   //发送消息队列,
            #ifdef JSH_DEBUG
            if(err==errQUEUE_FULL)      //表示队列已满
            {
                printf("SI24R1接收队列已满,发送失败!\r\n");
            }
            else if(err == pdPASS)
            {
                printf("SI24R1接收队列发送成功!\r\n");
            }
            #endif
       }
         
        vTaskDelay(1000);
    }
}
void TestRev_task(void *pvParameters)
{
     Uint8 RxBuff1[16]={0};
   char Rechar[64]={0};
    Uint8 i;
     
    while(1)
    {
        if(SI24R1Rx_Queue != NULL)  //SI24R1 接收队列创建成功
        {
            if(xQueueReceive(SI24R1Rx_Queue,&RxBuff1,portMAX_DELAY) == pdPASS  )//请求消息SI24R1Rx_Queue,一直等待
            {
                 
                printf("接收到数据,长度为%d:",RxBuff1[0]);
               // RxBuff1[0] = 5;
                for(i = 0;i < RxBuff1[0];i++)
                {
                   ByteToChar(RxBuff1[i+1],&Rechar[i*3]);
                }
                Rechar[RxBuff1[0] * 3 ] = '\r';
                Rechar[RxBuff1[0] * 3 + 1] = '\n';
                printf((char *)&Rechar[0]);
            }
            
        }

        vTaskDelay(50); //如果队列没有创建成功,等待50个节拍

    }
}


注意红色的部分,以及SI24R1Rx_Queue的大小
回复

使用道具 举报

  离线 

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2018-5-28
在线时间
22 小时
 楼主| 发表于 2018-5-29 22:19:52 | 显示全部楼层
szczyb1314 发表于 2018-5-29 12:39
err = xQueueSend(SI24R1Rx_Queue,&RxBuff,100);   //发送消息队列
改为err = xQueueSend(SI24R1Rx_Queue, ...

我这儿确实有问题,修改后又试了一下,还是不行,问题一样。明天再详细试试。谢谢
回复

使用道具 举报

  离线 

19

主题

272

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1437
金钱
1437
注册时间
2017-7-6
在线时间
204 小时
发表于 2018-5-30 08:55:04 | 显示全部楼层
实在不行,代码附件出来。你是哪个板子,坛友帮你调试下
回复

使用道具 举报

  离线 

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2018-5-28
在线时间
22 小时
 楼主| 发表于 2018-5-30 09:56:44 | 显示全部楼层
还是原子哥的坛子实在人多
我买的是429的板子。不过代码是在自己做的板子上调试的,用的是STM32F103RCT6。输出信息用的是USART1

FreeRTOS_STM32F103RCT6.zip (6.09 MB, 下载次数: 29)
回复

使用道具 举报

  离线 

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2018-5-28
在线时间
22 小时
 楼主| 发表于 2018-5-30 10:01:22 | 显示全部楼层
lanlzp 发表于 2018-5-29 12:19
//LED0任务函数
void led1_task(void *pvParameters)
{   

发送的是数据的长度是必须跟队列长度一致还是比队列长度小就行?
回复

使用道具 举报

  离线 

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2018-5-28
在线时间
22 小时
 楼主| 发表于 2018-6-2 15:49:10 | 显示全部楼层
结一下帖子。没有找到直接的原因。我在新的例程的一点儿一点儿增加了自己的功能代码,反正能正常运行了。第一次用OS,看来还得一点儿一点儿慢慢来。改一下编译一下,改一点儿运行一下。方便找到问题所在
回复

使用道具 举报

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

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-24 09:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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