| 
 
中级会员  
 
	积分281金钱281 注册时间2018-5-28在线时间32 小时 | 
 
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)
你试试,队列发送和接收都是用指针的,你用了指针的指针 |