每个芯片开发商都会针对每款芯片来编写一个.icf文件就是传说中的链接文件。对于基本的应用,这个.icf文件足以满足你的工程需要。但有时也会需要改动,比如当你的项目要添加外部RAM时就要修改一下icf。
当然这些都是最基本的,你也可以设置以下的东西来匹配你的具体项目。
比如我要添加另一个名为ROM2的ROM区域,大小是256bytes,起始地址是0x80000.
define region ROM = Mem:[from 0x80000 size 0x100];
如果你要把你的只读常量放置在你指定的域而不是编译器默认的位置,你就得按如下操作了:
define region CONST_region = Mem:[from 0x100 size 0x100];
place in CONST_region{readonly section .rodata}
place at address Mem:[0] {readonly section .intvec} //--将向量表放置在地址0处。
Note:之前在看启动代码时,老在想这个向量表示怎么放到地址0处的呢,查了一下reference
__vector_table是编译器专有字符,表示出处开始放置向量表。
在代码开始处就声明了此段为.intvec。链接的时候在依据icf把它放到地址0处。
Initialize by copy {section .textrw}
二、下面是我对generic_cortex.icf的注解
硬件:STM32F103ZET6 + 512Kbyte 外扩的SRAM
使用原子的内存管理函数给 EMWIN分配内存,分为内部RAM和外部RAM两个内存池
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]
| mem:[from __ICFEDIT_region_EXTRAM_start__ to __ICFEDIT_region_EXTRAM_end__];
这里采用这种写法时,内外部RAM放在一起供编译器链接时自动分配,
编译器链接.data / .bss段时会自动给各个.o 文件中的对应段分配RAM,但是当内部RAM空进不足时编译器将内部RAM内存池或者EMWIN函数.o文件中的
.data、.bss分配到外部RAM时,刷屏就会变得很慢。
这里可以自行定义一个section ,将大数组,读取不太频繁的数据放进这个section,同时在ICF文件中将这个section放入外部RAM,仅让编译器自动分配内部RAM,手动指定外部RAM的分配即可。
如下:
在 程序中:定义一个section :#pragma section = “MYSECTION”
定义变量或数组时:
#pragma location = "MYSECTION"
UartItem uart1;//定义的串口设备变量
或者
unsigned char buf [100]@"MYSECTION";
在ICF配置中:
define region EXRAM_region = mem:[from __ICFEDIT_region_EXTRAM_start__ to __ICFEDIT_region_EXTRAM_end__];
place in EXRAM_region { readwrite section MYSECTION};
//
ICF配置
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/本文发布于:2024-02-04 11:00:41,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170705656854979.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |