遇到的问题:
1.原有的工程,可以正常从bootloader 跳转到APP,但是在修改了APP里一个结构体后,bootloader无法正常跳转到APP。
结构体修改前:
typedef struct
{
uint32_t drugItems[1000];
} TS_DRUG_ITEMS_COLLECTION;
struct TS_DRUG_CATEGORY
{
uint32_t category_index;
TE_STR_ID default_name_id;
uint32_t drug_item_count;
uint32_t color;
char name_strings[4][64];
TS_DRUG_ITEMS_COLLECTION drug_item_collection[4];
};
结构体修改后:
typedef struct
{
uint8_t flag;
uint32_t drug_Item_index;
} INFO;
typedef struct
{
INFO drugItems[1000];
} TS_DRUG_ITEMS_COLLECTION;
struct TS_DRUG_CATEGORY
{
uint32_t category_index;
TE_STR_ID default_name_id;
uint32_t drug_item_count;
uint32_t color;
char name_strings[4][64];
TS_DRUG_ITEMS_COLLECTION drug_item_collection[4];
};
问题排查:
-
1.查看跳转部分代码
void AppEnterApplication(void)
{
T_U32 jump_address;
TF_VOID_FUNCTION jump_fun; if (AppIsApplicationExist())
{
/*disable all peripherals referrd to interrupt */
/*disable system tick */
SysTick->CTRL &= ~(SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk);
//disable rtc
RTC_DeInit();
RTC_ITConfig(RTC_IT_WUT, DISABLE);
//disalbe usarts
DrvUart2Deinit();
DrvUart1Deinit();/* Jump to user application */ jump_address = *(T_U32*)(APPLICATION_ADDRESS + 4); jump_fun = (TF_VOID_FUNCTION)jump_address; /* Initialize user application's Stack Pointer */ __set_MSP(*(T_U32*)APPLICATION_ADDRESS); jump_fun(); }
}
内存分配表:
0x8000’0000 --> bootloader 栈顶地址
下面是bootloader中断向量表:
0x8000’0004 --> Reset_Handle
… --> 其他 中断
0x8000’FFFF --> bootloader end
0x8001’0000 --> app 栈顶地址
以下是app的中断向量表
0x8001’0004 --> Reset_Handle
… --> 其他 中断
对照.icf文件(IAR的配置文件)
如下图1
 = 44+464+441000 =16272 = 15KB
stack_address = 2002bfb8
修改后 :
sizeof(TS_DRUG_CATEGORY) = 44+464+(1+4)41000 =2272= 19KB
stack_address = 0x2003’1398
结论:
STM32F429的RAM,最大可用空间为 0x2002’FFFF,与.map文件里的栈顶地址对比发现栈顶地址跑到了SRAM的预留区域,超了SRAM的可用空间。导致程序跑飞。
后续实验,将结构体 TS_DRUG_CATEGORY 里的数组大小减少一半,程序能正常跳转。