• RTA-OS Port Guide学习(二)-基于S32K324 OS


    前言

    上一篇OS Port中介绍了特殊配置,本文接着介绍OS Port中API的使用

    Port-Specific API

    下面介绍特殊的api,作为Reference Guide的补充,当Reference Guide与本文档定义相同的API时,以本文档为准

    API Calls

    Os_AwaitStartup

    控制Core启动
    函数原型:

    FUNC(void , OS_CODE ) Os_AwaitStartup (void)
    

    在多核AUTOSAR应用中,主核需要控制从核的启动行为。理想情况下,从核心应该保持reset,直到Os_Cbk_StartCore被调用释放它们。

    有时这不能强制执行(例如,调试器可能不支持此操作)。

    出于这个原因,OS提供了Os_AwaitStartup() API,它应该放在’ main '的开头

    如果从核过早释放,这个API将导致它等待,直到它的Os_Cbk_StartCore被调用。

    正常情况下,宏OS_MAIN隐藏了对Os_AwaitStartup的调用。如果你选择不使用OS_MAIN,那么你应该显式地调用Os_AwaitStartup,如果从核不能在reset中保持。

    OS_MAIN的宏定义如下:

    #define OS_MAIN() extern void inner_main(void); extern Os_ghs_int main(void); Os_ghs_int main(void) { Os_AwaitStartup( ); inner_main( ); for (;;) { } } void inner_main(void)
    
    

    其中调用了Os_AwaitStartup,主要就是while等待Os_Cbk_StartCore函数调用,在Os_Cbk_StartCore会将Os_StartBlock[0]置为OS_START_CORE_KEY,此时Os_AwaitStartup会跳出循环

    Os_InitializeVectorTable

    初始化中断向量表
    函数原型:

    void Os_InitializeVectorTable (void)
    

    Os_InitializeVectorTable()根据项目配置初始化NVIC、SCB和Core CONTROL Register。它将清除任何错误或活动异常,设置所需的堆栈对齐和异常条目,设置系统处理程序,并确保处理器处于线程模式,并且正在使用的堆栈是主堆栈。如果RTA-OS被配置为生成向量表,它还将VTOR寄存器设置为os生成的向量表的地址,该向量表包含所有适当的CPU异常和中断的条目。它启用第一类isr,但在调用StartOS()之后才禁用第二类isr。

    Os_InitializeVectorTable()应该在StartOS()之前调用。即使“抑制向量表生成”设置为TRUE,也应该调用它。

    该函数在EcuM_AL_DriverInitOne中调用,两个核都需要调用,对中断向量初始化

    Callbacks

    Os_Cbk_GetAbortStack

    回调函数提供堆栈的起始地址,以用于某些异常条件。

    函数原型:

    FUNC(void *, OS_APPL_CODE ) Os_Cbk_GetAbortStack (void)
    

    返回值是void *类型

    不受信任的代码可能行为不当并导致保护异常。当发生这种情况时,AUTOSAR要求调用ProtectionHook,并且必须终止任务、ISR或OS应用程序。

    发生故障时,栈指针可能是无效的。出于这个原因,如果配置了“Enable untrusted stack check(DistrustStacks)”,RTA-OS将调用Os_Cbk_GetAbortStack来获取在执行此处理时应该用于堆栈的内存安全区域的地址。

    目前该函数未使用

    Os_Cbk_GetSetProtection

    回调函数用于控制内存保护系统的激活

    函数原型:

    FUNC(boolean , { memclass }) Os_Cbk_GetSetProtection (
    boolean enable
    )
    

    函数返回值为bool类型
    这个回调用在TrustedApplicationWithProtection为true的OS Application的配置中。它必须返回被调用时MPU硬件的状态(如果启用则为TRUE,否则为FALSE)。然后,它必须根据传入的“enable”值启用或禁用内存保护。用于在Trusted和TrustedApplicationWithProtection模式之间切换。它仅在系统处于Trusted或TrustedApplicationWithProtection模式时被调用。

    目前Application未配置TrustedApplicationWithProtection,所以该函数未使用

    Os_Cbk_SetMemoryAccess

    回调函数,用于准备内存保护系统,以便从受信任代码切换到受访问限制的代码(不受信任或带保护的受信任代码)。
    函数原型:

    FUNC(void , { memclass }) Os_Cbk_SetMemoryAccess (
    Os_UntrustedContextRefType ApplicationContext
    )
    

    目前未使用该函数

    Os_Cbk_StartCore

    用于在多核系统中启动非主核

    函数原型:

    FUNC(StatusType , { memclass }) Os_Cbk_StartCore (
    uint16 CoreID
    )
    

    返回值类型为StatusType,E_OK说明没有error,E_OS_ID说明core不存在或无法启动。

    Os_Cbk_StartCore不会被调用内核0,因为内核0必须先启动。Os_Cbk_StartCore被StartCore调用。

    Macros

    CAT1_ISR

    为1类中断提供函数接口

    Os_Clear_x

    宏Os_Clear_x()可用于清除指定NVIC中断的中断挂起位。中断可以使用NVIC通道号或RTA-OS配置的矢量名来识别。该宏只有在包含文件Os_ConfigInterrupts.h时才可用。不受信任的代码不能使用该宏。您必须只在多核配置中拥有中断的核心上使用它

    Os_DisableAllConfiguredInterrupts

    Os_DisableAllConfiguredInterrupts()用于禁用所有已配置的NVIC中断。该宏只有在包含文件Os_ConfigInterrupts.h时才可用。不受信任的代码不能使用该宏。这个宏不是原子的。您应该在多核配置中使用Os_EnableAllConfiguredInterrupts_CPUx。

    多核系统中不会生成该宏定义

    Os_DisableAllConfiguredInterrupts_CPUx

    用来禁用核的配置的中断。

    Os_EnableAllConfiguredInterrupts

    多核系统中不会生成该宏定义

    Os_EnableAllConfiguredInterrupts_CPUx

    用来启用核的配置的中断。

    Os_Enable_x

    宏Os_Enable_x()可用于启用指定的NVIC中断。中断可以使用NVIC通道号或RTAOS配置的矢量名来识别。该宏只有在包含文件Os_ConfigInterrupts.h时才可用。不受信任的代码不能使用该宏。您必须只在多核配置中拥有中断的核心上使用它。

    生成的代码示例如下:
    在这里插入图片描述

    Os_IntChannel_x

    宏Os_IntChannel_x可以用来获取一个命名的NVIC中断的中断通道号。通道号是进入NVIC硬件的索引,所以它比关联的IntID小16。Os_IntChannel_x宏只有在包含文件os_configinterrupted .h时才可用。

    生成的代码示例如下:
    在这里插入图片描述

    Os_IntID_x

    宏Os_IntID_x可用于获取指定中断的CPU INTID值。

    它可用于CPU和NVIC中断。Os_IntID_x宏只有在包含文件os_configinterrupted .h时才可用。

    生成的代码示例如下:
    在这里插入图片描述

    Type Definitions

    Os_StackSizeType

    一个无符号值uint32,表示以字节为单位的堆栈量

    Os_StackValueType

    uint32,表示堆栈指针(主堆栈)位置的无符号值。

    Toolchain

    编译器及支持的版本,需要对应的版本才能编译生成lib

    编译选项

    -cpu=cortexm7:为M7内核生成代码

    -align8:8字节数据对齐,需要符合ARM过程调用标准

    -Osize:编译优化,size可以尽可能小的内存占用

    -fsingle:单精度使用硬件FPU,双精度使用软件FPU(数值由目标选项设置)

    应用程序代码的必选选项

    没有必须的,-Osize可以不选

    应用程序代码的禁用选项

    在使用lib的情况下,下列选项不能配置

    -bigendian Generate big-endian code
    -std=x Other C standard code apart from C99
    --short_enum Store enumerations in smallest possible type
    -align4 Align all data objects to an 4 byte boundary
    -align16 Align the stack to an 16 byte boundary
    -align32 Align the stack to an 32 byte boundary
    - Any other options that conflict with kernel options
    

    short_enum如果app代码和os不一致的话,可能导致访问的数据错位。

    Assembler汇编选项

    没有需要注意的

    Librarian生成

    使用ax.exe

    Linker链接

    使用elxr.exe

    链接选项

    -entry=Reset_Handler 指定程序入口
    -delete Remove unused and unreferenced functions. 删除未使用和未引用的函数
    -data_delete Remove unused and unreferenced data. 删除未使用和未引用的变量
    -no_discard_zero_initializers 将初始化为0的变量放到data段
    -map 生成map文件
    -mapfile_type=2 显示详细map
    

    总结

    OS编译配置选项也很关键,在使用OS Lib进行软件集成时,需要特别关注。

  • 相关阅读:
    Word格式处理控件Aspose.Words for .NET教程——插入段落并调整样式
    前端面试:复习闭包
    npm详解
    React基于monaco editor的在线代码编辑器开发
    你知道有什么好的文字翻译软件吗?这几个软件非常好用
    RT-Thread 双向链表(学习笔记)
    学习之路指南:GitHub 教程与指南精选手册一
    科普长文--网络安全拟态防御技术概念及应用
    V90伺服 EPOS模式下回原(详细配置+SCL源代码)
    谷歌浏览器--关闭自动更新的方法
  • 原文地址:https://blog.csdn.net/weixin_49000276/article/details/141727497