在一个实际的项目中,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特定的地方。
!!!:不同的编译器实现的细节和用到的关键字不一样,需要查看其具体的帮助手册。
全部0条评论
快来发表一下你的评论吧 !