
1) 【一句话结论】采用基于优先级的抢占式实时调度(如Rate Monotonic Scheduling,RMS),结合硬件中断优先级管理、静态内存分配,并预留调度开销(任务周期设为0.9ms预留0.1ms),通过任务间通信优化(如信号量)和优先级继承协议解决优先级反转,确保所有任务周期≤1ms,满足导弹制导的严格实时性要求。
2) 【原理/概念讲解】老师口吻解释:实时性严格意味着系统需快速响应周期性任务和突发中断。核心是任务调度策略(决定任务执行顺序)、中断处理机制(处理突发数据)和内存管理(避免分配延迟)。
3) 【对比与适用场景】
| 算法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Rate Monotonic Scheduling (RMS) | 根据任务周期分配优先级,周期越短优先级越高 | 预计算优先级,抢占式,适合周期性任务(假设任务周期互不重叠) | 导弹制导中周期性计算(导航、控制) | 若任务周期重叠,可能不满足截止期 |
| Earliest Deadline First (EDF) | 根据任务截止期分配优先级,动态调整 | 非抢占式(可配置为抢占),适合截止期不固定的任务 | 应急处理、非周期性任务(如故障恢复) | 需实时计算截止期,计算开销大,可能增加延迟 |
4) 【示例】伪代码:
typedef struct {
uint32_t priority; // 优先级(周期越短优先级越高)
uint32_t period; // 周期 (ms),预留0.1ms调度开销
void (*task_func)(void);
} Task;
void imu_isr(void) {
uint16_t acc = read_accelerometer();
uint16_t gyro = read_gyroscope();
osSignalSet(NAVIGATION_SEM, 1);
clear_interrupt_flag();
}
void navigation_task(void) {
osWaitMessage(NAVIGATION_SEM);
update_state(acc, gyro);
osSignalSet(CONTROL_SEM, 1);
}
void control_output_task(void) {
osWaitMessage(CONTROL_SEM);
generate_control_signal();
}
void schedule_tasks(void) {
static uint32_t next_time = 0;
uint32_t now = get_system_time();
if (now >= next_time) {
navigation_task();
next_time = now + 1;
}
if (now >= next_time) {
control_output_task();
next_time = now + 2;
}
}
void main(void) {
osInit();
init_imu();
init_tasks();
while (1) {
schedule_tasks();
}
}
(注:假设使用RTOS,如FreeRTOS,信号量用于任务间通信,避免共享变量导致的优先级反转;任务周期计算时预留调度开销,确保实际执行时间≤1ms。)
5) 【面试口播版答案】
“面试官您好,我设计的导弹制导嵌入式控制系统,核心是通过优先级调度、快速中断和静态内存分配,并预留调度开销,确保实时性。具体来说,任务调度策略采用Rate Monotonic Scheduling(RMS),根据任务周期分配优先级,周期越短优先级越高,比如导航计算任务周期1ms,优先级最高,控制输出任务周期2ms,次之,确保关键任务及时执行;中断处理机制上,传感器数据(如IMU)通过硬件中断触发,中断服务程序(ISR)仅执行必要操作(读取数据并更新状态),执行时间控制在0.5ms以内,避免阻塞任务,同时设置中断优先级高于任务,保证突发数据及时处理;内存管理采用静态分配,任务栈和中断栈在系统启动前预分配,避免动态内存分配的延迟,确保所有任务周期精确≤1ms。此外,通过硬件信号量实现任务间通信,并采用优先级继承协议(PIP)解决优先级反转问题,进一步保障实时性。任务周期计算时预留0.1ms调度开销(如中断处理、任务切换),例如导航任务实际执行0.9ms,预留0.1ms用于调度,确保总周期≤1ms。这样,系统可以严格满足导弹制导的实时性要求。”
6) 【追问清单】
7) 【常见坑/雷区】