通过上图可以看到代码段中调用了MCAL_CALLOUT_CODE_START宏定义,在保护Mcal_Callout_MemMap.h
#defined MCAL_CALLOUT_CODE_START
#include "Mcal_Callout_MemMap.h"
void Mcal_ReportSaftyError(...)
{
...
}
#defined MCAL_CALLOUT_CODE_STOP
#include "Mcal_Callout_MemMap.h"
进入Mcal_Callout_MemMap.h 我们查看MCAL_CALLOUT_CODE_START的定义,看到通过#preagma 制定了段 “Code.Mcal_Callout”,之后就是取消宏定义
...
#elif defined MCAL_CALLOUT_CODE_START
#preagma section code "Code.Mcal_Callout"
#undef MCAL_CALLOUT_CODE_START
#undef MCAL_CALLOUT_MEMMAP_ERROR
#elif defined MCAL_CALLOUT_CODE_STOP
#preagma section code restore
#undef MCAL_CALLOUT_CODE_STOP
#undef MCAL_CALLOUT_MEMMAP_ERROR
...
可以将上面#preagma指定代码替换到初始代码段如下
#preagma section code "Code.Mcal_Callout"
void Mcal_ReportSaftyError(...)
{
...
}
#preagma section code restore
通过查看链接脚本,可以在pspr.ld文件中看到
SECTIONS
{
......
/*拷贝加载地址 __SB_RAM_CODE_LOAD_ADDRESS*/
PROVIDE(__SB_PSPSR0_COPY_LOAD_ADDRESS = __SB_RAM_CODE_LOAD_ADDRESS);
.SB.CPU0_Pspr_tesxt (SB_PSPR0_CODE_START_ADDRESS)
{
KEEP(*(Code.Mcal_Callout));
}
}
上面代码段看到的__SB_RAM_CODE_LOAD_ADDRESS在Pflash.ld文件中确定了其所属地址
.SB.Code_rodata(.):FLAGS(ar1)
{
......
=ALIGN(4)
ROVIDE(__SB_RAM_CODE_LOAD_ADDRESS = ABSOLUTE(.));
}
通过MAP文件可以验证函数存放代码段
Mcal_ReportSaftyError pflsh0 .SB.Code_Run Code.Mcal_Callout