完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
刚入门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接收队列已满,发送失败!rn"); } else if(err == pdPASS) { printf("SI24R1接收队列发送成功!rn"); } #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个节拍 }} 其他的参数我不知道该提供哪些,有请大神帮帮忙! |
|
相关推荐
7个回答
|
|
err = xQueueSend(SI24R1Rx_Queue,&RxBuff,100); //发送消息队列
改为err = xQueueSend(SI24R1Rx_Queue,RxBuff,100); //发送消息队列 xQueueReceive(SI24R1Rx_Queue,&RxBuff1,portMAX_DELAY) 改为xQueueReceive(SI24R1Rx_Queue,RxBuff1,portMAX_DELAY) 你试试,队列发送和接收都是用指针的,你用了指针的指针 |
|
|
|
//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接收队列已满,发送失败!rn"); } else if(err == pdPASS) { printf("SI24R1接收队列发送成功!rn"); } #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的大小 |
|
|
|
我这儿确实有问题,修改后又试了一下,还是不行,问题一样。明天再详细试试。谢谢
|
|
|
|
实在不行,代码附件出来。你是哪个板子,坛友帮你调试下
|
|
|
|
还是原子哥的坛子实在人多
我买的是429的板子。不过代码是在自己做的板子上调试的,用的是STM32F103RCT6。输出信息用的是USART1 FreeRTOS_STM32F103RCT6.zip (6.09 MB ) 我的测试代码放在了led1_task任务里面。 实际用的是时候在是外部外部中断里发送队列的。 谢谢 |
|
|
|
发送的是数据的长度是必须跟队列长度一致还是比队列长度小就行?
|
|
|
|
结一下帖子。没有找到直接的原因。我在新的例程的一点儿一点儿增加了自己的功能代码,反正能正常运行了。第一次用OS,看来还得一点儿一点儿慢慢来。改一下编译一下,改一点儿运行一下。方便找到问题所在
|
|
|
|
只有小组成员才能发言,加入小组>>
778 浏览 0 评论
1149 浏览 1 评论
2527 浏览 5 评论
2859 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1065浏览 3评论
190浏览 2评论
453浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 06:47 , Processed in 1.005614 second(s), Total 61, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号