打印
[技术问答]

基于scatter file的代码分区操作

[复制链接]
7563|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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表示执行区域,后面参数表示链接地址和大小(此处的大小不是这个区域的大小,而是这个区域大小不能超过这个限制)
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

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

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

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

使用特权

评论回复

相关帖子

沙发
marginer| | 2019-7-18 13:41 | 只看该作者
上了编辑推荐,不错

使用特权

评论回复
板凳
AutochipsMCU| | 2020-9-15 11:56 | 只看该作者
顶上去,这么赞的帖子居然沉下去了

使用特权

评论回复
地板
装作有学位的人| | 2021-6-19 14:34 | 只看该作者
怎么才能下载附件呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

10

粉丝