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

发布者:huanli最新更新时间:2018-06-01 来源: eefocus关键字:导出函数  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中的全局变量问题重新映射问题,否则会出现异常。


关键字:导出函数  APP调用  malloc  分配内存 引用地址: 导出函数给APP调用出现malloc无法分配内存的问题

上一篇:IAR STM8S及STM32整合
下一篇:串口通信的帧同步问题

推荐阅读最新更新时间:2024-03-16 16:04

ucos-ii学习笔记——动态内存分配原理及使用
Created on: 2012-10-8 Author: zhang bin 学习笔记 for ucos-ii PC redesigned by zhang bin 2012-10-8 versions :V-0.1 All Rights Reserved #include INCLUDES.h #define TASK_STK_SIZE 512 OS_STK StartTaskStk ; OS_STK MyTaskStk ; OS_MEM *In
[单片机]
MSP430FR5969内存分配的问题
cmd文件里的具体内容我就不贴了,大家自己可以看一下。cmd文件主要由两部分构成,一个是MEMORY{};另一个是SECTIONS{} 其中MEMORY{}是定义内部所有寄存器及存储器的地址,在这里大部分内容都是厂家定义好的,一般不能修改。但是咱们今天要改的就是他,当然只能改其中允许该的地方,那就是FRAM的分配问题。根据数据手册里提供的内存分配情况(如下图)我们可以得知,59x9的内存从0x0000开始,一直到0x13FFF。对应着这个图和Cmd文件,我们可以了解内部的地址分配问题,如果做过总线扩展之类的同学肯定对这个不会陌生了,如果没有见过就需要理解一下。其实也很简单,就是对应的地址要对应上就可以了。有一些是固定好的不能变,比
[单片机]
MSP430FR5969<font color='red'>内存</font><font color='red'>分配</font>的问题
STM32 内存分配解析及变量的存储位置
内存映射 在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。在对于 RAM 紧缺的嵌入式系统中,是缺少 MMU 内存管理单元的。因此在一些嵌入式系统中,比如常用的 STM32 来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。 STM32 的 Flash 和 RAM 地址范围 笔者标题所说的内存是指 STM32 的 Flash 和 RAM,下图是 ARM Cortex M3 的地址映射图: 从图中我们可以看到 RAM 地址是从 0x2000 0000 开始的,Flash地址是从 0x08
[单片机]
STM32 <font color='red'>内存</font><font color='red'>分配</font>解析及变量的存储位置
Keil C51内存分配与优化
C51的内存分配不同于一般的PC,内存空间有限,采用覆盖和共享技术。在Keil编译器中,经过编译后,会形成一个M51文件,在其内部可以详细的看到内存的分配情况。 C51内存常见的两个误区: (1) 变量超过128字节后必须用COMPACT模式。 其实,只要不超过256字节,都可以用SMALL模式 (2) 内部RAM,128字节以上的是SFR用,不给程序用。 其实,由于C51寻址的不同,高128字节也可以用来存储变量,虽与SFR地址相同,但寻址的方式不同。 下面通过几个程序来看内存的分配。 *******************************************************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved