在BootLoade的 sb_main.c文件main函数内使用的mainAppCommand变量在使用之前没有找到初始化或赋值的地方,整个工程也没有发现,
这里的值从哪里获取的?
直接更改变量值或是从地址(_sblCmdAddr)来更改变量值,这两种方法都没发现;
__no_init volatile uint32 mainAppCommand;
#pragma location="SBL_CMD"
const CODE uint16 _sblCmdAddr = (uint16)&mainAppCommand;
#pragma required=_sblCmdAddr
void main(void)
{
uint8 time_spent_validating;
uint8 bootloaderForcedByMainApp = FALSE;
uint32 mainAppCommandLocal = mainAppCommand;
mainAppCommand = MAIN_APP_CMD_NONE;
if (mainAppCommandLocal == MAIN_APP_CMD_FORCE_BOOTLOADER)
{
bootloaderForcedByMainApp = TRUE;
}
……………..
}
Alvin Chen:
请查看在linker的sb-boot.xcl.xcl里面你可以看到:
// Setup "bit" segments (only for '__no_init bool' variables).
-Z(BIT)BREG=_BREG_START
-Z(BIT)BIT_N=0-7F
可以参照我之前回复的帖子:
e2echina.ti.com/…/444791
Susan Yang:
__no_init
正常情况下,应用程序启动时,IAR运行时环境将全部全局和静态变量初始化为0。IAR C编译器支持声明不初始化的变量,使用__no_init类型限定符。声明__no_init的变量不需初始化。一些关键数据在系统复位(如看门狗复位或其他原因造成的复位)时的数值是不能改变的!在这种情况下可用__no_init限定。
user5342508:
回复 Susan Yang:
您好,
在整个工程里面只找到"mainAppCommand = MAIN_APP_CMD_NONE;"这一个地方修改mainAppCommand ,
那下面这个分支什么情况才会处理:if (mainAppCommandLocal == MAIN_APP_CMD_FORCE_BOOTLOADER)想知道mainAppCommandLocal如何通过mainAppCommand 获取的值等于MAIN_APP_CMD_FORCE_BOOTLOADER或MAIN_APP_CMD_PASS_THROUGH;在代码中有这两种情况处理,谢谢!