實現IAP升級APP這個功能沒有什么問題,但是想把APP中相對固定的函數移植到bootloader中,從而減少APP空間代碼,減少升級時間。
APP通過調用bootloader導出的函數接口,實現相關功能的調用。
代碼舉例
在bootloader導出如下接口給APP使用
int exp_forapp_A(void)
{
int k = 5;
return k;
}
int exp_forapp_B(void)
{
int k = 2;
unsigned char *p = malloc(100);
if(p)
{
k = 5
free(p);
p = NULL;
}
return k;
}
在APP的代碼調用以上函數
調用exp_forapp_A函數,能夠得到正確的返回值5
調用exp_forapp_B函數,永遠只能得到返回值2
經過調試分析,由于exp_forapp_B在調用malloc時候,使用的bootloader內的malloc,此時由于跳轉到app后ram空間已經重新劃分了,因此malloc直接失敗,返回NULL。
因此,嘗試使用將app中的malloc函數傳到bootloader中,給exp_forapp_B使用
int exp_forapp_B(void)
{
int k = 2;
unsigned char *p = app_malloc(100);
if(p)
{
k = 5
free(p);
p = NULL;
}
return k;
}
此時,發現p竟然分配到0x00開頭的地址,而不是0x20000000以后的地址。
經過了,在QQ的學習更肯定我的想法是沒有錯的。接著通過調試代碼,發現,Bootloader中原來存在一個全局變量未被重新映射,而在調用的時候會使用到該變量.進而,導致到動態分配內存出現奇怪地址的問題。
總結,原來的設想是正確的,bootloader的動態內存分配函數malloc失效之后,可以使用app的動態內存分配函數,解決導出函數因內存失效而無法使用函數的問題。
特別要注意,bootloader中的全局變量問題重新映射問題,否則會出現異常。
上一篇:IAR STM8S及STM32整合
下一篇:串口通信的幀同步問題
推薦閱讀
史海拾趣