这是我的程序的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,这样我运行这段代码的芯片才能正确执行。它应该像链接器脚本一样简单,不是吗?
发布于 2013-07-06 13:37:47
main()在内存中的位置并不重要。只需将一条jump指令放到应用程序内存中的复位矢量或0x0000的地址。
发布于 2013-07-05 16:49:26
我曾经为AVR编程,正如我所知,更改main()条目的唯一方法是熔丝位。但是你可以把闪存放在引导程序的后面。根据芯片main在不同的地方开始,我不确定,但在AVR上,它应该是类似于0x20到0x100。
这是因为在开始时有复位向量、寄存器和中断向量。这个结构非常有用,有一次我有一个项目,我不能使用watchdog,所以触发重置的唯一方法是溢出。
另外,我已经看过你的评论了。你不需要把256字节的0x00放在某些寄存器(AVR寄存器被分成一个是静态随机存取存储器,另一个是闪存)和中断向量,所以如果你使用定时器或通用异步收发器,你的代码从0x00开始,所以初始化这些寄存器会破坏你的代码。
它是为工作而设计的,我认为重新设计会破坏它。但是如果你真的想要这个,你可以试着添加-Ttext=0x0000这个标志。这可能会像你想要的那样编译它,但我不建议这样做。
https://stackoverflow.com/questions/17455288
复制相似问题