|
按照 C 语言标准,我是这样写程序的: int main(void) { // Init initMethod(); / Main loop / while (1) { execute(); } // This return is never reached return 0; } 但是当代码用 SonarQube 做静态检测时,它报了一个错误'return' will never be executed。 为了修复这个问题,我打算改成这样: int main(void) { // Init initMethod(); / Main loop / while (1) { execute(); } } 但我又很纠结:main 函数不写返回值,感觉不符合规范。 这种情况下,正确的嵌入式编程规范到底是什么? |
STM32L4A6 SDMMC 无法使用 1.8V IO 驱动 microSD 卡
STM32L4P5xx 系统内 Bootloader:RAM3 能否用作栈指针内存?
在 STM32CubeIDE 中生成 ioc 配置文件
CAN 总线多节点环境下进行固件升级
在 Bootloader 运行期间保持 GPIO 引脚电平状态不变
把 MCO1 时钟源选为 PLLCLK会怎样
I2C 错误代码含义
CubeIDE 下载程序时不整片擦除芯片
在编译C++ STM32项目时,如何将.hpp文件扩展名与合并了头文件声明和源文件定义的模板
sscanf 函数无法正确读取浮点值
微信公众号
手机版
return 0; 这个返回值是返回给操作系统用来判断程序是否正常退出的,你可能没见过但是以后肯定能见到,有些程序突然闪退了,会在终端或者弹出一个窗口说退出码多少多少,这个退出码只要不是 0,就说明程序非正常退出,换句话说程序还没有执行到 return 0 就被操作系统杀掉了。
而 MCU,对于裸机而言,根本就没有操作系统,何谈返回值,就算返回了返回给谁呢?
而像 FreeRTOS 这种,这种操作系统和 Windows/macOS/Linux 这种操作系统又不一样了,Window/macOS/Linux 的内核都是在你用户的程序运行之前运行,也就是在所谓的 main 函数外部运行,初始化硬件以及准备软件运行环境。
对于 RTOS,以 FreeRTOS 举例,FreeRTOS 内核开始运行是在 main 函数内部,初始化硬件外设之后,调用 vTaskStartScheduler() 之后才开始运行,也就是说这个 FreeRTOS 的内核本身是在 main 函数内部的,那这个返回值返回给谁呢?
所以根本就没有这个必要返回,你写了反而多此一举。但是从语法上来说,函数已经声明了返回类型为 int,但是不返回任何值,编译器是会报警告或者错误的,这里应该厂商针对了编译器进行了优化。
忽略那个错误就是了
[md]针对于win,mac,linux系统,main()是应用程序。rtos来说main就是主函数了