打印
[STM32F4]

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

[复制链接]
1047|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lanjackg2003|  楼主 | 2016-7-19 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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以后的地址。

不知道有没有什么方法解决这样的问题呢?
我想到的方法是对ram重新进行划分,类似如下:
0x2000 0000~0x2000 ffff        bootloader
0x2001 0000~0x200F 0000        APP

但是这样有点浪费RAM,有没有其他方法不这么浪费RAM的?还有malloc分别失败的原因是什么(不可能是RAM空间不够,因为有192kb)?




沙发
lanjackg2003|  楼主 | 2016-7-19 16:56 | 只看该作者
问题找到了,由于bootloader中仍然有一个全局变量未被重映射,导致分配的内存在非0x2000 0000.
原来的设想是可行的。
等时间结贴,下一楼给分

使用特权

评论回复
板凳
soybean1998| | 2016-7-20 00:53 | 只看该作者
不明觉厉

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

426

帖子

7

粉丝