打印

[技术问答] 基于scatter file的代码分区操作

[复制链接]
2777|1
跳转到指定楼层
楼主
本帖最后由 JasonLee27 于 2019-7-15 16:54 编辑

有时候我们需要对项目的代码进行分区,在GCC中使用.ld的链接脚本指定代码的链接地址以及load地址,在keil中并没有ld文件,对简单的分区可以直接在Target配置框进行,但如果比较复杂,我们就需要用到scatter文件进行分区操作。
硬件: AC781x demo板,JLINK仿真器
软件: Keil 5.2.3,JLINK6.44

1,新建一个keil工程,打开工程配置选项,选中Link页,按如下配置,并选中自己新建的*.sct文件:

这里以我自己的例程为例:
LR_IROM1表示一个装载区域,后面参数表示起始地址和段大小
ER_IROM以及后面的IRAM表示执行区域,后面参数表示链接地址和大小(此处的大小不是这个区域的大小,而是这个区域大小不能超过这个限制)
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************

  4. LR_IROM1 0x08000000 0x00040000  {    ; load region size_region
  5.   ER_IROM1 0x08000000 0x00006000  {  ; load address = execution address
  6.    *.o (RESET, +First)
  7.    *(InRoot$Sections)
  8.    .ANY ;(+RO)
  9.   }
  10.   IRAM1 0x20000000 0x00004000  {  ; RW data
  11.    .ANY (+RW +ZI)
  12.   }
  13.   IRAM2 0x20004000 0x00002000  {  ; RW data
  14.    .ANY (pg_data1)
  15.   }
  16.   IRAM3 0x20006000 0x00002000  {  ; RW data (+RW +ZI)
  17.    .ANY (pg_data2)
  18.   }
  19. }
  20. LR_IROM2 0x08026000 0x00002000 {
  21.   DATA_FLASH 0x08026010 FIXED 0x00001000  {  ; load address = execution address
  22.    * (flash_data)
  23.   }
  24. }
复制代码
编写好scatter文件后,就可以用里面的段名,将自己的代码存放在指定的位置了
我这里使用的是#pragma预编译,也可以使用__attribute__的方式指定。
  1. /* variable in IRAM1 region */
  2. uint8_t ZI_data_IRAM1[10];
  3. uint8_t RW_data_IRAM1[10]={0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  4. /* const variable in ER_ROM1 region */
  5. const uint8_t RO_dataROM1[10]={0,1,2,3,4,5,6,7,8,9};
  6. /* variable in IRAM2 region */
  7. #pragma arm section rwdata = "pg_data1"
  8. uint8_t rw_data_IRAM2[10] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
  9. #pragma arm section rwdata
  10. #pragma arm section zidata = "pg_data1"
  11. uint8_t zi_data_IRAM2[10];
  12. #pragma arm section zidata
  13. /* variable in IRAM3 region */
  14. #pragma arm section rwdata = "pg_data2"
  15. uint8_t rw_data_IRAM3[10] = {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa};
  16. #pragma arm section rwdata
  17. #pragma arm section zidata = "pg_data2"
  18. uint8_t zi_data_IRAM3[10];
  19. #pragma arm section zidata

  20. /* const variable in DATA_FLASH region */
  21. #pragma arm section rodata = "flash_data"
  22. const uint8_t ro_data_flash[10] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
  23. #pragma arm section rodata
复制代码
完成后可以通过JLINK仿真,查看自己的指定区域定义的数据是否都正确。

对于scatter file的语法可以参考keil的帮助文档,里面有很详细的释义:
scatterfile_sample.rar (1.9 MB, 下载次数: 10) 源码

沙发
| 2019-7-18 13:41 | 只看该作者
上了编辑推荐,不错
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表
江苏快三走势图 浙江体彩6+1 宁夏11选5 浙江快乐12开奖 宁夏11选5走势图 辽宁快乐12 辽宁快乐12走势图 江西11选5开奖 江西11选5 辽宁快乐12走势图