
RTOS
文章平均质量分 91
斯安
这个作者很懒,什么都没留下…
展开
-
OSEK定时器(Alarms)
对于反复出现的事件的处理,例如周期事件,或处理在特定时间点触发的事件,需要OS提供一种定时机制。对此,OSEK提供了一个两阶段的概念来实现,周期性事件被同步注册到一个计数器(),在此基础上OS向应用提供定时器机制(原创 2024-05-19 22:15:56 · 1505 阅读 · 0 评论 -
OSEK资源管理
资源被占用时,不可调用一些系统接口(如TerminateTask,ChainTask, Schedule,WaitEvent等)的限制,并不适用于内部资源,毕竟内部资源就是在这些系统接口调用中处理的。然而,所有的标准资源都必须在内部资源别释放之前被释放,谁第一个来,谁最后一个走。原创 2024-05-19 02:56:28 · 658 阅读 · 0 评论 -
OSEK事件机制(Event mechanism)
事件(event)作为OSEK的OS对象,主要用于拓展任务的同步,即使得拓展任务进入或离开等待状态(waiting state)。更直白来说,事件可以用于唤醒等待状态的任务,使之进入就绪态,或者使得当前任务进入等待状态。显然,前者可以通过系统接口来实现,而后者则是通过来实现。原创 2024-05-18 14:36:44 · 1058 阅读 · 0 评论 -
OSEK中断管理
如图1所示,OSEK将中断服务函数(Interrupt Service Routine,ISR)分为两类:① 一类中断服务函数(ISR category 1)该类ISR不会使用OS提供的系统服务(不包括那些中断使能除能的相关接口,毕竟OS只是封了层皮,本质上还是调用MCU提供的指令接口,一般是通过修改一些中断屏蔽寄存器来实现),中断处理完成后会返回程序被打断的指令处执行。显然,一类中断与任务管理无关,与OS井水不犯河水,开销也比较小。换句话说,一类终端完全生活在OS层以下,OS完全感知不到它的存在。原创 2024-05-18 00:41:52 · 1326 阅读 · 0 评论 -
OSEK应用模式
很多ECU都会执行完全独立的应用(applications),包括工厂测试(factory test),固件刷写(flash programming)或正常工作操作(normal operation)。显然,可以将应用模式看成满足特定场景的软件模式,以其对应的应用实现来组织代码,使得各场景应用之间的开发解耦。通常来说,不同应用模式都会使用自己的一套系统资源,包括taskISRsalarms及定时器。当然,如果应用模式之间存在功能上的交集,共享这些系统资源也是允许的。原创 2024-05-14 15:32:56 · 658 阅读 · 0 评论 -
OSEK任务管理
RTOS通过任务(task)来组织应用层程序框架(framework),并支持任务的并发和同步执行(concurrent and asynchronous execution of tasks),并通过调度器(scheduler)来管理任务的执行,OSEK也概莫能外。OSEK将任务划分为基础任务(basic tasks)和拓展任务(extended tasks)两类。对于基础任务来说,它们会一直占有CPU,直至其主动终止(terminate)任务运行,或被高优先级的任务/中断抢占,才会释放CPU资源;原创 2024-05-06 22:39:37 · 1100 阅读 · 0 评论 -
OSEK的设计哲学与架构
OSEK是为单核分布式嵌入式控制单元量身定制的实时系统,对事件驱动(event driven)的硬实时控制系统具有良好的适配性。OSEK没有强求不同软件模块间的完全兼容性,而是将重心放到了软件的可移植性上来。原创 2024-05-05 00:14:08 · 1320 阅读 · 1 评论 -
深入理解Cortex-M7 SVC和PendSV
将PendSV优先级还有一点考虑,如果其优先级比较高,有可能出现以下情况:PendSV会抢断其他中断的执行,随后进行上下文切换,而其他中断以尾链机制继续执行,并请求进行上下文切换,这就导致多次重复的上下文切换,而在此过程中,无辜的任务只能眼巴巴的等着,啥都做不了,而内核在忙着来回切换上下文,浪费了很多CPU时间。此外,SVC指令要求SVC异常的优先级高于异常可执行优先级,否则将触发错误异常。因此,在NMl或HardFault等优先级高于SVC的异常处理程序中,不能使用SVC。原创 2024-04-14 20:25:27 · 1790 阅读 · 0 评论 -
freeRTOS动态内存heap4源码分析
回过头来看:①heap_4的内存是完全是建立在一片线性连续的内存上的,heapMINIMUM_BLOCK_SIZE的定义可以抑制过度的内存碎片化;②而在申请和释放内存时,必然要有查询空闲块链表的操作,其所谓的不确定性也主要存在这里,即链表的查询时间;③另外,除了链表的首个元素xStart外,其余链表元素(内存块头)都是占用内存池的空间,这也在一定程度上导致了可分配内存的缩水;④如果需要且允许使用动态内存,heap_4支持指定内存池的起始地址,需要注意内存池是否与其他内存空间隔离开,防止内存踩踏。原创 2024-03-23 22:25:32 · 1342 阅读 · 0 评论 -
freeRTOS(Arm M7)中断压栈分析
以Arm M7核为例,当CPU响应中断异常时,第一件事就是保存现场,进行压栈。如果当前使用的是任务堆栈,则压入PSP;如果使用的是系统主堆栈,则压入MSP。根据权威指南的说法,CPU在响应异常序列时,首先会进行压栈、取向量、更新寄存器(选择堆栈指针MSP/PSP,更新堆栈指针SP,LR及PC)这三部曲。取向量指的是指令总线从向量表中找到对应的异常向量,并在对应的服务程序的入口处进行取值,而更新寄存器部分则可以解释我的疑惑。原创 2024-02-08 01:15:36 · 1897 阅读 · 0 评论 -
freeRTOS之软件定时器源码分析总结
图4 软件定时器任务数据流示意图如图4所示,应用程序通过API接口调用xTimerGenericCommand,将定时器和指令加入定时器任务的私有队列。定时器任务会根据队列中的指令,对指定的定时器进行启动、复位、停止等操作,并将倒计时的相关信息记录到延时列表中。同时,如果列表中由定时器存在,任务会记录最近的溢出时间并阻塞等待,当倒计时结束时,任务会被唤醒,应用程序注册的回调函数会被执行;在阻塞前,会将定时器任务加到命令队列的等待项中,即命令入队也会唤醒定时器任务。原创 2024-02-23 00:22:42 · 1472 阅读 · 1 评论 -
freeRTOS静态任务创建示例
随着功能安全愈发被重视,RTOS逐渐禁用动态内存,以牺牲RAM资源为代价,获得更高的稳定性。FreeRTOS V9.00及更高版本支持通过静态内存创建如任务、软件定时器、信号量等内核对象,其主要思想是不再从堆中分配内存,而是由应用软件注册静态缓冲区来创建对象。本文主要分析静态任务的创建及相关代码。使用静态内存分配创建任务主要由以下几个优点:①任务的任务控制块(TCB)和栈(STACK)可以放在指定的内存位置,内核将该控制权下方给应用软件;原创 2024-02-14 14:03:39 · 926 阅读 · 0 评论