首页 > 其他分享 >uboot支持的cortex-M4内核启动流程分析--Apple的学习笔记

uboot支持的cortex-M4内核启动流程分析--Apple的学习笔记

时间:2023-10-27 20:31:44浏览次数:40  
标签:调用 uboot Apple -- stm32 init gd board arm

一,前言

居然看到uboot支持stm32的cortex-M4的内核,所以就编译来看看,直接编译通过了,所以代表着我可以直接在真实的板子上连接jlink单步调试了,先看看上电流程的代码吧~

二,编译

下载了6.0版本以上的arm-none编译即可通过编译。

export PATH=$PATH:/work/tools/gcc-arm-none-eabi-9-2019-q4-major/bin
make ARCH=arm CROSS_COMPILE=arm-none-eabi- distclean
rm -rf ./stm
make ARCH=arm CROSS_COMPILE=arm-none-eabi- O=stm stm32f429-discovery_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-eabi- O=stm

三,分析源码

之前cortexA8的启动代码我也不细看,但是cortexM4内核应该更加容易,内容更加少了,所以先看下启动流程。

1)从reset开始,文件路径arch/arm/cpu/armv7m/start.S

2)进入arch/arm/lib/crt0.S中处理

a. bss段清0

b. 通过配置了CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR,为SYS_INIT_SP_ADDR设置值0x10010000作为sp地址

c. 通过调用common/init/board_init.c中的board_init_f_alloc_reserve函数,预留gd的size为配置值CONFIG_SYS_MALLOC_F_LEN=0x2000,通过调用board_init_f_init_reserve将gd空间中gd size清0

d. 通过调用common/board_f.c中的board_init_f进行gd赋值及init_sequence_f中的函数初始化。接着就是一堆初始化,我全看了下,对如下几项做了笔记记录。

->initf_bootstage,之前没有关注过,原来是可以用来记录boot时间的。

config BOOTSTAGE
	bool "Boot timing and reporting"
	help
	  Enable recording of boot time while booting. To use it, insert
	  calls to bootstage_mark() with a suitable BOOTSTAGE_ID from
	  bootstage.h. Only a single entry is recorded for each ID.

->arch_cpu_init初始化,路径在arch/arm/mach-stm32/soc.c,对于stm32就是配置mpu。

->env_init,主要是要找evn存储介质的driver保存到gd->env_addr。

->serial_init里面进行了串口的初始,且调用了串口设备驱动drivers/serial/serial_stm32.c的_stm32_serial_setbrg来设置波特率。

->display_options开始通过串口打印标题了。

->misc_init_f里面包括了event_notify,这个event_notify蛮有意思的,也是遍历section中的数组,若传入的event和数组中的event名字一样就调用数组中的操作函数进行相关动作。可以理解为event来后需要触发的特别动作,就可以用这种方式。

->dram_init通过调用uclass_get_device来初始化设备,也就是说会调用device_probe函数的。

->setup_dest_addr,看到关键的relocaddr地址是可以通过打印_DEBUG来打印的。

gd->relocaddr = gd->ram_top;
	debug("Ram top: %08llX\n", (unsigned long long)gd->ram_top);

->arch_reserve_mmu是预留一段mmu空间,此时ram_top的地址又会变小了。但是stm32没有mmu,此段调试下看看是否被调用,否则可以删除。

->后面有一系列的reserve_xx,蛮有意思的,都是预留空间,若配置且使用了,那么ram_relocaddr地址会越来越小。

->reserve_uboot有一句gd->start_addr_sp = gd->relocaddr。

->_dram_init_banksize,填充gd表,设置ram大小的。

->setup_bdinfo主要是设置外部sram的。

->display_new_sp通过debug打印sp最终地址。

->reloc_xx,也就是之前有reserve_xx就会赋值到gd_newXX,这样relocate汇编就会把gd_oldXX移动到gd_newXX。

->cyclic_unregister_all,看了下周期调用的只有wdg操作,最后unregister,难道之前register过,搜索了下确实wdt_start的时候有register。

接着汇编crt0.S就开始搬运ram和vector,最后调用board_init_r,此函数里面有init_sequence_r初始化列表,进行遍历初始化,只是此list的最后是run_main_loop,是一个for循环,不会再退出了。

