谁接收 main() 返回的值?

电器工程 微控制器 avr C
2022-01-30 08:04:05

我知道在计算机中,函数返回的值main()被操作系统接收。但是,main()微控制器的功能会发生什么?

4个回答

在微控制器上,main()实际上并不期望退出,并且没有定义如果退出的行为 - 所以这取决于为微控制器编写 C 运行时的人。我见过这样的系统:

  • 在 周围有一个隐式循环main(),这样如果它退出,它就会再次被调用。
  • 有一个简单的“跳转到自我”循环(或 HALT 指令),如果main()退出就会执行。
  • 只需执行调用main(). 这被称为“跑进杂草”。

我从未见过真正使用main(). 如果这是您真正关心的事情,那么您应该查看并可能修改您系统的 C 运行时库的源代码。

一个常见的误解/神话是这int main是标准指定的唯一有效形式。那不是真的。

C 标准谈​​到了两种实现:托管和独立。在这种情况下,“实现”是指编译器。托管编译器针对特定操作系统进行编译,独立编译器针对特定裸机应用程序进行编译。嵌入式系统几乎总是独立系统——即使是在 RTOS 的情况下。

独立实现可以使用任何形式的 for main(),它们甚至不需要一个名为 main 的函数。大多数情况下,他们使用 form void main (void),因为返回任何东西都没有任何意义。

这里重要的是要认识到,决定形式的总是编译器main(),而不是程序员。

确实返回某些东西的独立实现main()是非常值得怀疑的。让你想知道制作编译器的人是否真的阅读了标准......

详情在这里

C 语言标准允许实现定义的变体void main( void ),这是嵌入式系统中的常用形式 - 仅仅是因为它们不希望返回。

如果您查看编译器设置,通常有一个引导代码片段,从重置向量调用,它在调用 main() 之前执行一些基本初始化(包括将初始化值复制到变量中)。

这也将(通常)在无限循环中,或者可能执行重置,如果main()返回

它(正如提到的其他答案)取决于您的工具链,但例如在 GCC main中被编译为其他函数,因此它的返回值将根据调用约定存储(在 ARM 上,我使用的不是 GCC,它将被放入 R0就在返回之前)。

我想这在 AVR-GCC 上是相似的,所以自定义脚本可以在 main 返回后使用这个值。