问题:基于RTOS多任务编程,同一个硬件(比如UART、I2C等)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱”的局面,解决问题方法比较多,下面基于FreeRTOS,以UART为例讲讲常见的互斥、队列这两种方法。
创建互斥量 任务A占用资源 使用资源(发送数据) 任务A释放资源 优先级高的任务B占用资源 使用资源 任务B释放资源 依次,优先级任务占用资源 · ·
伪代码:
//创建互斥量资源
SemaphoreHandle_t xSemaphore = NULL;
xSemaphore = xSemaphoreCreateMutex();
void TaskA(void *pvParameters)
{
for(;;)
{
//占用资源
if(xSemaphoreTake(xSemaphore, 10 ) == pdTRUE)
{
//使用资源(发送数据)
USART_SendNByte();
//释放资源
xSemaphoreGive(xSemaphore);
}
}
}
创建一个队列(发送数据队列) 创建一个任务(UART发送数据任务) 任务A加入队列 任务B加入队列 · · · 另外一个任务C,依次读取队列数据,使用UART发送出去。
伪代码:
QueueHandle_t xQueue;
xQueue = xQueueCreate(QUEUE_LENGTH, QUEUE_ITEM_SIZE);
xTaskCreate(UART_Send_Task, "UART_Send", STACK_SIZE, NULL, TASK_PRIORITY, NULL);
void TaskA(void *pvParameters)
{
for(;;)
{
//任务相关操作
//加入队列
xQueueSend(xQueue, &TaskA_Buf, 10)
}
}
void TaskB(void *pvParameters)
{
for(;;)
{
//任务相关操作
//加入队列
xQueueSend(xQueue, &TaskB_Buf, 10)
}
}
void UART_Send_Task(void *pvParameters)
{
for(;;)
{
//循环读取队列BUF
if(xQueueReceive(xQueue, &Buf, 10) == pdTRUE)
{
USART_SendNByte(&Buf);
}
}
}
以上两种方法比较常用,而且简单。
1.嵌友们,BUG不好找?那是因为宏定义没用好!
2.GD32V RISC-V MCU调试体验
3.2022年六大值得关注的边缘计算趋势
4.2021年第12期《单片机与嵌入式系统应用》电子刊新鲜出炉!
5.STM32的SPI外设片选只有一个,怎么破?
6.C语言开发单片机,为什么都是全局变量形式?
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。