1. 在FreeRTOS中,任务通信可以通过一下函数来实现:
-
xQueueCreate():用于创建一个消息队列,可以设置队列长度和每个消息的大小;
xQueueSend():将一条消息发送到队列中,可以选择阻塞式或非阻塞式发送;
xQueueReceive():从队列中接收一条消息,可以选择阻塞式或非阻塞式接收;
xQueuePeek():查看队列中的下一条消息,但不将其删除;
xQueueReset():清空队列中的所有消息。
-
xQueueSemaphore Take()和xQueueSemaphoreGive():用于实现二值信号量,控制任务之间的互斥访问;
xSemaphoreCreateMutex():创建一个互斥信号量,用于实现任务间的互斥访问;
-
xTaskNotify()和ulTaskNotifyTake():用于任务间的通知机制,一个任务可以通知另一个任务进行某种操作;
-
xEventGroupCreate()和xEventGroupSetBits()和xEventGroupWaitBits():用于创建、设置和等待事件组。
2.消息队列一般用于以下几个地方:
2.1数据传递:消息队列运行任务之间传递数据,一个任务将数据打包成消息发送到队列,另一个任务则可以从队列中接收该消息并处理其中的数据。这使得任务之间可以方便地进行数据交换和共享。
2.2 任务解耦:通过消息队列,任务之间的耦合可以降低。一个任务只需要关注和发送消息,而不需要知道消息的具体处理细节和目标任务的实现。这样,当需要更改或替换某个任务时,只需要保证消息的格式和接口不变即可,不会对其他任务产生影响。
2.3 同步与协作:消息队列可以用于实现任务之间的同步和协作。一个任务可以等待某个特定的消息到达队列后才继续执行,从而实现任务的同步。另外,多个任务可以通过发送和接收消息来协调彼此的执行顺序和操作。
2.4缓冲和调节:消息队列可以充当缓冲区,用于存储一定的消息量。当发送方发送消息速度较快,而接收方处理速度较慢时,消息队列可以暂时存储未处理的消息,避免数据丢失。同时,消息队列还可以调节发送和接收任务之间的速度差异,以平衡任务负载。
Queue Name:队列名称
Queue Size:队列能够粗糙的最大单元数目,即队列深度
Queue Size:队列中数据单元的长度,以字节为单位
Allocation:分配方式:
Dynamic 动态存储创建
Buffer Name:缓冲区名称
Buffer Size:缓冲区大小
Conrol Block Name:控制块名称
Task Name:任务名称
Priority:优先级,数值越大优先级越高,0表示最低优先级
Stack Size:堆栈大小,字为单位,一个字等于4字节
Entry Function:入口函数名称
Code Generation Option:代码生成选项
Parameter:任务入口函数形参
Allocation:分配方式
3.创建工程:
1.添加队列消息的任务,只需要修改函数名称和任务名称即可,其他的参数都保持默认的值;
2.在下面的队列消息里添加一项队列,其中只修改前三项即可;
3.生成代码
栈的作用:
1.返回的寄存器地址值,函数调用。栈的大小主要取决于最复杂的调用深度:A>B>C>D>E,就是5级调用(被调用者寄存器共R1~R11共8个还有LR一个,每个寄存器占据4个字节,所以就是5*9*4),调用深度越深,用到的栈越大。
2.局部变量,char buf【1000】
3.现场:假若栈式16,那么16*4=64byte