gpt4 book ai didi

c - 如何知道应用程序的启动点

转载 作者:行者123 更新时间:2023-11-30 19:38:01 24 4
gpt4 key购买 nike

我正在使用 Atmel studio 7.0。

我在尝试理解freeRTOS的代码时遇到了这个函数。

/*
* Low-level initialization routine called during startup, before the main
* function.
* This version comes in replacement to the default one provided by the Newlib
* add-ons library.
* Newlib add-ons' _init_startup only calls init_exceptions, but Newlib add-ons'
* exception vectors are not compatible with the SCALL management in the current
* FreeRTOS port. More low-level initializations are besides added here.
*/
int _init_startup(void);
int _init_startup(void)
{
/* Import the Exception Vector Base Address. */
extern void _evba;

#if configHEAP_INIT
extern void __heap_start__;
extern void __heap_end__;
portBASE_TYPE *pxMem;
#endif
...

正如你在评论中看到的,这个函数是在 main 之前调用的,但是我不明白谁调用了这个函数。

经过一番研究,我说这个函数可以在链接描述文件中调用,但事实并非如此,链接描述文件看起来像:

/* Default linker script, for normal executables */
OUTPUT_FORMAT("elf32-avr32", "elf32-avr32",
"elf32-avr32")
OUTPUT_ARCH(avr32:uc)
ENTRY(_start)
/* Do we need any of these for elf?
__DYNAMIC = 0; */

我希望在此文件中找到对 _init_startup 的调用,但事实并非如此。

总结一下我的问题:

1- 在哪里可以找到对 _init_startup 的调用

2-为什么在链接器脚本中我有 ENTRY(_start) 而不是 ENTRY(main)

3-哪里可以找到_start的定义

非常感谢。

最佳答案

没有与 Atmel MCU 合作过,但我认为它与其他的相同。

1- 在哪里可以找到对 _init_startup 的调用?

  • 你不能,它是绝对地址跳转。您可以在 MCU 闪存复位 vector 中找到它。

2-为什么在链接器脚本中我有 ENTRY(_start) 而不是 ENTRY(main)?

  • 因为代码的第一条指令位于地址_start。第一段代码运行后,应该有跳转命令指向main。

3-哪里可以找到_start的定义?

  • 它可能是保留字。尝试在编译器选项中查找它。

关于c - 如何知道应用程序的启动点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38884561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com