处理器的Flash空间分配

描述

在一个实际的项目中,Flash的使用会进行专门的安排,分成不同的区域供不同的目的使用。最常见的是分成bootloader区和主程序区。对于有些需要在掉电后保存数据的,还会分配一段区域保存这些重要的数据,这一块儿我们就叫它eeprom吧。

通常bootloader会放在flash最开始的地方,eeprom放在flash最后,具体大小需要根据实际的项目需要分配。

处理器

这种情况下需要对链接文件进行修改,主要是改一下main app的起始地址,否则默认情况下都是存放在flash最开始的地方,main app就会把bootloader覆盖掉。

在linux下,后缀为ld的就是链接文件,它里边有这么一段内容:

处理器

MEMORY就是用来给系统分配存储空间的,包括RAM、FLASH、外部存储等等。上图中是main app的分配情况。这个示例中,flash的起始地址是0x08000000,给bootloader留了4k(0x1000)的空间,所以main app的起始地址ORIGIN就是0x08001000,长度的话32k减去4k剩下27k。这样在链接的时候就以0x08001000为基准往后安排。

另外还有一种情况需要在链接文件中修改。我们在开发的时候有时候想要某些特定的数据或代码保存在特定的flash地址处,这个时候就可以通过在链接文件中添加这个特定的段空间来搞定。比如下面的例子

处理器

它在main app的最开始存放向量表,之后存放软件版本信息,接下来才是代码段。

分配好空间后,需要给自定义的段起一个名字,以便在程序中调用。

处理器

关键字SECTIONS下就是各个数据段的具体分配情况,段名.isr_vector指定的内容放在FLASH_VECTAB下,.firmware_info指定的内容放在FLASH_VERSION下。在KEEP后括号内的名称就是代码中用来指定的段名。具体使用方法如下:

汇编:

处理器

这个很少用到,除非你用汇编写代码。

C:

处理器

通过上面的操作,就可以把指定的数据放到flash特定的地方。

!!!:不同的编译器实现的细节和用到的关键字不一样,需要查看其具体的帮助手册。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分