- ; *************************************************************
- ; *** 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, 下载次数: 34)
源码