Os ShutdownHook调用深度剖析

根据项目要求,我将ShutdownHook配置好了,然后生成代码就可以使用了。

关于ShutdownHook的作用,请戳《AUTOSAR BswM Shutdown流程配置详解》>>>

但是,我很好奇,对,是好奇,好奇这个ShutdownHook的调用过程是怎样的,顺便学习下OS的调用机制。

程序员都有一颗刨根问底的心。

直接仿真查看

我能想到的最直接的办法是,在ShutdownHook函数上设置个断点,然后打开调试窗口的Call Stack窗口来查看函数的调用过程,想着其实很简单。

然而……

Os ShutdownHook调用深度剖析_第1张图片

以上是设断点的地方,以下是仿真跑到断点处的Call Stack

实际上,只能看出是Os_HookWrapperStatusHook调用了这个函数而已。

进一步继续单步走,再查看Call Stack

Os ShutdownHook调用深度剖析_第2张图片

看到这个也许想抓狂,根本就看不出调用源头来源于哪。

人肉搜索

没办法,回到老办法,查代码,人肉分析函数的调用关系

Os ShutdownHook调用深度剖析_第3张图片

这个Os_Hal_ContextConfigType的定义是这样的

struct Os_Hal_ContextConfigType_Tag
{
  uint32 Os_Hal_SL;     /*!< +00h Stack lowest,32 bit aligned address */
  uint32 Os_Hal_SP;     /*!< +04h Stack pointer (stack highest, 32 bit aligned address) */
  uint32 Entry;         /*!< +08h Program counter (entry address)*/
  uint32 ReturnAddress; /*!< +0Ch Link pointer (return address)*/
  uint32 Os_Hal_PSW;    /*!< +10h Program status word */
  uint32 Os_Hal_PMR;    /*!< +14h Interrupt priority masking */
  uint32 Os_Hal_ASID;   /*!< +18h Address space ID */
};
/*! Core configuration data: OsCore0 */
CONST(Os_CoreAsrConfigType, OS_CONST) OsCfg_Core_OsCore0 =
{
  /* .Core              = */
  {
    /* .Status               = */ OS_CORE_CASTSTATUS_COREASRSTATUS_2_CORESTATUS(OsCfg_Core_OsCore0_Status_Dyn),
    /* .HwConfig             = */ &OsCfg_Hal_Core_OsCore0,
    /* .InterruptSourceRefs  = */ OsCfg_Hal_Core_OsCore0_InterruptSourceRefs,
    /* .InterruptSourceCount = */ (Os_ObjIdxType)OS_CFG_NUM_CORE_OSCORE0_INTERRUPTSOURCEREFS,
    /* .Id                   = */ OS_CORE_ID_0,
    /* .Trace                = */ &OsCfg_Trace_OsCore0_Dyn,
    /* .IsAsrCore            = */ TRUE,
    /* .IsAutostart          = */ TRUE,
    /* .IsMasterStartAllowed = */ FALSE,
    /* .HasPrivilegedHardwareAccess = */ TRUE
  },
  /* .Dyn               = */ &OsCfg_Core_OsCore0_Dyn,
  /* .Scheduler         = */ &OsCfg_Scheduler_OsCore0,
  /* .IdleTask          = */ &OsCfg_Task_IdleTask_OsCore0,
  /* .KernelApp         = */ &OsCfg_App_SystemApplication_OsCore0,
  /* .KernelStack       = */ &OsCfg_Stack_OsCore0_Kernel,
  /* .PreStartTask      = */ NULL_PTR,
  /* .StartupHookRef    = */ NULL_PTR,
  /* .ShutdownHookRef   = */ &OsCfg_Hook_ShutdownHook_OsCore0,
  /* .ErrorHookRef      = */ &OsCfg_Hook_ErrorHook_OsCore0,

 

呵呵,原来这个Entry不是函数指针类型,是uint32……


继续人肉搜索OsCfg_Hal_Context_ShutdownHook_OsCore0

……

一层套一层,结构体太多了,没法人工搜索了,我的肉体无法接受……

 

……

微信文章链接《OS ShutdownHook深度剖析》

部分内容省略,请关注公众号:嵌入式软件实战派,关注并回复“AUTOSAR”获得

你可能感兴趣的:(AUTOSAR,编程语言)