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 的灵魂,绝不用空转延时。
小结
先学会“一个任务一件事 + 阻塞延时”,再进阶队列与事件组。