目录
描述
-
1
使用printf函数打印以下信息:
volatile unsigned int *dest = (volatile unsigned int *)&__code_start;
volatile unsigned int *end = (volatile unsigned int *)&__bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
a. 打印dest, end, src的值
b. 打印dest, end, src所指向的地址的值
-
2
修改链接脚本,把程序重定位到0x32000000,再观察上述打印结果
解答
-
1
在 main.c 中的代码:
int main(void)
{
uart0_init();
volatile unsigned int *dest = (volatile unsigned int *)&code_start;
volatile unsigned int *end = (volatile unsigned int *)&bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
printf("dest=0x%x, end=0x%x, src=0x%x",dest,end,src);
puts("\n\r");
printf("*dest=0x%d, *end=0x%d, *src=0x%d",*dest,*end,*src);
puts("\n\r");
*dest = 1;
*end = 2;
*src = 3;
printf("*dest=0x%d, *end=0x%d, *src=0x%d",*dest,*end,*src);
puts("\n\r");
while(1)
{
}
return 0;
}
串口输出结果如下:
-
2
在 sdram.lds 链接脚本中修改
SECTIONS {
. = 0x30000000;
code_start = .;
. = ALIGN(4);
.text :
{
*(.text)
}
. = ALIGN(4);
.rodata :
{
*(.rodata)
}
. = ALIGN(4);
.data :
{
*(.data)
}
. = ALIGN(4);
bss_start = . ;
.bss :
{
*(.bss) *(.COMMON)
}
bss_end = . ;
}
串口输出结果如下:
对比上一个结果,可知链接脚步中的变量使用&取出变量的值,而把这个值当成地址操作后,就会直接操作sdram