RTA_OS内核源码解析 3.9-任务激活 一般将Task从挂起态切换到就绪态的操作称之为激活,未启用激活队列的前提下,无法对已经处于激活态或运行态的Task再次激活,对已经进入等待态的ECCTask可以调用激活接口进行激活,但是正常项目中不会这么做,因为毫无意义,原因后面会进行介绍。与设置事件接口类似,任务激活接口也分为同步激活和异步激活两种类型,且RTA_OS提供这两种类型的接口,分别是同步激活任务接口()和异步激活任务接口(
RTA_OS内核源码解析 3.8-事件解析 只有可以进入等待态的Task才可以配置有效的事件,即ECCTask。Event_Action_0为第0bit对应的十进制值,Event_Action_1则为第1bit对应的十进制值。在将这两个事件配置到某一个ECCTask时,对应ECCTask的ecc.events:ECCTask由于等待事件从而进入等待态时,用于保存跳转点的缓存;: ECCTask切换到等待态后用于保存当前任务所使用栈的全部数据;:对ECCTask设置的事件;:ECCTask进入等待态后等待的事件;while (1)
RTA_OS内核源码解析 3.7-自旋锁解析 RTA_OS将用户配置以及系统自动生成的自旋锁配置在的结构体数组中,其基础配置类型如下所示(配置为access:访问权限码,主要用于判断是否在当前application中可使用;successor:链表中下一个 OsSpinlock 的引用,该链表决定了 Spinlocks 的嵌套顺序。RTA_OS为每一个用户配置的自旋锁生成一个动态数据,汇总在lock:代表自旋锁本身的数据(获取和释放的真实数据);locker:获取当前自旋锁的任务或中断句柄;
RTA_OS内核源码解析 3.6-资源锁解析 RTA_OS将用户配置的以及系统自动生成的资源锁均配置在这个结构体数组中,结构体类型为dynamic:资源锁动态数据,主要用于记录资源锁获取次数以及保存当前的任务优先级掩码或者中断屏蔽掩码;tpmask:任务优先级掩码,根据资源锁应用配置在哪些任务的优先级所配置的任务优先级掩码;(优先级上限协议)imask:中断掩码,主要根据资源锁应用在对应中断的优先级所配置;access:访问权限码,用于在使用时判断当前资源锁是否可以在当前的application中可以使用;资源锁动态数据的结构体类型为。
RH850系列芯片深度剖析 1.7-启动流程解析 本章节基于型号为RH850 U2A16的芯片(4核)对其启动流程进行讲解(基于ghs编译器),从复位向量执行到main函数入口。以原厂提供的示例代码为基础,介绍使用MULTI(基于ghs编译器)作为集成开发环境的启动过程。注:本章节所参考的示例代码下载链接请见章节末尾。如果创建自己的启动代码,则必须初始化某些关键寄存器,使其指向正确的内存区域。最常需要初始化的寄存器是堆栈指针,因为在调用高级语言函数之前,通常需要一个有效的堆栈。链接器指令(.ld)文件中定义的.stack段指定了运行时栈的位置和大小,
RH850系列芯片深度剖析 1.10-功能安全之内存保护 RH850U2A芯片具有内存保护/防护功能,可防止错误访问外设模块内存和控制寄存器中的数据。每个可编程内核(总线主控)都有一个定义软件访问保护的内存保护单元(MPU)。此外,每个资源(总线从控)都有一个保护单元,用于控制任何总线主控的访问,包括那些没有 MPU 的总线主控,如 DMA。下图显示了整个内存保护架构:内存保护架构描述如下:MPU:所有 CPU 内核和 ICUMHA 都会保护内存,防止来自 CPU 内核和 ICUMHA 自身的意外访问。
RTA_OS基础功能讲解 2.10-调度表 在警报器章节中,我们看到可以比较容易地构建需要周期性和非周期性行为的系统。但是,警报的一个限制是每个警报只能执行一个操作。如果你需要构建一个系统,其中有分阶段的任务激活序列,并保证在时间上有一定的间隔(时间间隔),那么你就需要非常小心地启动和停止警报。虽然可以通过警报来构建这样一个系统,但除了通过代码审查之外,没有任何其他方法可以防止应用程序的时序属性在运行时被意外修改。此外,如果你想在一个时间点上定义多个任务激活,就不得不创建多个警报,而你真正想做的是通过一个警报激活多个任务。
RTA_OS基础功能讲解 2.9-警报器 使用 ISRs 可以构建以不同速度激活任务的系统。然而,对于复杂的系统来说,这样做可能会变得低效和不切实际。警报器提供了一种更方便、更可移植的系统调度方式。计数器;一个或多个与计数器相连的警报器。警报器要指定在达到特定计数器值时要执行的操作。系统中的每个计数器都可以附加任意数量的警报器。当计数器的值等于附加到该计数器上的警报值时,就表示警报已过期。过期时,RTA-OS 将执行与警报相关的操作。该操作可以是激活任务、执行警报回调例程、设置事件或对软件计数器计数。
RTA_OS基础功能讲解 2.8-Tick计数器 计数器以 ticks 为单位记录操作系统中发生了多少 “事情”。tick 是一个抽象单位。你可以自行决定你希望 tick 代表什么意思,从而决定计数器所计算的 "事情 "是什么。时间,例如毫秒、微秒、分钟等,然后计数器会告诉你经过了多少时间。旋转,例如以度或分钟为单位,在这种情况下,计数器会告诉你某个东西旋转了多少圈。按键,在这种情况下,计数器会告诉你按键被按下了多少次。错误,在这种情况下,计数器将计算错误发生的频率。一个 ISR(有时是一个任务)用于驱动一个计数器。
RTA_OS基础功能讲解 2.7-事件 在 AUTOSAR 操作系统中,事件用于向任务发送信号信息。本章节将解释什么是事件、如何配置事件以及如何在运行时使用事件。事件可用于为扩展任务提供多个同步点。同步的可视化示意图如下图所示。扩展任务可以等待事件,事件会导致任务进入等待状态。当系统中的任务或 ISR 设置了一个事件时,等待中的任务就会转入就绪状态。当它成为优先级最高的就绪任务时,RTA-OS 就会选择运行它。事件由与其关联的扩展任务所有。通常,扩展任务会以无限循环的方式运行,其中包含一系列针对其拥有事件的等待调用。
RTA_OS基础功能讲解 2.6-资源锁和自旋锁 访问需要在任务和 ISR 之间共享的硬件或数据可能不可靠、不安全。这是因为当优先级较低的任务或 ISR 正在更新共享数据时,可能会发生任务或 ISR 抢占。这种情况被称为竞争条件,极难测试。访问共享数据的语句序列称为关键部分。要安全访问关键部分中引用的代码和数据,就需要执行互斥。换句话说,必须确保系统中没有其他任务或第 2 类 ISR 能够在关键部分期间抢占正在执行的任务。你可以将任务声明为非抢占式任务,这样就可以避免互斥问题。
RTA_OS基础功能讲解 2.5-任务栈架构讲解 在使用扩展任务时,您可以通过仅分配足够的缓冲区空间来保存最坏情况的“等待事件堆栈”上下文,而不是任务所需的绝对最坏情况的空间,从而最大限度地减少 RTA-OS 保留的 RAM 大小。注:如上图所示,更高优先级任务(Task E)使用的栈超过了最坏情况抢占点的堆栈大小,会覆盖扩展任务(Task D)进入等待态前的栈内容,如果有一些关键的局部变量被覆盖,则无法恢复,扩展任务恢复运行时可能会出现异常,用户应在软件实现方面尽可能避免这种场景;您可以使用 RTA-OS 的堆栈测量功能来获取堆栈分配的准确值。
RTA_OS内核源码解析 3.5-中断管理(下) 是RTA_OS为核0定义好的中断管理函数,每个核都有对应的函数(本章节以核0的中断管理函数进行举例),被定义在文件中,且在:中断触发前的中断优先级屏蔽掩码,用于判断中断结束时是否可以执行一次任务切换;isr:为当前需要执行中断的配置句柄;执行前状态保存;中断处理函数的执行;执行后处理;
RTA_OS内核源码解析 3.4-中断管理(上) 系统异常以及FE级别中断向量表定义;EI级别用户中断向量表定义;RTA_OS会将核0(PE0)的系统级异常以及FE级别异常的中断向量表在链接文件中定义到mov 18,r29.align 16// ... 中间的系统级异常以及FE级别异常定义格式相同mov 18,r29.align 16会在RTA_OS初始化中断时用于设置芯片EBASE寄存器(EBV bit = 1),由于EBASE寄存器的本身对齐特性,所以在赋值时也会自动对齐。虽然将。
RTA_OS内核源码解析 3.3-ECCTask调度源码解析 spnow,depth:用于计算基于的栈使用量,以及用于计算ECCTask的栈偏移值(spoverrun);spoverrun:spoverrun一是用于depth栈使用量超出stack_offset的值计算,二是用于ECCTask的栈偏移值;os_current_core_const,os_current_controlled_core:系统的核数据以及核控制数据;
RTA_OS内核源码解析 3.2-任务调度源码解析 当某个Task的句柄指针赋值给Os_RunningTask,即表明当前Task进入运行态,由于RTA_OS的特殊软件设计,只有在Task运行结束才会把该Task从就绪队列中清除,所以当一个Task正在运行时,就算Task进入了运行态,但是就绪队列中还存在这个Task。以核0举例,RTA_OS通过调用OS_SCH1L API找到就绪队列中优先级最高的Task,然后计算该Task在Os_const_tasks0中的index,把对应的Task句柄赋值给Os_RunningTask;
RTA_OS内核源码解析 3.1-OS启动源码解析 在AutoSAR的软件架构中,OS的启动是在EcuM模块初始化的最后一步进行,通过API来调用StartOS()参数EcuM_Rb_adrConfigPtr_st->DefaultAppMode为EcuM模块索引RTA_OS的Application modes配置,作为参数传递给StartOS,Os_StartOS会实现对Application modes做有效性的判断。for(;;获取当前的SP栈顶存储到Os_StackBase中,
RTA_OS基础功能讲解 2.4-中断 中断提供了应用程序与现实世界中发生的事情之间的接口。例如,可以使用中断来捕捉按下的按钮、标记时间的流逝或捕捉其他刺激。当中断发生时,处理器通常会查看内存中被称为向量的预定义位置。向量通常包含相关中断处理程序的地址。包含应用程序中所有向量的内存块称为向量表。RTA-OS 支持两类中断: 1 类和 2 类。第 1 类 ISR 是绕过 RTA-OS 的普通嵌入式系统中断。因此,它们不能与操作系统交互,也禁止调用(大部分) RTA-OS API。应使用 CAT1_ISR 宏标记它们。
RH850系列芯片深度剖析 1.9-ghs编译器之特殊数据区域优化 特殊数据区优化将某些数据放在一个特殊的内存块中,可以通过使用基地址的偏移来访问该内存块。在大多数情况下,访问该内存块中的数据比访问其他数据更有效率。这种优化不会改变程序的基本功能。V850 和 RH850 支持小数据区 (SDA) 优化和一种称为零数据区 (ZDA) 优化的专门 SDA 版本。本章节将介绍这些优化,并说明如何将数据分配到特殊数据区。要将变量分配到自定义特殊数据区段,请在 C 代码块中使用 #pragma ghs 段。int e = 3;int g = 10;