FreeRTOS 操作系统支持三种调度方式: 抢占式调度,时间片调度和合作式调度。 实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少.
1,抢占式调度
每个任务都有不同的优先级, 任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,比如 vTaskDelay(延迟,事件标志等待,信号量等待)才会切换到其他任务。抢占式调度要掌握的最关键一点是: 每个任务都被分配了不同的优先级, 抢占式调度器会获得就绪列表中优先级最高的任务,并运行这个任务。
FreeRTOS 操作系统是设置的数值越小任务优先级越低, 数值越大任务优先级越高,由于任务2的优先级高于任务1,因此任务2将首先运行。
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#define TASK1_PRIORITY (tskIDLE_PRIORITY + 1)
#define TASK2_PRIORITY (tskIDLE_PRIORITY + 2)
// 任务函数原型
void vTask1(void *pvParameters);
void vTask2(void *pvParameters);
// 任务1函数
void vTask1(void *pvParameters) {
const char *pcTaskName = (const char *)pvParameters;
for (;;) {
// 打印任务名
printf("%s is running\n", pcTaskName);
// 延时一段时间,模拟任务的工作负载
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
// 任务2函数
void vTask2(void *pvParameters) {
const char *pcTaskName = (const char *)pvParameters;
for (;;) {
// 打印任务名
printf("%s is running\n", pcTaskName);
// 延时一段时间,模拟任务的工作负载
vTaskDelay(pdMS_TO_TICKS(500));
}
}
int main(void) {
// 创建任务
xTaskCreate(vTask1, "Task 1", configMINIMAL_STA