搜索
bottom↓
回复: 5

请教下 STM32 startup.s 中调用 __libc_init_array 的具体作用

[复制链接]

出0入0汤圆

发表于 2021-2-26 12:06:13 | 显示全部楼层 |阅读模式
最近在将 Arduino 框架移植到 STM32F105,写程序时候发现USB外设初始化的时候,会卡死在 delay 函数里面,又又又各种调试后发现 SysTick 中断从来没有被调用过,最后怀疑是 HAL_Init 没有成功。多次尝试之后,发现在对应板子的 startup.s 中添加下面标记出来的一行指令,然后一切都正常了。

  1. /* Call the clock system intitialization function.*/
  2.      bl  SystemInit
  3. /* Call static constructors */
  4.      bl __libc_init_array   /* 就是这句 */
  5. /* Call the application's entry point.*/
  6.    bl main
  7.    bx lr
复制代码


虽然bug解决了,但是还是没有太理解调用这句指令的具体含义是什么,比如我正在用的 ST 官方提供的 Arduino 框架(下面的链接), 这句指令最终会导致 main.cpp 中的 premain 函数被调用,然后所有功能就变得一切正常了。但具体是怎么实现的呢?

https://github.com/stm32duino/Ar ... es/arduino/main.cpp

或者说,抛开 Arduino 框架不表,在正常环境比如使用 CubeMX 生成的固件中,__libc_init_array 这个函数究竟做了什么事情呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出35入0汤圆

发表于 2021-2-26 12:16:16 | 显示全部楼层
可以全局搜索到__libc_init_array 的代码吗?

出0入8汤圆

发表于 2021-2-26 12:33:16 | 显示全部楼层
因为你用了C++代码,所以需要__libc_init_array 来初始化一些东西
在C++中,全局变量和静态变量的构造函数需要在main函数执行前执行
这些构造函数会放在init_array表中,__libc_init_array函数有调用这些函数的代码

至于premain,因为前面有个constructor的属性,所以也被链接进构造函数表中了,可以通过__libc_init_array来调用

下面是__libc_init_array函数的一些实现,不同的编译器有不同实现方式
https://sourceware.org/git/gitwe ... misc/init.c;hb=HEAD
http://static.grumpycoder.net/pi ... fini_8c_source.html

出100入101汤圆

发表于 2021-2-26 12:38:03 来自手机 | 显示全部楼层
3楼专业

出105入79汤圆

发表于 2021-2-26 16:03:56 | 显示全部楼层
是 libc 库内置的函数, 负责一些内存的初始化

出0入0汤圆

 楼主| 发表于 2021-3-2 13:53:36 | 显示全部楼层
canspider 发表于 2021-2-26 12:33
因为你用了C++代码,所以需要__libc_init_array 来初始化一些东西
在C++中,全局变量和静态变量的构造函数 ...

感谢,原来constructor属性就是它在初始化的时候被调用的关键,我之前只是隐约能感觉到 __libc_init_array 会调用一个函数指针列表做初始化,原来加个 constructor 就可以让一个函数被加到列表里去。学习了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 18:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表