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*/

查看二进制文件:

 

posted @ 2022-05-23 16:47  SweetTea_lllpc  阅读(770)  评论(0编辑  收藏  举报