四,qemu仿真看看

查看了下qemu是支持此开发板的,但是串口无信息,我没有用vscode来调试,所以不清楚情况,因为编译主要目的是实际板子调试用的。所以暂时忽略qemu仿真吧~

uboot支持的cortex-M4内核启动流程分析--Apple的学习笔记_uboot

五,小结

看上去和arm的板子的启动流程类似,居然过程中还有relocate,有必要吗?重定向没细看,之后准备直接调试看下效果。但是cortex-M4还弄个uboot有必要吗?估计就是纯娱乐,而且发现2016版本uboot就已经支持cortexM4了,突然想到有关不带mmu的操作系统uclinux是否需要这样的uboot!

标签:调用,uboot,Apple,--,stm32,init,gd,board,arm
From: https://blog.51cto.com/AppleCai/8062555

相关文章

  • 03. TCP的3次握手4次挥手
    一、三次握手  TCP是稳定的传输方式,在接收、发送之前,双发需要建立一个虚拟的通道,这个过程称为3次握手。3次握手的流程如下:客户端调用connect()时发送一个带有标记的数据包,我们把建立连接时的第1次数据叫做SYN,其中由1个数字;服务器接收到这个SYN数据包,提取出数......
  • 学习如何新建java项目
    java的程序的运行机制编译型:全局翻译解释型:实时更新 在idea写下hello,world[破解激活码] IDEA2023.2.3最新激活码,注册码(亲测好用)-异常教程(exception.site) 新建一个文件夹 在文件夹新建一个class  Java语法创建一个新项目(重要)project->Empty......
  • 大语言模型Fine-tuning踩坑经验之谈
    前言 由于ChatGPT和GPT4兴起,如何让人人都用上这种大模型,是目前AI领域最活跃的事情。当下开源的LLM(Largelanguagemodel)非常多,可谓是百模大战。面对诸多开源本地模型,根据自己的需求,选择适合自己的基座模型和参数量很重要。选择完后需要对训练数据进行预处理,往往这一步就难......
  • 前端简介
    1. 前端学习哪些内容1.HTML#网页的骨架、只是负责显示一些内容,但是显示出来的内容不好看,没样式2.CSS#对网页骨架的美化、让网页变得更加的好看而已3.JavaScript#html、css都是不能动的,静态的,js就是让网页能够动起来,变得更加的美观4.bootstrap、jQuery称为是......
  • 巴塞尔问题 - 证明
    邱老师在数学课上留下了一道思考题。以下是题目简述已知:\[\sum_i^{\infty}\frac{1}{i^2}=\frac{\pi^2}{6}\]求解:\[\sum_i^{\infty}\frac{1}{i^2}(2\\not|\quadi)\]经过放缩,可以得到一个很是显然的\(\frac{\pi^2}{8}\)但是这个解太丑陋了,于是我们尝试去证......
  • css 居中
    absolute绝对定位来居中先让元素左上角居中top:50%;left:50%;再根据容器的大小来设置外边距偏移量width:800px;height:500px;margin-left:-400px;margin-top:-250px;拓展:过渡玩法:background-size:cover;background-size:100%100%;......
  • 66. 加一
    1.题目介绍给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位,数组中每个元素只存储单个数字。你可以假设除了整数0之外,这个整数不会以零开头。示例1:输入:digits=[1,2,3]输出:[1,2,4]解释:输入数组表示数字123。示......
  • HTTP与HTTPS的区别
    一、HTTP与HTTPS的区别:HTTP是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS则解决HTTP不安全的缺陷,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。HTTP连接建立相对简单,TCP三次握手之后便可进行HTTP的报文传输。而HTTPS在T......
  • openapi-generator修改默认生成的Model文件名称
    openapi-generator为各种语言都以抽象类的形式进行了默认配置以Typescript为例,其中的抽象类路径为openapi-generator\modules\openapi-generator\src\main\java\org\openapitools\codegen\languages\AbstractTypeScriptClientCodegen.java其中的toTypescriptTypeName方法则对生......
  • 逆向通达信Level-2 续七 (调试WebView)
    通过窗口找WebView,打开DevTool调试 在WebView hack入控制台。那个,我已经打开了DevTool,算了。 通过pad面板找WebView。 ......