前言
上一篇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进行软件集成时,需要特别关注。