搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2014-5-17 18:27:36 | 显示全部楼层 |阅读模式
本帖最后由 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. }
复制代码

最后希望大家开发顺利!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-5-19 10:30:47 | 显示全部楼层
感谢楼主的经验分享,分析的很到位!

出0入0汤圆

发表于 2014-9-5 14:58:57 | 显示全部楼层
谢谢分享,好好研究一下。

出0入0汤圆

发表于 2014-9-5 15:42:03 | 显示全部楼层
感谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 01:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表