你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Ubuntu下开发STM32---9.再谈exit

[复制链接]
qianfan 发布时间:2015-10-31 20:28
本帖最后由 QianFan 于 2015-10-31 20:31 编辑
5 |) Q% [* i* a# @6 I, D
$ }* _/ D) G! Z    在笔记6---使用串口Part2(https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html)中,我们简单的介绍了一下exit。在windows或者linux操作系统中,main的返回值是有意义的,类型为int。这个返回值实际上是返回给操作系统的。0表示程序正常终止,其他非零表示程序异常终止。! r8 O8 Q8 Q" Z  w" M
    在使用ST固件库提供的启动文件和syscalls.c文件之后,如果程序中主动调用exit,能跳转到_exit系统调用中。如果main中使用return,并不能跳到_exit系统调用中。这次我们通过更改启动文件,来将main的return传递给_exit.
5 H! _, A3 e8 Z" _0 F4 o3 q9 u' e9 p
; a2 ~' u- s# P& k4 X函数参数和返回值的传递* ~4 S* ~2 W# h7 q( u
根据ARM C/C++过程调用标准,如果函数的参数少于或者等于4个,那么第一个参数使用R0传递,第二个使用R1,依次类推。如果多于4个参数,那么前四个使用R0-R3传递,后面的参数使用栈传递。因为函数最多只能有1个返回值,返回值仅使用R0进行传递。6 l, @' m7 \3 d5 s2 ^: _" \
& `/ S$ X2 |' t! O; M5 ]- ^
考虑这么一种情况,当main函数执行完之后,返回值保存在R0中。而void _exit(int status)期望1个参数,这个参数正好是main的返回值,因此在汇编中可以这样调用:
' K* q( `( V( a- [1 P8 h" n 2015-10-31 20:18:27屏幕截图.png 1 r, _- m' S3 d( h( {  z( W4 }
这样就巧妙的将main的返回值传递给_exit进行处理。看到这样的启动代码,想必你也就不再惊讶我的串口的初始化代码在哪了。(可以去platform/init.c中找找看)。
+ q+ Y5 K. q! D  k下面写点代码进行测试。  W( y1 F1 v8 H0 H* a: b
, r9 I1 q- T- F; K0 n  n6 [% J# Y
测试返回值
! M' h7 l' q3 m+ X4 u, ^9 K  T
9 I0 b: t2 X- [, y0 l 2015-10-31 20:20:13屏幕截图.png . o0 N( h0 X6 X# h1 {
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 。
9 V( B: c& m9 {0 T9 I 2015-10-31 20:23:47屏幕截图.png
+ s' W) |0 b+ U; `2 W6 W/ f# `* i) x- J/ k3 X$ M$ Z
main的代码:
! ^2 s1 i) c3 { 2015-10-31 20:26:19屏幕截图.png
9 h& o) N7 l+ H. v8 I  a
5 B5 ]* O9 F0 ^- w% E% e) \6 U测试结果截图:
/ b4 d3 W' A' ~2 V9 T- n 2015-10-31 20:28:01屏幕截图.png ) d0 F" T: T; [; U
3 o6 x6 R. N0 @
9 O8 E* a. q" a4 Q5 X
本次相关的代码在exit.zip中。- G9 G2 `' k3 B1 o
: ?" ^* G" Y* _1 B; W. d2 A

exit.zip

下载

401.37 KB, 下载次数: 45

赞 收藏 3 评论9 发布时间:2015-10-31 20:28

举报

9个回答
aabird 回答时间:2015-11-1 07:39:36
完全不懂,因为我没用过。
wakojosin 回答时间:2015-11-1 07:53:36
非常不错的经验,谢谢分享
wuweijie 回答时间:2015-11-1 10:30:47
我想问下为什么要在Ubuntu下开发32呢?大神
肽宰1 回答时间:2015-11-1 10:56:35
# q* f; T! f; @# z# d# _6 I2 e  l
非常不错的经验,谢谢分享
qianfan 回答时间:2015-11-1 12:50:57
wuweijie 发表于 2015-11-1 10:30: s0 I' U7 B$ {, n! U
我想问下为什么要在Ubuntu下开发32呢?大神

+ d$ R* L4 Y  C因为之前学习linux,就装了个ubuntu。用着用着就习惯了
wuweijie 回答时间:2015-11-1 14:29:40
好吧,高人
me浩 回答时间:2015-11-2 08:57:33
666666666666666666666666
pythonworld 回答时间:2015-11-3 21:38:10
用HAL库能行吗?
qianfan 回答时间:2015-11-4 13:49:09
pythonworld 发表于 2015-11-3 21:389 R- w( C+ x, b# n; H- i* f
用HAL库能行吗?

. a+ D, B8 \9 t+ s$ D* o6 V行。只不过你需要更改相关的底层实现。比如串口的发送和接受。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版