这里写自定义目录标题
绝对地址函数创建和读取函数
#pragma arm section code=".ARM.__at_0x3000"//定义test函数的绝对地址在0x3000处
void test(void)
{
printf("test\r\n");
}
#pragma arm section
int main(void)
{
UART0_Init(9600,0x31);
printf("start\r\n");
while(1)
{
printf("The address of function = %d !\n",test);//读取函数绝绝对地址
((void(*)(void))0x3001)();//实验得出函数在绝对地址+1处
}
}
可以看到函数在0x3000的地址上。
而12289地址转换成16进制就是0x3001。
const定义绝对地址。这个地址我用在Bootloader更新APP识别上,这里我用的是新唐的NUC029,APP放在0x3000的位置,如果把datatest这个数组放到0x3000上当程序跳转到0x3000上时死程序。测试下来好像是在不同的FLASH的地址上编译出来的程序有所不同。所以我在编译APP程序时,把datatest数组放到了0x3000前面512字节处,就是0x2E00这个地址。
const uint8_t datatest[512] __attribute__((at(0X2e00)))={0x00,0x0a};
//0x00,0x0a可以根据自己需求修改