6.FreeRTOS_队列进行任务间通信

本文内容的基础知识点在博文 “ FreeRTOS_队列基础知识 ”中,博文链接如下:

FreeRTOS_队列基础知识-优快云博客

本文的代码基础在博文  “ FreeRTOS_任务创建与删除 ”中,博文链接如下:

FreeRTOS_任务创建与删除-优快云博客

队列实现任务间通信

队列实现任务间通信的步骤有3步:

  • 定义一个队列句柄
  • 创建队列
  • 在两个任务中分别写队列和读队列

具体代码如下:

/* 任务1处理函数 */
void Task1Function(void *param){
	
	int i=0;
	while(1){
		
		xQueueSend((QueueHandle_t)param,&i,portMAX_DELAY);/* 写队列 */
		printf("i%d ",i);
		i++;
	}
}
/* 任务2处理函数 */
void Task2Function(void *param){
	
	int j=0;
	while(1){
		xQueueReceive((QueueHandle_t)param,&j,portMAX_DELAY);/* 读队列 */
		printf("j%d ",j);
	}
}

int main( void )
{
#ifdef DEBUG
  debug();
#endif
	
	TaskHa
### 创建队列FreeRTOS中,首先需要创建一个队列用于任务的数据传输。队列的创建通过`xQueueCreate`函数实现,该函数接受两个参数:队列的长度和每个队列项的大小。 ```c QueueHandle_t QueueHandle_Test; QueueHandle_Test = xQueueCreate(2, sizeof(int)); ``` 如果队列创建失败,返回值将为NULL[^3]。 ### 发送数据到队列 任务可以通过调用`xQueueSend`函数将数据发送到队列中。此函数允许任务在指定的时内等待队列变得可用。 ```c void Task1Function(void *param) { int i = 0; while (1) { xQueueSend((QueueHandle_t)param, &i, portMAX_DELAY); printf("i%d ", i); i++; } } ``` 在这个例子中,任务1不断地向队列发送整数值i,并打印当前的i值。 ### 从队列接收数据 另一个任务可以使用`xQueueReceive`函数从队列中读取数据。这个函数同样允许任务在指定时内等待数据变得可用。 ```c void Task2Function(void *param) { int j = 0; while (1) { xQueueReceive((QueueHandle_t)param, &j, portMAX_DELAY); printf("j%d ", j); } } ``` 任务2持续地从队列中取出整数值并打印它们[^3]。 ### 初始化与任务创建 在主函数中,初始化硬件和串口通信后,创建两个任务并启动调度器。 ```c int main(void) { #ifdef DEBUG debug(); #endif TaskHandle_t xHandleTask1; TaskHandle_t xHandleTask2; QueueHandle_t QueueHandle_Test; prvSetupHardware(); SerialPortInit(); printf("UART TEST\r\n"); QueueHandle_Test = xQueueCreate(2, sizeof(int)); if(QueueHandle_Test == NULL){ printf("queue create fail\r\n"); } xTaskCreate(Task1Function, "Task1", 100, (void*)QueueHandle_Test, 1, &xHandleTask1); xTaskCreate(Task2Function, "Task2", 100, (void*)QueueHandle_Test, 1, &xHandleTask2); vTaskStartScheduler(); return 0; } ``` 这段代码展示了如何设置硬件、初始化串口、创建队列以及创建任务的过程。 ### 注意事项 - 在中断服务程序中不能调用可能导致阻塞的API函数,应使用`FromISR`版本的API。 - 队列的设计应该考虑到内存限制和性能需求,合理设置队列大小。 - 使用队列时需要注意同步问题,确保数据的一致性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值