中级会员
- 积分
- 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)
你试试,队列发送和接收都是用指针的,你用了指针的指针
|