以前用的外部sdram作为内存扩展,现在要使用外部flash作为rom拓展。
ps:以前是用的文件系统来驱动flash的,现在用的内存映射。
所以我需要重新更改sct文件了。感觉我都已经改sct文件这么多次了,这次好好捋一捋是怎么个事。
这次我的更改如下:
[C] 纯文本查看 复制代码
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}
EXT_FLASH 0x90000000 0x1000000{
EXT_ROM 0x90000000 0x1000000{
*(.ROM_EXT)
}
}
看注释里写的有加载region和执行region,以前学过一些链接过程,还有输出section和输入section。我自己思考了半天,理论和实践没对上,特来请教大佬们。我的想法如下:
1.加载region是代码存放的内存地址,执行region是代码运行时的内存地址。如果二者的地址不同,一般是程序自身启动之后立刻将部分代码(通常是数据段)从加载region放置到执行region。主要的目的是程序的数据段变量段是要求读写 的,而在单片机系统加载区域往往是flash,是不可写的,所有需要把数据段转移到ram来实现程序的正常运行。我的sct中LR_IROM1 和EXT_FLASH 是加载region,ER_IROM1 ,RW_IRAM1 ,EXT_ROM 是执行区域。
2.在.c文件中为数据指定section的宏__attribute__((section(".ROM_EXT"))) 是指定了数据的输入section为.ROM_EXT,而在sct文件中,*(.ROM_EXT)很明显是输出section,这个对应关系似乎并没有显示的表现出来。
综上,那么我理解的对不对呢?输入section转为输出section是缺省配置吗?
|