AUTOSAR Davinci Idle task 与 Init Task的配置

最近在用Davinci配置Idle task和Init Task的时候遇到了一些问题,配置OS的时候,软件会自动为每个Application生成一个Idle task和Init Task:
AUTOSAR Davinci Idle task 与 Init Task的配置_第1张图片
先来看Idle Task,自动生成的Idle task的优先级是0xFFFFFFFF,官方给出的解释如下:
在这里插入图片描述
我本来准备把自己想要放在Background运行的runnable直接放在自动生成的这个Idle Task里的,但是mapping上之后,生成代码时候提示Background类型的runnable必须mapping到优先级最低的task上,当前mapping的task不是优先级最低的task。自动生成的这个Idle Task的优先级又不允许修改,所以最终是新建了一个UserIdleTask,把自己的runnable mapping上去才OK。

Init Task遇到的问题是,软件自动生成的Init Task是AutoStart的,StartOS之后自动运行,在Init Task中调用EcuM_StartupTwo()。我把自己创建的模块的Init函数mapping到自动生成的Init task后,生成RTE的时候提示这个Init task被mapping了runnable,所以它的启动和停止需要由RTE来统一管理(在Rte_Start函数中激活task),因此不能再配置为AutoStart,但是,矛盾点来了,Rte_Start()函数是在EcuM_StartupTwo()中调用的,这个Init task不能自启动的话,EcuM_StartupTwo()就不能被调用,Rte_Start()也不能被调用,也就没法激活这个Task,形成了一个圈,导致Init task不能被运行。

解决方法也是另外创建一个Init Task,原来的Init task逻辑和配置保持不变,把自己的Init函数放在新创建的Init task中。

顺便简单理一下Davinci代码ECU启动时序:

main -> EcuM_Init -> EcuM_AL_DriverInitZero -> EcuM_DriverInitOne -> EcuM_StartOS ->
OsTask_Init_Core0 -> EcuM_StartupTwo -> BswM_Init -> Rte_Start 然后启动任务调度。

你可能感兴趣的:(AUTOSAR,AUTOSAR,davinci)