|
本帖最后由 QianFan 于 2015-10-31 20:31 编辑 在笔记6---使用串口Part2(https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html)中,我们简单的介绍了一下exit。在windows或者linux操作系统中,main的返回值是有意义的,类型为int。这个返回值实际上是返回给操作系统的。0表示程序正常终止,其他非零表示程序异常终止。 在使用ST固件库提供的启动文件和syscalls.c文件之后,如果程序中主动调用exit,能跳转到_exit系统调用中。如果main中使用return,并不能跳到_exit系统调用中。这次我们通过更改启动文件,来将main的return传递给_exit. 函数参数和返回值的传递 根据ARM C/C++过程调用标准,如果函数的参数少于或者等于4个,那么第一个参数使用R0传递,第二个使用R1,依次类推。如果多于4个参数,那么前四个使用R0-R3传递,后面的参数使用栈传递。因为函数最多只能有1个返回值,返回值仅使用R0进行传递。 考虑这么一种情况,当main函数执行完之后,返回值保存在R0中。而void _exit(int status)期望1个参数,这个参数正好是main的返回值,因此在汇编中可以这样调用:
这样就巧妙的将main的返回值传递给_exit进行处理。看到这样的启动代码,想必你也就不再惊讶我的串口的初始化代码在哪了。(可以去platform/init.c中找找看)。 下面写点代码进行测试。 测试返回值
int __io_puts(const char *str);是在usart.c文件中实现的函数,可以将一个字符串通过串口发送出去,返回实际发送的个数。sys_itoa可以将一个int型数字转换成字符串,返回的是字符串的地址。这个函数是从Apple open source中复制的。只不过改了个名字而已。详见地址:http://www.opensource.apple.com/source/groff/groff-12/groff/libgroff/itoa.c 。
main的代码:
测试结果截图:
本次相关的代码在exit.zip中。 |
exit.zip
下载401.37 KB, 下载次数: 43
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版
非常不错的经验,谢谢分享
因为之前学习linux,就装了个ubuntu。用着用着就习惯了
行。只不过你需要更改相关的底层实现。比如串口的发送和接受。