0

这是我的程序的 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,以便我运行此代码的芯片能够正确执行。它应该像链接描述文件一样简单,不是吗?

4

2 回答 2

1

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

于 2013-07-06T05:37:46.777 回答
0

我曾经为 AVR 编程,据我所知,更改main()条目的唯一方法是熔丝位。但是你可以把 FLASH 后面的 bootloader 放进去。取决于芯片主要在不同的地方开始,我不确定,但在 AVR 上它应该0x20类似于0x100.

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

另外,我读过你的评论。您不需要0x00为某些寄存器(AVR 寄存器分为 SRAM,其他 FLASH)和中断向量放置 256 个字节,所以如果您使用让我们说定时器或 UART 并且您的代码0x00从这些的初始化会破坏你的代码。

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

于 2013-07-05T08:49:26.003 回答