Mounriver分配FLASH空间(CH573)
一、概念
在KEIL中修改地址比较方便,在KEIL的Target中直接分配; 在MRS中无法这样修改,MRS中定义数组之后是由程序主动分配地址的,而无法达到自行分配的效果,因此需要通过修改LD文件进行分配FLASH地址。
修改的办法是开辟一段空间,然后将数组放进去。例如:现在定义一个数组的大小为8K,那么我可以将原来的FLASH分区为FLASH1(440K)和FLASH2(8K),把数组放在FLASH2中。注意:如果FLASH2定义为8K,数组定义为9K,那么将该定义放入FLASH2中程序会报错。
二、操作
1、Link.ld文件修改:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 400K
FLASH2 (rx) : ORIGIN = 400K, LENGTH = 20K
FLASH3 (rx) : ORIGIN = 420K, LENGTH = 28K
RAM (xrw) : ORIGIN = 0x20003800, LENGTH = 18K
}
.consumer_flash2 :
{
. = ALIGN(4);
}AT>FLASH2
.consumer_flash3 :
{
. = ALIGN(4);
}AT>FLASH3
FLASH修改完成,已成功分配3块空间,接下来验证并对每个空间使用。
2、分别使用FLASH2和FLASH3:
const uint8_t __attribute__((section(".consumer_flash2"))) user_data1[20] = {4,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0x0};
const uint8_t __attribute__((section(".consumer_flash3"))) user_data2[20] = {5,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0x0};
加上打印(记得换行)
注:进行后编译会显示对应FLASH空间已经使用到,否则出现FLASH已经成功分配,但是没有占用空间,这里笔者的使用是加上打印。
PRINT("%x\r\n", user_data1);
PRINT("%d\r\n", user_data1[0]);
PRINT("%x\r\n", user_data2);
PRINT("%d\r\n", user_data2[0]);
3、根据打印分别查看user_data1和user_data2的地址:
其地址分别在FLASH2和FLASH3的首位,同时其数值也是正确的。
4、此时我们检查编译信息进行对比:
分配空间与使用均为合理,操作成功。
注,报错检查:
1、请检查一下分配地址时是否有断开,如448K的FLASH,只分配了200K;
2、是否有重叠,如分配RAM时,首地址从0开始,抢占了FLASH的区域。
附:
原始工程参考:CH573_MRS_AssignFLASH
附,常量定义在指定FLASH区域:
方法1:
指定字符串放在FLASH中
--section-start=.TEST=0x0000A000
__attribute__((section(".TEST"))) const uint8_t buf123[10]= {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
注意配置后再memcpy一下,防止被优化。
方法2:
在ld文件的SECTIONS段添加如下:
.flash_test_address :
{
. = ALIGN(4); /*4字节对齐*/
. = ORIGIN(FLASH)+0x14000; /*ORIGIN(FLASH)为 MEMORY定义的FLASH的起始地址,指定到从FLASH起始的0x14000长度的位置*/
KEEP(*(SORT_NONE(.test_address_1))) /*链接时*KEEP()可以使得被标记段的内容不被清除*/
. = ALIGN(4);
} >FLASH AT>FLASH
定义:
__attribute__((section(".test_address_1"))) const uint8_t buf_1[] = {0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};/*地址为0x00014000*/
查看二进制文件: