IAR官方解释
变量保存位置
MDK
定义一个数组比如value[],让数组的首地址指向特定的SRAM地址,比如0x20000100
1)__align(8) uint8_t value[20] __attribute__((at(0x20000100)));
2)int value[] __attribute__((section(".ARM.__at_0x20000100"))) = {0x01, 0x02}; GCC中定义
IAR
方式一: 占用内存必须是4的倍数(int 、uint、float、double,如是int8、uint8的话需要数组字节数是4的倍数,如是short的话需要数值字节数需要是2的倍数) __root :强制编译,是IAR的扩展关键字,保证没有使用的函数或者变量也能够包含在目标
#pragma location = 0x000FFF00
__root char data[] =
{
0x0,0x1,0x2,0x3
};
方式二: 类型必须是4的倍数(int 、uint、float、double),需要调用否则会被优化,map中就看不到
int data @0x000FFE00 = 3;
指定函数的存放地址
MDK
方式一:
void func (void) __attribute__((section(".ARM.__at_0x00000200")));
void func (void)
{
}
方式二
__attribute__((section(".ARM.__at_0x00010000"))) void func (void)
{
}
IAR
调整ROM、RAM
icf的选择根据工程目标板选择:
place in ROM_region { readonly section myfunc};
#pragma default_function_attributes = @ "myfunc"
int32_t main(void);
#pragma default_function_attributes =
指定ROM地址
place at address mem:0x1f00 { readonly section .MYTEST };
或者申请指定区域写法
define region DATA_region = mem:[from 0x1ff0 to 0x2ff0 ];
place in DATA_region { readwrite section .MYTEST };
单个函数:
在函数后面使用@指定到section名
int32_t main(void)@".MYTEST"
{
CLK_Init();
while(1)
{
};
}
多个函数指定
#pragma default_function_attributes = @ ".MYTEST"
int32_t main(void);
void fun(void);
#pragma default_function_attributes =
方法没调用的会被优化,或者使用__root强制编译
|