3.4 操作系统


3.4 操作系统

本节摘要:AUTOSAR OS 是 Classic 的节拍器。它继承 OSEK/VDX 对确定性、静态内存、可验证性的坚持,并按多核、分区、调度表做了升维。运行实体被映射进任务,中断分范畴,资源用优先级天花板一类协议管理。读完应能解释为何应用不该自己开线程,以及调度表如何把时间变成可枚举的格子。

学习目标

阅读完本节,你应当能够:

  1. 说出 OS 从 OSEK 继承了什么、为 AUTOSAR 补了什么。
  2. 区分任务、ISR、事件、资源、计数器、调度表。
  3. 说明运行实体与任务的映射关系。
  4. 在多核场景指出核间通信为何必须走配置对象而不是私有共享内存。

一、从 OSEK 到可组合的实时内核

上世纪九十年代,OSEK 与 VDX 为控制器软件的可移植性定义了轻量实时内核:任务、中断服务、事件、资源,固定优先级,有限内存模型。那是单核、功能边界清晰的年代。AUTOSAR 面对的是一颗 ECU 上多域功能、组件由不同供应商提供、硬件走向多核和内存保护。把旧缰绳套在新车上,方向还在,速度和协同不够。

升维而不是推倒。魂仍是时间确定性、内存安全、可验证。形变成可配置模块:内核核心、计时、同步、错误处理、核间通信。低端单核车身控制器可以裁掉核间模块;双核上高等级动力加低等级车身,则要分区和内存保护。API 语义更细:激活任务表示请求,真正运行还受调度状态和调度表约束;在错误的上下文调终止任务会被明确禁止。这些是可被检查的断言,不是编程建议。

硬件细节经抽象隔离。开发者面对逻辑中断对象,而不是某家芯片的中断号手册。芯片延迟差异被封在 BSW 内部,向上交付行为更一致的虚拟执行环境。

图:调度金字塔

图:调度金字塔

二、对象清单和映射

任务是调度单位。基本任务跑完结束,扩展任务可等事件。中断分范畴:一类尽量短,二类可以调用有限 OS 服务。资源保护共享对象,常用优先级天花板,避免优先级反转。计数器连接硬件时钟或软件滴答。调度表在计数器上排出激活偏移,让十毫秒、二十毫秒、一百毫秒任务错开相位,而不是整点一起冲。

RTE 把运行实体塞进这些任务。一个十毫秒任务里可能顺序调用五个运行实体。顺序在配置里固定,最坏执行时间是五者之和加系统开销。应用若在运行实体里死等,等于破坏这份加法。通信接收中断应当置位或把数据送进缓冲,而不是在中断里跑控制律。

多核引入核间通信对象。跨核共享必须经配置的队列或缓冲区,带确定的拷贝语义,而不是两个核随便指同一块内存。后者在缓存和重排序下会把“偶发数据撕裂”变成不可复现的安全缺陷。

对象 职责 应用侧常见误用
任务 运行实体的容器 在应用里动态创建任务
ISR 最短路径响应硬件 在中断里跑控制算法
调度表 相位与周期的证明材料 用忙等代替表
资源 互斥与优先级协议 关全局中断当锁
核间对象 跨核确定拷贝 私有共享内存

⚠️ 常见坑:为了“简单”,所有运行实体塞进一个大循环任务。看起来能跑,抢占和截止期分析会失去结构,一个慢存储写就能拖死制动相关逻辑。
💡 关键直觉:OS 卖的是时间主权。功能可以复杂,时间格子必须能数清。

三、与存储、通信、诊断的节拍关系

Flash 擦写可能很长。它必须落在允许被延迟的任务里,并声明最坏时间。通信接收高峰不能让低优先级任务饿死到看门狗复位——这要用优先级和调度表一起设计,而不是现场提高某一个任务“试试”。诊断刷写往往切换模式:停止部分任务,放宽或改变看门狗。模式管理器、OS 和诊断栈要有同一份生命剧本。

错误钩子把非法 API 调用、栈溢出、截止期错过收成可配置动作:复位、进安全状态、记事件。钩子里不能再做复杂分配和阻塞。它是最后的反射,不是第二个应用层。

Classic 禁用随意堆分配,与 OS 的静态内存模型一致。栈大小在链接和配置里给定。溢出要在集成时用分析或注水测试抓住。现场才发现栈爆,通常已经伴随难以解释的数据损坏。

四、对照 Adaptive 只记一句

Adaptive 跑在 POSIX 兼容内核上,进程、线程、公平调度、动态加载是一等公民。那套哲学服务的是可演化,不是微秒级可证明。把 Linux 的线程习惯带回 Classic ECU,是用错节拍器。需要两边协同,走混合架构,而不是在 AUTOSAR OS 上实现一套私有 pthread。

五、API 语义、核间和钩子

激活任务表示请求,真正运行还受当前调度状态、资源占用和调度表约束。在中断二类里调用某些终止类服务会被明确禁止,以避免不可预测的栈问题。这些不是风格建议,是可被静态检查的断言。应用作者若把操作系统当通用线程库,会在禁止点上踩雷,且错误钩子里看到的是“非法调用”,而不是“算法算错”。先读对象约束,再写控制律。

