stm32 BOOTLOADER 导出函数给APP调用出现malloc无法分配内存的问题

实现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中的全局变量问题重新映射问题,否则会出现异常。

 

 

 来自:http://blog.csdn.net/lan120576664

 

 

å¨è¿éæå¥å¾çæè¿°

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32 bootloader app合并是指将MCU的启动程序和应用程序合并到一起,可以在单个MCU中实现启动程序和应用程序两种不同的功能。这种技术有助于简化系统设计和开发流程,减少成本和减少系统板子的体积。 在STM32单片机开发中,bootloaderapp分别是分开编写的。bootloader在芯片出厂后就已经存在,主要负责系统的初始化、底层硬件的配置以及app的加载、升级和运行。app是用户程序,包括主函数等,通常是由开发人员或客户按照需求编写的。 为了实现bootloaderapp的合并,需要在编写app时做一些特殊处理。主要有以下几个方面: 1.确定代码入口 合并后的代码需要在单片机上运行,所以需要确定代码的入口地址。一般情况下,bootloader的代码会占用一些内存,app的代码入口需要从bootloader的后面开始。如果bootloader占用的内存不一定严格固定,可以使用一个全局变量来指示app的入口地址。 2.禁用某些功能 为了保证bootloader正常运行,app中有些功能不能使用。例如,如果app中涉及到修改bootloader中的某些参数或实现特定的外设控制,可能会干扰bootloader的正常工作。解决这个问题的方法是,在app中禁用相关的功能。 3.编写代码复位程序 合并后的代码需要能够执行复位操作,即允许app重新启动。为了实现这一功能,需要编写复位程序(Reset)。 总之,STM32 bootloader app的合并不是一件简单的事情,需要开发人员根据具体应用需求做出相应的处理,确保代码的可靠性和运行稳定性。但是,在现代嵌入式系统中,将bootloaderapp合并在一起已经成为常见技术,为MCU的开发提供了更大的灵活性和优秀性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值