首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将main()重新定位到0x00000000?

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

Stack Overflow用户
提问于 2013-07-04 02:10:16
回答 2查看 346关注 0票数 0

这是我的程序的nm转储。

代码语言:javascript
复制
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,这样我运行这段代码的芯片才能正确执行。它应该像链接器脚本一样简单,不是吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-06 13:37:47

main()在内存中的位置并不重要。只需将一条jump指令放到应用程序内存中的复位矢量或0x0000的地址。

票数 1
EN

Stack Overflow用户

发布于 2013-07-05 16:49:26

我曾经为AVR编程,正如我所知,更改main()条目的唯一方法是熔丝位。但是你可以把闪存放在引导程序的后面。根据芯片main在不同的地方开始,我不确定,但在AVR上,它应该是类似于0x200x100

这是因为在开始时有复位向量、寄存器和中断向量。这个结构非常有用,有一次我有一个项目,我不能使用watchdog,所以触发重置的唯一方法是溢出。

另外,我已经看过你的评论了。你不需要把256字节的0x00放在某些寄存器(AVR寄存器被分成一个是静态随机存取存储器,另一个是闪存)和中断向量,所以如果你使用定时器或通用异步收发器,你的代码从0x00开始,所以初始化这些寄存器会破坏你的代码。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17455288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档