在Keil中利用分散加载(scatter)在Flash中实现App区和固件区的分离_keil flash分段

如果将固件区单独分为一个区,可以让无论程序运行在A区或者B区时,都可以调用固件区的模块,这样就相当于可以将固件区的空间复用,提高了空间利用率。

固件区与APP区分开的可行性原理

对于一些嵌入式软件的初学者来说可能会有一些困惑,如果这些模块都不和APP在同一个project中编译,如何被app调用。任何一个函数都是以二进制的方式存储在Flash上的,如果用相同的编译器和编译参数,在同一MCU平台上,无论该函数被放置在什么地址,或者是被那个target或是project编译,其最后存储的二进制代码都是一样的。因此一个嵌入式APP软件只要知道一个函数的类型声明和在Flash位置,就可以直接调用该函数。

如何将函数放在Flash的固定区域

首先我们说一下如何将一个函数甚至是一个模块放在Flash的固定位置。由于笔者一般都是用keil,因此以下的方法都是基于keil环境:

方法一:

如果只有一个函数,我们可以在函数声明的时候在函数末尾加上__attribute__((section(“.ARM.__at_0xXXXXXXXX”)))的语句,将某个函数编译后固定存放在Flash的固定位置。

void function(void) __attribute__((section(".ARM.__at_0xXXXXXXXX")));

void function(void)
{
    ...
}

方法二:

如果要将几个函数一起放在一块区域内,那就不太可能使用方法一了,我们没法提前知道这些函数的长度,就算知道这些函数的长度,还要手动

  • 17
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值