FreeRTOS 入门:任务调度与信号量实战

FreeRTOS 实时系统实战

一、为什么需要 RTOS

裸机主循环是“单线程”的:按键响应、显示刷新、传感器读取都得排队。RTOS 让每个功能拥有独立任务,互不阻塞。

二、创建任务

void vTaskLed(void *p) {
  for (;;) {
    HAL_GPIO_TogglePin(LED_Port, LED_Pin);
    vTaskDelay(pdMS_TO_TICKS(500));  // 主动让出 CPU
  }
}

xTaskCreate(vTaskLed, "led", 128, NULL, 1, NULL);
vTaskStartScheduler();   // 启动调度器

三、信号量保护临界资源

两个任务同时操作同一个外设会互相干扰:

xSemaphoreTake(mutex, portMAX_DELAY);
send_uart(data);          // 只有拿到锁才能访问
xSemaphoreGive(mutex);

四、调度与优先级

优先级高的任务先运行;同优先级用时间片轮转。阻塞(延时)是 RTOS 的灵魂,绝不用空转延时。

小结

先学会“一个任务一件事 + 阻塞延时”,再进阶队列与事件组。

评论(12)