如何将main()重定位到0x00000000?

时间:2013-07-03 18:10:16

标签: gcc assembly ld avr

这是我的程序的nm转储。

00000000 T __ctors_end
00000000 T __ctors_start
00000000 T __dtors_end
00000000 T __dtors_start
00000000 a __tmp_reg__
00000000 T __trampolines_end
00000000 T __trampolines_start
00000000 T setup
00000001 a __zero_reg__
0000003d a __SP_L__
0000003e a __SP_H__
0000003f a __SREG__
00000072 T __vector_15
00000086 T main
000000a8 A __data_load_end
000000a8 A __data_load_start
000000a8 T _etext
00800100 D _edata
00800100 T _end
00810000 T __eeprom_end

架构是AVR,我需要将main()备份到0x00000000,以便我运行此代码的芯片能够正常执行。它应该像链接器脚本一样简单,不应该吗?

2 个答案:

答案 0 :(得分:0)

我曾经为AVR编程,因为我知道更改main()条目的唯一方法是保险丝位。但你可以把FLASH的背面放入bootloader。根据不同地方的芯片主要启动,我不确定,但在AVR上它应该是0x200x100

这是因为在开始时有RESET向量,寄存器和中断向量。 这个结构非常有用,一旦我有一个我无法使用看门狗的项目,所以触发重置的唯一方法就是溢出。

另外,我已经阅读了你的评论。您不需要为某些寄存器放置256个字节0x00(AVR寄存器分为一个是SRAM,其他FLASH)和中断向量,所以如果你使用let say timer或UART您的代码从0x00开始,因此初始化会破坏您的代码。

它的设计是为了工作,我认为重新设计会破坏它。但是如果你真的想要这个,你可以尝试添加-Ttext=0x0000这个标志。 这可以根据需要编译它,但我不建议这样做。

答案 1 :(得分:0)

main()在内存中的位置无关紧要。只需在复位向量处将jump指令放入其地址,或在应用程序存储器中放置0x0000