RISC-V MCU中文社区

GD32VF103芯片启动时_init()函数的调用在哪里

发表于 GD32VF103 MCU 2021-03-03 23:11:15
2
3979
1

我发现芯片启动时并没有在源码中调用_init函数,却在反汇编文件中发现它被调用了,这是如何实现的呢。下面是我的分析过程:

1、在start.S文件中有这样的语句

	/* Call global constructors */
	la a0, __libc_fini_array
	call atexit
	call __libc_init_array

2、在lds文件中并没有这两个标签的链接地址

3、在_init()函数实现的地方并没有为它打上链接到这个段(__libc_fini_array)的标签。

void _init()
{
	SystemInit();
	//ECLIC init
	eclic_init(ECLIC_NUM_INTERRUPTS);
	eclic_mode_enable();
	disable_mcycle_minstret();
}

4、在生成的反汇编文件中找到了这个标签并在这段代码中调用了_init函数

0800233c <__libc_init_array>:
 800233c:	ff010113          	addi	sp,sp,-16
 .....
 8002350:	6c440793          	addi	a5,s0,1732 # 80026c4 <__init_array_start>
 8002354:	6c490913          	addi	s2,s2,1732 # 80026c4 <__init_array_start>
 ....
 8002368:	02090063          	beqz	s2,8002388 <__libc_init_array+0x4c>
 800236c:	6c440413          	addi	s0,s0,1732
 8002370:	00000493          	li	s1,0
 ....
 8002384:	fe9918e3          	bne	s2,s1,8002374 <__libc_init_array+0x38>
 8002388:	ad5fe0ef          	jal	ra,8000e5c <_init>
 800238c:	08002437          	lui	s0,0x8002
 8002390:	08002937          	lui	s2,0x8002
 ...
 80023a4:	02090063          	beqz	s2,80023c4 <__libc_init_array+0x88>
 80023a8:	6c440413          	addi	s0,s0,1732
 ...
 80023d8:	00008067          	ret

我想知道实际上_init函数是如何实现调用的,谢谢

喜欢1
用户评论 (2)
  • 勋

    2021-03-06 23:19:29 1#

    谢谢你的回答,我用的是这个官方网站下的例程源码,里面用的不是startup_gd32vf103.S(貌似用官方IDE(NucleiStudio)才会用这个汇编文件启动)这个启动文件,而是start.S,在这个启动文件中并没有调用_premain_init这个C函数,而是在_init函数中初始芯片时钟和ECLIC等。

    我在一篇文章中找到了一些信息,对于_init函数调用理解了一点,我拿出关键的信息,说说我的疑惑(https://www.jianshu.com/p/2776d5f14cd7

        _libc_fini_array、atexit和__libc_init_array函数都是Newlib C运行库的特殊库函数,而在__libc_init_array调用了_init函数,是不是因为__libc_init_array源码不可见且调用_init函数导致源码可读性差,故才更改在_premain_init进行初始化?


  • 领主文

    2021-03-05 09:31:01 领主文 2#

    startup_gd32vf103.S汇编文件中有call _premain_init命令,调用的是_premain_init这个C函数,函数实现的是初始化的效果。所以初始化不是在_init()里面的。

勋

实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板