OpenEdv-开源电子网

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

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

[复制链接]

5

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

队列发送任务如下
[mw_shl_code=applescript,true]
//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);
    }
}   

[/mw_shl_code]

接收队列任务如下
[mw_shl_code=applescript,true]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个节拍

    }
}[/mw_shl_code]


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

最佳答案

查看完整内容[请看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) 你试试,队列发送和接收都是用指针的,你用了指针的指针
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

1533

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6369
金钱
6369
注册时间
2015-8-25
在线时间
1004 小时
发表于 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)

你试试,队列发送和接收都是用指针的,你用了指针的指针
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 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的大小
回复

使用道具 举报

5

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

5

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

5

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

5

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2019-4-30
在线时间
42 小时
发表于 2019-11-22 11:00:16 | 显示全部楼层
jishuaihu 发表于 2018-5-30 09:56
还是原子哥的坛子实在人多
我买的是429的板子。不过代码是在自己做的板子上调试的,用的是STM32F103RCT6。 ...

中断里要用xQueueSendToFrontFromISR()
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6077
金钱
6077
注册时间
2018-6-27
在线时间
524 小时
发表于 2020-12-10 11:14:48 | 显示全部楼层
学习学习,学习学习。
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2020-9-29
在线时间
6 小时
发表于 2021-1-9 22:50:34 | 显示全部楼层
由于你创建队列的时候,队列项的大小的16,但是你发送的时候,最终会调用memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize )将RxBuff的数据拷贝到队列中去,此时就发生了访问数组越界。
目前将SI24R1RX_Q_LEN该为8试一下,和RxBuff大小一样。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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