2. 任务与调度核心概念

MICROSAR OS 是符合 AUTOSAR OS 规范的静态实时操作系统。所谓“静态”,是指系统中所有任务、中断、报警、调度表、计数器、资源等对象都在配置阶段(通常由 OIL 或 ARXML 描述)确定,运行时不再动态创建。理解这些术语的含义以及它们之间的相互关系,是后续做任务调度配置、优先级分配和实时性分析的基础。本节不孤立地解释名词,而是把它们放进“谁触发谁、谁等待谁、谁保护谁”的关系网中来看。

一、Task:调度的基本单位

Task 是 OS 调度的最小可执行单元,本质上是一段具有入口函数的 C 代码,由 OS 在合适的时机调用。MICROSAR OS 中的任务分为两类:基本任务(Basic Task)和扩展任务(Extended Task)。基本任务只有“就绪、运行、挂起”三种状态,执行到 return 即结束;扩展任务额外拥有“等待”状态,可以调用 WaitEvent() 等待某个事件,被事件唤醒后重新进入就绪队列。

任务还有“可抢占”与“不可抢占”之分。可抢占任务在更高优先级任务就绪时会被立即剥夺 CPU;不可抢占任务一旦开始运行,必须运行到结束或主动让出。此外,AUTOSAR 还定义了任务类型:Extended 任务可等待事件,Basic 任务不可;而按激活方式又分为由 Alarm/Schedule Table 周期性激活的任务,以及由其他任务或 ISR 通过 ActivateTask() 激活的任务。每个任务有唯一优先级(0 为最低,数值越大优先级越高),相同优先级的任务按 FIFO 排队。

二、ISR:中断服务例程

ISR(Interrupt Service Routine)是响应硬件中断的例程,优先级高于所有任务。MICROSAR OS 将 ISR 分为两类:Category 1(一类中断)不经过 OS 管理,没有 OS 开销,不能调用任何 OS 服务,适合极短、极快的硬件响应;Category 2(二类中断)由 OS 接管,可以调用 ActivateTask()、SetEvent() 等 OS 服务,但会带来一定的进入/退出开销。ISR 与任务的关键区别在于:ISR 运行在中断上下文,不能被任务抢占,且必须尽可能短——通常只做“记录数据、置标志、激活任务”这类动作,把耗时处理交给任务完成。

三、Event:任务间的同步信号

Event 是扩展任务专用的同步机制。一个任务可以等待一个或多个事件,事件由其他任务或二类 ISR 通过 SetEvent() 置位。当事件被置位且等待该事件的任务优先级最高时,任务从等待态转为就绪态。Event 的典型用途是:ISR 收到数据后置位事件,唤醒处理任务;或两个任务通过事件做握手。需要注意,Event 只能由扩展任务等待,基本任务不能使用;每个任务可等待的事件集合在配置时静态定义。

四、Alarm 与 Counter:定时触发的组合

Alarm(报警)是绑定在 Counter(计数器)上的定时动作。Counter 是一个递增或递减的计数源,可以由硬件定时器驱动,也可以由软件通过 IncrementCounter() 驱动。Alarm 在配置时设定“到期值”,当 Counter 达到该值时,Alarm 触发一个动作,动作类型可以是:激活任务、置位事件、调用报警回调函数,或递增另一个 Counter。

举例来说,若 Counter 由 1ms 硬件定时器驱动,配置一个到期值为 10 的 Alarm,则每 10ms 触发一次任务激活,实现 100Hz 的周期任务。Alarm 分为绝对报警和相对报警:绝对报警在 Counter 达到固定值时触发一次;相对报警在每次触发后自动重新装载,实现周期触发。多个 Alarm 可以挂在同一个 Counter 上,形成不同周期的定时任务集合。

五、Schedule Table:多任务的时间同步调度

Schedule Table(调度表)是比 Alarm 更强大的时间触发机制。它把一个周期内的多个“到期点(Expiry Point)”组织成一张表,每个到期点可以激活任务、置位事件。调度表按 Counter 推进,支持单次(Single-shot)和循环(Repeating)两种模式,还支持与全局时间同步(通过 SyncScheduleTable())。相比多个独立 Alarm,调度表能保证同一周期内各任务的激活顺序和相对时刻严格确定,适合对时间确定性要求高的场景,例如电机控制中的电流环、速度环、位置环分层调度。

六、Resource 与 Spinlock:共享资源的保护

当多个任务或 ISR 访问同一共享数据(如全局变量、外设寄存器)时,必须用机制保证访问的原子性。Resource(资源)是 MICROSAR OS 提供的优先级天花板协议(Priority Ceiling Protocol)保护机制。每个资源在配置时被赋予一个“天花板优先级”,任务获取资源时其优先级被临时提升到天花板优先级,从而避免优先级反转,并在释放时恢复。Resource 适用于任务与任务、任务与二类 ISR 之间的互斥。

Spinlock(自旋锁)则用于多核场景。在多核 MCU 上,不同核上的任务可能同时访问共享内存,Resource 无法跨核保护,此时使用 Spinlock。获取 Spinlock 时,若锁被占用,当前核会忙等待(自旋)直到锁释放。Spinlock 必须极短持有,且持有期间通常禁止本地中断,否则会造成严重的实时性下降。简言之:单核内用 Resource,跨核用 Spinlock。

七、相互关系总览

把这些对象串起来看:Counter 是时间基准,Alarm 和 Schedule Table 挂在 Counter 上,按时间触发任务激活或事件置位;ISR 响应硬件中断,通过 ActivateTask() 或 SetEvent() 唤醒任务;任务之间通过 Event 同步,通过 Resource/Spinlock 互斥;OS 调度器根据优先级在就绪任务中选择运行对象。下图展示了这一关系网络。

Counter 时间基准(硬件/软件) Alarm 到期触发动作 Schedule Table 多到期点时间表 ISR 硬件中断响应 Task Basic / Extended 可抢占 / 不可抢占 Event 任务同步信号 仅 Extended Task Resource 优先级天花板(单核) Spinlock 跨核互斥(多核) 图例: 时间驱动 中断触发 事件同步 互斥保护 等待/唤醒 注:Alarm 与 Schedule Table 均依赖 Counter 推进;ISR 可激活 Task 或置位 Event;Task 通过 Resource/Spinlock 保护共享数据。

八、配置时的关键判断

在实际配置中,面对一个需求,可以按以下思路选择对象:如果需求是“每 X 毫秒执行一次某功能”,优先考虑 Alarm 或 Schedule Table;如果多个功能需要严格的时间顺序和相位关系,用 Schedule Table;如果需求是“硬件来了数据就处理”,用二类 ISR 加 Event 唤醒任务;如果需求是“两个任务共享一个缓冲区”,用 Resource;如果系统是多核且共享数据跨核访问,用 Spinlock。这些判断直接决定了后续 OIL/ARXML 中对象声明和参数填写的方式,也是下一节进入具体配置语法前的必要准备。

易混淆点提醒:Event 不是“中断事件”,而是任务间的同步对象;Alarm 不是“硬件报警”,而是绑定 Counter 的定时动作;Resource 不是“内存资源”,而是优先级天花板互斥量。三者在 AUTOSAR 语境下有严格定义,配置时不要按字面意思理解。