Flash重新分区 GCC编译器下

目录

  • 简介
    • 内存分配
      • CPU 内存分配
      • 链接脚本
      • 使用分区
  • 修改对应的 flash数据
      • 需要实现的API

简介

需要在程序运行当中修改 Flash。写一篇文章来记录一下。

  • CPU 是 MLX81108
  • 使用得编译器是mlx-gcc

内存分配

CPU 内存分配

Flash重新分区 GCC编译器下_第1张图片
我们需要修改得数据位于 0x5000 ~ 0xBFFF之间。

链接脚本

因此需要修改 .ld文件增加一个段。
Flash重新分区 GCC编译器下_第2张图片
现在增加一个私有的段到flash中,名称为 private_rom。用作存储私有得数据。
Flash重新分区 GCC编译器下_第3张图片

  • 分析
    MLX81108 ,默认得原来得rom分区是
// 81108_9-lin.ld 文件
// 原来得分区
    rom             (rx)    : ORIGIN = 0x5608, LENGTH = 0x6878  /* MLX16 program memory */
    loader_flags    (r)     : ORIGIN = 0xBE80, LENGTH = 0x0080  /* Bootloader flags page (app_enable, app_disable flags etc) */
// 修改以后得分区
	rom             (rx)    : ORIGIN = 0x5608, LENGTH = 0x6678 /* MLX16 program memory */
    private_rom     (rwx)   : ORIGIN = 0xBC80, LENGTH = 0x200 /* MLX16 program memory */
    loader_flags    (r)     : ORIGIN = 0xBE80, LENGTH = 0x0080  /* Bootloader flags page (app_enable, app_disable flags etc) */

private_rom 分区放在了 rom分区以后,大小为 **0x200 ** 。 512字节。

使用分区

  • 假设我们定义了一个
color_struct_t color_array[128] __attribute__ ((section(".private_rom.color_array"))); //数组

color_array放在了 .private_rom.color_array 段。
然后修改 ld文件

// 81108_9-lin.ld 文件
    .private_rom ():
    {
     
        . = ALIGN (0x2);
        __private_rom_start = . ;
        *(.private_rom.color_array)
        . = ALIGN (0x2);
        __private_rom_end = . ;
    } > private_rom
    __private_rom_size = __private_rom_end - __private_rom_start; 

.private_rom.color_array 放入 private_rom 分区
查看编译以后得 map 文件

.private_rom    0x0000bc80      0x200
                0x0000bc80                . = ALIGN (0x2)
                0x0000bc80                __private_rom_start = .
 *(.private_rom.color_array)
 .private_rom.color_array
                0x0000bc80      0x200 obj/color_index.o
                0x0000bc80                _color_array
                0x0000be80                . = ALIGN (0x2)
                0x0000be80                __private_rom_end = .
                0x00000200                __private_rom_size = (__private_rom_end - __private_rom_start)
                0x00000400                PROVIDE (__end, 0x400)

就可以完全对应得上 ld中间得数据了。

修改对应的 flash数据

我们前面在ld文件中,增加了

__private_rom_start  
__private_rom_end 
__private_rom_size 
// 以及一个
color_struct_t color_array[128];
  • 三个地址
  • 一个数组。
  • 一个页的大小是 128byte
    我的目标就是将根据 _private_rom.* 修改 color_array 中的数据

需要实现的API


你可能感兴趣的:(基础)