本文介绍了如何在嵌入式开发环境IAR中利用noinit段和指定地址变量来优化内存布局与初始化过程,适用于需要精确控制数据存储位置的高级开发者。
在IAR环境下使用noinit段来实现变量的指定地址分配是一种常见做法。noinit段主要用于保存敏感数据或特殊应用场合下的不能被复位的数据。
定义noinit段中的变量有两种方式:一种是在变量类型前面加上__no_init关键字,另一种是通过预编译指令#pragma指定特定的存储区域。个人倾向于使用第一种方法,因为它更为直观和简洁。
通常情况下,noinit段所在的SRAM区地址范围由编译器自动分配。然而,在某些特殊应用中(例如带Bootloader的应用),可能需要将变量固定在某个已知地址上。这可以通过修改链接文件来实现:
1. 打开IAR工程的链接文件,并预留出所需的存储空间。
2. 为noinit区域指定一个固定的范围,比如从(RAMstart-0x30)到RAMstart,占用30字节大小的空间。
3. 将.noinit段分配至上述定义的noinit_region区中。这一步告诉编译器所有被标记为__no_init类型的变量应当放置在这个区域里。
4. 在C文件中声明一个数组temp,并使用关键字__no_init来指定其位于noinit区域,占用大小为48字节。
5. 编译整个项目后,在生成的.map文件中可以看到temp变量已经被分配到了0x1ffff410地址上,且占用了30个字节的空间。
通过这种方式可以实现对特定位置存储的需求,并在某些场合下(例如Bootloader应用)显得尤为重要。在这种场景下,用户代码和Bootloader代码是独立的工程,在编译时没有相互关联的信息。因此需要明确告知Bootloader变量的具体地址以便其能够正确读取数据。