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暂时还没看到影 ...
随机推荐
- Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'
Information:Gradle tasks [:app:assembleDebug]Error:Execution failed for task ':app:transformResource ...
- find xargs 简单组合使用
简单总结下,留作自己以后拾遗...... 一.find xargs 简单组合 ## mv 小结find ./ -type f -name "*.sh"|xargs mv -t /o ...
- innodb表碎片处理
本次测试环境是 mysql 5.7.23,表空间为每个表单独表空间 mysql> sHOW VARIABLES LIKE 'innodb_file_per_tabl%'; +---------- ...
- mysql收集统计信息
一.手动 执行Analyze table innodb和myisam存储引擎都可以通过执行“Analyze table tablename”来收集表的统计信息,除非执行计划不准确,否则不要轻易执行该 ...
- C# 微信开发-----微信会员卡(三)激活会员卡
在会员领取了会员卡之后需要做 一个跳转性激活,模式请看下图: 在创建会员卡的时候需要配置下这个参数的值: memberActivate.aspx页面代码如下: <%@ Page Language ...
- greenplum加密
--如下为greenplum5.0数据库加解密--加密函数select encrypt('123456','aa','aes');--加解密函数select convert_from(decrypt( ...
- 金蝶K/3 BOS产品培训教案
K/3 BOS产品培训教案 1 K/3 BOS IDE练习案例... 2 1.1新建基础资料... 2 1.1.1新增基础资料交货地点... 2 1.2新建业务单据... 2 1.2.1新建寄 ...
- Web服务器原理
——————————什么是Web服务器 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档.目前最主流的三个Web服务器是Apache Ngin ...
- form组件
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['hobby'].choices ...
- WPF中的逻辑树和可视化树
WPF中的逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素. 为了方便地自定义控件模板,WPF在逻辑树的基础上进一步细化,形成了一个“可视化树(Visual Tree)”,树 ...