1. STM32时间片调度基础概念
时间片调度是嵌入式实时操作系统(RTOS)中最基础的调度策略之一,它通过将CPU时间划分为固定长度的时间片(Time Slice),让多个任务轮流执行。在STM32这类资源受限的微控制器上实现时间片调度,需要考虑以下几个关键点:
SysTick定时器是Cortex-M内核内置的24位递减计数器,它作为操作系统的"心跳",负责产生周期性中断来触发任务调度。配置SysTick时需要注意:
- 时钟源选择:通常使用处理器时钟(AHB)
- 重装载值计算:RELOAD = (SystemCoreClock / 1000) * 时间片长度(ms) - 1
- 中断优先级设置:建议设为最低优先级以避免影响其他关键中断
任务控制块(TCB)是时间片调度的核心数据结构,它保存了任务的:
- 栈指针(SP)
- 程序计数器(PC)
- 状态寄存器
- 栈空间信息
- 时间片计数器
在STM32上实现时间片调度时,上下文切换是通过PendSV异常来完成的。这种设计有两个优点:
- 可延迟执行:即使在高优先级中断中触发调度,实际切换也会等到中断退出后才执行
- 自动保存上下文:硬件会自动保存R0-R3, R12, LR, PC, xPSR等寄存器
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 时间片调度核心实现步骤
2.1 系统初始化配置
首先需要配置STM32的时钟系统和SysTick定时器:
c复制void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 配置HSE作为时钟源
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 配置时钟树
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}
void SysTick_Init(uint32_t time_ms) {
// 设置重装载值
SysTick->LOAD = (SystemCoreClock /