核间通信对象提供确定的拷贝或队列语义。两个核指同一块缓存内存,在重排序和缓存一致性下会把撕裂变成不可复现缺陷。配置对象看起来慢一次拷贝,换来的是可分析。多核 ECU 上的分区还要和内存保护一起配:高等级任务的栈不能被低等级写。这是第 6.1 节共存要求在 OS 上的落点。

错误钩子处理非法 API、栈溢出、截止期错过。钩子里不能再分配、不能再阻塞、不能再发复杂通信。它是反射,不是第二个应用。钩子动作通常是记事件、进安全状态或复位,必须在安全概念里写过。现场才决定“复位一下试试”,等于没有安全状态。

问题:偶发复位,如何判断是截止期还是栈溢出?

看错误钩子记录的类别,看是否与存储擦写或诊断刷写同时出现,看栈注水测试是否已经在集成做过。截止期错过常伴随某个任务变长:Flash 擦写、诊断传输、意外的忙等。栈溢出常伴随数据随机损坏然后才复位。两者都要求钩子动作事先写进安全概念。现场“复位一下试试”会毁掉现场,也会毁掉案例。把长操作声明最坏时间并放到允许延迟的任务,比提高主循环优先级更接近根因。

调度表把周期变成可枚举的格子,价值在错开相位。所有任务在同一毫秒醒来,总线和 CPU 会同时出现尖峰,尖峰会让最坏情况变得更坏。偏移配置看起来像琐事,却是实时性的免费午餐。免费的前提是计数器与硬件定时器的关系诚实:滴答不能被长时间关中断偷偷拉长。存储擦写若关中断过久,格子会被撕破。撕破的格子无法用提高优先级修补,因为时间已经从所有任务下面溜走。声明擦写最坏时间并放到允许延迟的任务,是保护格子。保护格子就是保护 Classic 存在的理由。理由一旦让步给“先擦完再说”,Adaptive 式的弹性会从后门进来,而证明材料还停在门口,门口和客厅说的不是同一种时间语言,混合架构会在这一颗 ECU 内部先失败,失败形态是偶发复位,复位很难在服务世界的日志里被看懂。

中断里跑控制律是对调度金字塔的最直接破坏。接收中断应当置位或送入缓冲,控制律回到任务窗口。窗口里的顺序是配置写死的,最坏时间是加法。中断里的控制律把加法变成未知,未知无法进案例。未知还会提高所有任务的抖动,抖动会让看起来无关的诊断超时。超时会被当成通信问题,于是开始调 PDU 周期。周期越调越乱,根因仍在中断太长。太长的中断是应用越权。越权在代码评审里应被当成架构缺陷,而不是风格问题。风格问题改空格,架构缺陷改职责。职责写在第 2.1 节的执行主权里:运行实体不直接挂中断。主权落到 OS,就是 ISR 要短。短不是洁癖,是让格子能数清。数不清的格子上,ASIL 证据写不成完整句子。不完整的句子过不了审核,审核不过的功能仍可能靠经验跑在试验车。试验车不是量产。量产要数得清。
核间私有共享内存是多核项目里的另一处越权。看起来零拷贝,实际把撕裂交给缓存和重排序。撕裂不可复现时,会被当成“偶发传感器噪声”。噪声滤波器会再变肥。肥滤波器吃 CPU,CPU 不够又有人想删 RTE。因果链再次从错误的层开始。正确的层是核间通信对象:确定拷贝、可分析、可配置。慢一次拷贝,换可重复的行为。可重复比快更接近安全。安全案例喜欢可重复,不喜欢传说。传说无法注入测试。测试需要对象。对象在配置里。配置在描述里。描述是第 5 章的事,但动机在这一节:多核不是把单核任务复制两份,是把跨核数据变成一等公民。公民要有证件。证件就是核间对象。没有证件的数据是黑户。黑户能干活,出事时找不到人。

计数器、报警器和调度表是三种不同粒度的时间工具。计数器连硬件滴答;报警器在计数到达时激活任务或事件;调度表把一串偏移编码成可重复的乐谱。把三者都叫定时器,配置评审会变成同义词辩论。辩论结束时,真正的滴答关系仍可能配错:有人用软件循环冒充计数器,关中断时循环会停,表面上的十毫秒会变成十五毫秒。十五毫秒的“十毫秒任务”会让所有最坏执行时间分析变成废纸。案例需要计数器与定时器模块的绑定声明,以及关中断最长时长的测量。测量应在擦写存储器和诊断传输时做,而不是只在空载主循环做。空载很漂亮,量产不空载。

重点提炼

  • 继承确定性:静态、可验证、有限内存。
  • 升维在组合:调度表、分区、核间对象。
  • 运行实体进任务:应用不开线程。
  • 中断要短:控制律回任务窗口。
  • 跨核走配置对象:禁止私有共享内存。
  • 时间格子能数清:才谈得上 ASIL 证据。

下一章才开始平台对比:Classic 守住这套格子,Adaptive 为什么要换一套运行时,以及二者如何共用 Foundation 的语言。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U