接上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调试串口输出对应的系统函数的更多相关文章

  1. 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  2. 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境

    如有转载,请注明出处与本文连接,谢谢! 修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建 ...

  3. [RK3399] 调试串口ttyS2改为普通串口

    CPU:RK3399 系统:Android 7.1 串口需求量大时,会选择使用 spi 转串口,但是数据量大或者波特率较高时,传输会丢包. 调试串口 ttyS2 也可以让出来,供上层使用,下面是将 t ...

  4. 将JZ2440的调试串口换成com2

    众所周知JZ2440 V3很小巧,精致.今天单就JZ2440的串口来讨论一些问题.我们在用串口进行调试的时候,需要用JZ2440自带的一根USB线连接电脑USB口和开发板的USB-com1口.先来看一 ...

  5. 从0移植uboot(五) _实现串口输出

    串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可以将程序运行的情况直接通过串口线输出到屏幕上,对于这种异常重要的功能,uboot原生就提供了支持,但为此我们需要做一些 ...

  6. [日志] spring boot + logback 日志输出配置

    一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...

  7. (转) 从0移植uboot(五) _实现串口输出

    ref : https://www.cnblogs.com/xiaojiang1025/p/6500520.html 串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可 ...

  8. 痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之半主机(Semihosting). 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我 ...

  9. Anjuta 调试无输出 warning: GDB: Failed to set controlling terminal

    调试无输出,起初以为是那个warning的问题,后来才知道这个系统printf直到遇到'\n'换行符才输出,VC6用习惯了没想到还有这样的,网上说这样是节省系统资源. 那个warning暂时还没看到影 ...

随机推荐

  1. formData 对象 与 Content-Type 类型

    FormData FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据.其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用.如 ...

  2. 【原创】大数据基础之Zookeeper(2)源代码解析

    核心枚举 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING; } zookeeper服务器状态:刚启动LOOKING,f ...

  3. 【原创】Linux基础之curl

    http请求过程如下: # curl -v http://www.baidu.com % Total % Received % Xferd Average Speed Time Time Time C ...

  4. 金三银四背后,一个 Android 程序员的面试心得

    回顾一下自己这段时间的经历,九月份的时候,公司通知了裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷.到十二月份,公司开始第二波裁员,我决定主动拿赔偿走人.后续的面试 ...

  5. 【sklearn】数据预处理 sklearn.preprocessing

    数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...

  6. java----SAX解析XML

    XML: 可扩展标记语言 1.充当显示数据 2.储存数据 3.传输数据 SAX: 水电费 基于事假驱动,顺序读写,速度快 不能任意读取节点,灵活性差 解析时,占用内存小 import org.xml. ...

  7. cf1153E 二分思维交互

    恶臭的交互题 /* 一个结论:一个矩形将空间分割成两部分,如果开头结尾都在一个部分内,那么穿过矩形边框的线条数就是偶数,反之就是奇数 通过这个结论来进行判断 先询问999次将两个x坐标确定,方法是询问 ...

  8. 爬虫请求库之selenium模块

    一 安装 #安装:selenium+chromedriver pip3 install selenium 下载chromdriver.exe放到python安装路径的scripts目录中即可,注意最新 ...

  9. c&c++中的宏

    1 c&c++中的宏 do {...} while (0); offsetof & container_of 2 引用 [1] do {...} while (0) 在宏定义中的作用 ...

  10. Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin

    Spark的join与mysql的join类似,mysql的join是将表与表之间连接查询,spark中join是将RDD数据集进行连接,Spark主要有join.leftOuterJoin.righ ...