事件触发操作系统,通过定时器届满,错误检出等event触发os task的调度运行
1.TASK种类与状态
task的种类分为两种,基本task和扩展的task,处理器在同一时间只能运行一个task指令,os会负责保存和恢复task的状态切换时的数据
1.1.Basic task
状态:Running,Ready,Suspended
单次任务模型,当基本任务中止或被强占时才会释放处理器
自动开始任务在startOS()时被自动激活,可以开启需要等待事件的扩展任务。基本task在进入中止状态前只执行依次
1.2.Extended task
状态:Running,Ready,Waiting,Suspended
多一个waiting状态,适合于需要中间执行同步的功能,使任务具有同步点,(当处理过程中发现缺少信息时,会切换到Waiting状态)时间响应较快,但会一直占用Ram资源,相当于以空间换时间
1.3.状态与栈工作的对应
1.Basic task:当进入running状态时直接依次入栈,加到栈顶,然后依次出栈;2.Extended task:最差情况:在waiting过程中其他低优先级的任务都被激活并全被打断,扩展task的入栈位置需要确定,即知道实际任务占用的栈空间当扩展任务的栈管理异常时,会进入shutdownOS()
抢占式调度会增加任务context的切换时间和内存消耗,不可抢占式会降低实时性,但是节省context切换的时间
2.调度方式
2.1.任务调度方式
FirstComeFirstServed(FCFS)
2.2.切换机制与调度策略
抢占式并需要设置优先级
静态调度:在调度前就已经配置好;
动态调度:根据负载率自动去调度
autosar支持静态调度,单个处理器一次处理一个任务,不同任务通过alarm进行切换
抢占策略的选择:如果应用程序并行的task比较少,可以选择全抢占式,如果有明确的执行时间的短期任务则是和混合抢占式。
若有三个task,优先级task1<task2<task3,task1,3,可以被抢占,task2不可被抢占,所以在运行task2时,task3不会抢占task2,优先级其实是相同的。好处是可以让task2运行完,节省了一次任务切换时间,并且task3的栈不会压到task2上增加栈空间。
2.3.资源管理
- 死锁
1.概念:当两个(进程)task同时访问一个资源,在无外力作用时会导致无法推进
2.产生原因:竞争了不可剥夺资源;进程间的非法推进
3.产生条件:互斥条件 请求和保持 不剥夺 环路等待
4.解决方法:通过os resources使用优先级上限协议机制 - 优先级反转
优先级反转:低优先级延迟了高优先级的执行顺序
举例:假设有task1-task4,优先级递减,task1强占task4对信号x的访问,此时task1在等待访问信号x的过程中(等待信号x被task4释放),中途会执行优先级比task4更高的task2和task3,当执行完task2,3后才会执行task4,即释放信号x,所以task1的执行时间被task2和task3延迟,即优先级反转。
-
优先级上限协议:即上文的静态分配
内容:在系统初始化时对每个资源静态分配一个上限优先级,当任务使用这个资源时任务的优先级就自动提升到该资源的优先级上限,使得其他访问该资源的task的优先级都低。
作用:相当于获得这个资源的最高级别优先级,其他试图访问该进程的优先级都低于它,所以不会发生倒挂
3.task的激活
启动操作系统后,所有任务默认均为Suspended状态,用户去触发然后激活后进入Ready状态,os根据task的优先级进行调度
3.1.Task的激活方式:
1.ActivateTask()—直接激活
2.Alarm届满:对Alarm指定任务,该任务在每次Alarm届满时激活—间接激活
对于一些重复的事件,通过定时器进行设置
3.2 event和alarm机制
Alarm作用:以设置定时周期的方式
1.激活一个task(通过硬件定时器产生tick time ,使system counter++,加到预设的值触发task)
2.设置一个event(event仅仅提供给Extended task)
event为扩展任务提供同步点,每个event可以关联多个task,一个扩展任务ye可以用很多event,但是该event只能由其接受的那个扩展任务进行清除。
当某个task正在运行时突然需要一个event,此时task进入waiting状态,释放cpu资源,而后去执行优先级低的task,等event来了,再执行改优先级高的task。
3.设置回调函数
4.task的登录
-
Runnables可运行实体,SWC中的函数,再被达芬奇生成的时候手动添加实际功能,可以被定时器或者操作调用以及接受数据触发
-
Runnables需要os中的task作为载体,需要放在操作系统的任务中来执行这个函数
-
Runnables到task的映射需要RTE实现
5.中断
优先级 | 说明 |
---|---|
0类中断 | 不受OS管理 |
Timing protect | 防止时间失效导致死锁,阻塞,错误同步等 |
1类中断 | 不与OS内部交互,1类中断不能被2类中断打断,开销小 |
2类中断 | 其中断向量表指向OS内部,开销大 |
Task | 中断的周期性比task更严格 |
-
1类中断和2类中断的区别在于当有两个不同优先级的task1,task2时,在执行低优先级的task1时,如果1类中断被触发,退出中断后仍然回到task1,如果2类中断被触发,会进行os调度,中断退出后执行高优先级的task2
-
AUTOSAR有两种时间保护机制,一种是执行时间的保护,一种是在bsw里的看门狗的保护
5.HOOK机制
类似中断的机制,在OS里一般使用在StartupHook(操作系统启动后并且在调度程序运行前),ShutdownHook(系统被应用或是操作系统出错要求关闭),调试以及出错管理
HOOK程序的优先级比task高,因为属于操作系统的一部分,所以不会被2类中断打断
6.OS运行流程
-
硬件代码初始化
-
call startOS
-
OS执行操作初始化代码
-
OS执行StartupHook,用户将初始化程序放置在这里,此时所有中断无效
-
操作程序激活中断和调度程序
-
执行用户的中断和 task。