u-boot调试串口输出对应的系统函数
接上Debug串口,启动机器,u-boot哗啦啦地打印一行行的字符。刚接触u-boot的时候,对机器后台做了什么,几乎一无所知。
如果要很有信心地定制出一个简单并且可靠的系统,或者快速完成一项新的任务,那么,机器后台运行的内容知道的越多越好。
比如,曾经遇到过这样的问题:在全局区定义一个变量int a,在board_early_init_f函数中对这个变量进行赋值,编译没有问题,系统却挂掉了。
为什么?
全局区定义的未初始化的变量,在bss段。在board_early_init_f函数函数执行阶段,完整的c环境没有建立起来。board_early_init_f在board_init_f函数中被调用,直到board_init_f函数的末尾,准备运行board_init_r之前,u-boot对代码作了一次relocate, 这个时候才分配了bss段。bss段的地址指向DDR内存。
在SPL阶段的board_init_f中,board_early_init_f运行在DDR内存控制器初始化之前。所以,当u-boot在DDR内存还不能工作的时候,去访问DDR内存,这就难怪系统会挂掉了。
修改变量的定义为int a=0;系统就不会挂掉了。已初始化的变量在刚开始的时候被载入到静态内存当中,访问当然没有问题。
从这个例子可以看到,了解机器代码的运行情况很重要。
u-boot在汇编代码中简单地初始化CPU、MMU、Cache、中断、状态寄存器之后,转到C代码运行,执行board_init_f。board_init_f执行一个初始化函数集。然后转到board_init_r执行。board_init_r也执行一个初始化函数集,然后转到main_loop函数。main_loop函数或者在bootdelay结束后进行系统引导,或者在用户按下任意按键之后进入一个循环,在循环中读取控制台输入,执行命令,这就是我们看到的u-boot命令行界面。
board_init_f -> display_options:
U-Boot ...
board_init_f -> print_cpuinfo:
CPU: ...
Reset cause: ...
board_init_f -> init_func_i2c:
I2C: ready
board_init_f -> announce_dram_init ... show_dram_config:
DRAM: ...
board_init_r -> initr_mmc:
MMC: ...
board_init_r -> initr_env -> env_relocate -> env_relocate_spec -> env_import -> set_default_env:
*** Warning - bad CRC, using default environment
board_init_r -> console_init_r -> stdio_print_current_devices:
In: serial
Out: serial
Err: serial
在autoboot中run_command(bootcmd)。bootcmd是一个环境变量字符串,从此时起u-boot以运行脚本的方式引导系统启动Linux.
bootz:
Starting kernel ...
如果能在板级代码中按执行顺序放置板级代码的各个函数,并且表明函数的调用路径,那么,看起来乱糟糟的板级代码,就有条理很多,修改和调试也方便很多。
u-boot调试串口输出对应的系统函数的更多相关文章
- 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境
如有转载,请注明出处与本文连接,谢谢! 修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建 ...
- [RK3399] 调试串口ttyS2改为普通串口
CPU:RK3399 系统:Android 7.1 串口需求量大时,会选择使用 spi 转串口,但是数据量大或者波特率较高时,传输会丢包. 调试串口 ttyS2 也可以让出来,供上层使用,下面是将 t ...
- 将JZ2440的调试串口换成com2
众所周知JZ2440 V3很小巧,精致.今天单就JZ2440的串口来讨论一些问题.我们在用串口进行调试的时候,需要用JZ2440自带的一根USB线连接电脑USB口和开发板的USB-com1口.先来看一 ...
- 从0移植uboot(五) _实现串口输出
串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可以将程序运行的情况直接通过串口线输出到屏幕上,对于这种异常重要的功能,uboot原生就提供了支持,但为此我们需要做一些 ...
- [日志] spring boot + logback 日志输出配置
一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...
- (转) 从0移植uboot(五) _实现串口输出
ref : https://www.cnblogs.com/xiaojiang1025/p/6500520.html 串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可 ...
- 痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之半主机(Semihosting). 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我 ...
- Anjuta 调试无输出 warning: GDB: Failed to set controlling terminal
调试无输出,起初以为是那个warning的问题,后来才知道这个系统printf直到遇到'\n'换行符才输出,VC6用习惯了没想到还有这样的,网上说这样是节省系统资源. 那个warning暂时还没看到影 ...
随机推荐
- formData 对象 与 Content-Type 类型
FormData FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据.其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用.如 ...
- 【原创】大数据基础之Zookeeper(2)源代码解析
核心枚举 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING; } zookeeper服务器状态:刚启动LOOKING,f ...
- 【原创】Linux基础之curl
http请求过程如下: # curl -v http://www.baidu.com % Total % Received % Xferd Average Speed Time Time Time C ...
- 金三银四背后,一个 Android 程序员的面试心得
回顾一下自己这段时间的经历,九月份的时候,公司通知了裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷.到十二月份,公司开始第二波裁员,我决定主动拿赔偿走人.后续的面试 ...
- 【sklearn】数据预处理 sklearn.preprocessing
数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...
- java----SAX解析XML
XML: 可扩展标记语言 1.充当显示数据 2.储存数据 3.传输数据 SAX: 水电费 基于事假驱动,顺序读写,速度快 不能任意读取节点,灵活性差 解析时,占用内存小 import org.xml. ...
- cf1153E 二分思维交互
恶臭的交互题 /* 一个结论:一个矩形将空间分割成两部分,如果开头结尾都在一个部分内,那么穿过矩形边框的线条数就是偶数,反之就是奇数 通过这个结论来进行判断 先询问999次将两个x坐标确定,方法是询问 ...
- 爬虫请求库之selenium模块
一 安装 #安装:selenium+chromedriver pip3 install selenium 下载chromdriver.exe放到python安装路径的scripts目录中即可,注意最新 ...
- c&c++中的宏
1 c&c++中的宏 do {...} while (0); offsetof & container_of 2 引用 [1] do {...} while (0) 在宏定义中的作用 ...
- Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin
Spark的join与mysql的join类似,mysql的join是将表与表之间连接查询,spark中join是将RDD数据集进行连接,Spark主要有join.leftOuterJoin.righ ...