经验分享:MQX中用分散加载中的USEDFLASH_END错误

2020-02-21 20:59发布

本帖最后由 wangpengcheng 于 2014-5-18 11:10 编辑

MQX中有一个分散加载的变量:USEDFLASH_END,它的意义在于可以算出来代码量有多大,让用户可以将剩余的Flash作为数据Flash区域,不用去人工计算数据Flash的起始地址,其在分散加载文件中的定义是:
  1. #define MY_ALIGN(address, alignment) ((address + (alignment-1)) AND ~(alignment-1))
复制代码
  1. USEDFLASH_END MY_ALIGN(ImageLimit(CODE) , FLASHX_SECT_SIZE) EMPTY 0x4
  2.     {
  3.     }
复制代码

意思是从CODE段的结束地址的下一个扇区开始!

但是经过我跟HEX对比,发现其实ImageLimit(CODE) 并不是所有HEX文件的结尾,只是程序代码的结尾,其后面还有许多数据,这些数据应该是RW与ZI生成的常量,所以USEDFLASH_END的起始地址应该是:CODE扇区结束地址+DATA扇区尺寸的地址,下一个扇区开始!

但是DATA段定义在后面,所以我们要将USEDFLASH_END定义放在文件后面:

  1. #! armcc -E

  2. #define INTFLASH_END_ADDR       0x00040000
  3. #define INTFLASH_BASE_ADDR      0x00000000
  4. #define INTFLASH_SIZE           (INTFLASH_END_ADDR - INTFLASH_BASE_ADDR)
  5. #define FLASHX_SECT_SIZE        (0x800)

  6. #define MY_ALIGN(address, alignment) ((address + (alignment-1)) AND ~(alignment-1))

  7. LOAD_REGION_INTFLASH INTFLASH_BASE_ADDR INTFLASH_SIZE
  8. {
  9.     VECTORS INTFLASH_BASE_ADDR
  10.     {
  11.         vectors.o (.vectors_rom,+FIRST)
  12.         vectors.o (.cfmconfig)
  13.     }

  14.     CODE +0
  15.     {
  16.         * (InRoot$Sections)      ; All library sections for example, __main.o,
  17.                                   ; __scatter*.o, __dc*.o, and * Region$Table
  18.         * (KERNEL)
  19.         * (TEXT)
  20.         * (+RO)
  21.     }


  22.     RAM_VECTORS 0x1FFF8000 ; For ram vector table. Used when  MQX_ROM_VECTORS is set to zero.
  23.     {
  24.         vectors.o (.vectors_ram)
  25.     }

  26.     DATA +0
  27.     {
  28.         * (+RW)
  29.         * (+ZI)
  30.     }

  31.     USB_BDT MY_ALIGN(ImageLimit(DATA), 512)
  32.     {
  33.         * (.usb_bdt)
  34.     }

  35.     KERNEL_DATA_START MY_ALIGN(ImageLimit(USB_BDT), 0x10)
  36.     {
  37.         * (KERNEL_DATA_START)     ; start of kernel data
  38.     }
  39.    
  40.     KERNEL_DATA_END 0x20007FF0      ; RAM_END
  41.     {
  42.         * (KERNEL_DATA_END)     ; end of kernel data
  43.     }

  44.     ; mem_init writes a storeblock_struct at the end of kernel data,
  45.     ; max size 32 bytes, so use 0x100 offset
  46.     BOOT_STACK_ADDR 0x20007EF0
  47.     {
  48.         * (BOOT_STACK)
  49.     }
  50.    
  51.         USEDFLASH_END MY_ALIGN(ImageLimit(CODE) + (ImageLimit(DATA) - ImageBase(DATA)), FLASHX_SECT_SIZE) EMPTY 0x4
  52.     {
  53.     }

  54.     ; make sure this alignment matches the alignment in kernel_data.s in the bsp
  55.     FLASHX_START MY_ALIGN(ImageLimit(CODE) + (ImageLimit(DATA) - ImageBase(DATA)), FLASHX_SECT_SIZE)
  56.     {
  57.         * (FLASHX)
  58.     }
  59. }
复制代码
最后希望大家开发顺利!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。