15.210控制台故障分析(解决问题的思路)

15.210控制台故障分析(解决问题的思路)

对于串口的输出,210按照前面的操作是下面的乱码。

  1. 第一想到的很可能是波特率的问题,这是串口乱码的一般情况。排除这一点的是前面的putc函数是可以实现的。验证:

如上面,先把主函数里的printf信息给注释掉。加上putc函数。重新编译和加头:

开发板先格式化

再下载:

下载成功之后,却换到NandFlash启动,看看串口有没有输出:

可以看到终端上面有信息的正常输出,说明了putc是可以工作的,也就是波特率没有错。

上面就确保了波特率没有问题,接下来想到的是串口打印函数printf有问题。在printf函数里我们就实现了两个功能:1)格式化输入的信息。2)输出格式化后的信息。

一般想到的是,很可能是在1)格式化输入的信息的时候出错了,导致输出的是乱码。也有可能2)输出格式化后的信息有错。

之所以说输出信息的地方出错的可能性很小,这是因为前面的putc已经正常工作了。接下来就是排除这种情况。

主函数,直接调用printf:

做了上面的修改之后重新编译,烧写到开发板,设置从NandFlash启动:

可以看到仍然是乱码。上面转化已经被注释掉了,可还是乱码。说明在输出的时候就已经有问题了。

解析来就是注释掉for循环,直接输出一个变量:

重新编译,烧写到开发板,NandFlash启动:

当改为变量之后,干脆就没输出了。

说明了输出一个变量都有问题,接下来测试一下输出一个字符:

重新编译,烧写到开发板,NandFlash启动:

换成字符之后又没问题了。

从上面的结果知道,问题出在变量上面。由于上面的变量是已经初始化的,存在于数据段,接下来就是检查数据段的位置和内容是否正确。

数据段的位置是在代码段之后的,打开lds文件即可确定:

可以看到是没有问题的。

接下来是确认数据段的内容里有没有tmp变量。

打开dump,搜索tmp变量:

可以看到,tmp是在elf文件里,也是在数据段的。但是存不存在与gboot.bin文件中呢!?

上面可以看到,定义的内容已经编译进入了.bin文件。

就是数据段的内容也是正确的。

问题是,210里的uboot是需要加上一个头信息的:gboot-210.bin,打开gboot-210.bin之后:

发现加了头信息之后的uboot.bin里的内容变了好多,根本就没有我们定义的信息。

查看两个文件的大小:

上面可以到,gboot-210.bin比gboot.bin小了很多,但是,按道理,由于gboot-210.bin比gboot.bin多了一个头信息,应该是要大一点才对,反而小了。

可以得出的结论了,就是没加头信息的uboot.bin是正常的,加了头信息后,反而不正常,且是数据段的内容减少了。所以问题就出在加头程序了。

打开加头程序后,可以看到:

可以看到,上面BUFSIZE和IMG_SIZE的大小都是16k,然后是不是定义的BUFSIZE和IMG_SIZE太小,然后把后面的内容忽略了。所以改16k设置为32k。再把那些调试信息删掉。重新编译,烧写,NandFlash启动:

现在问题好像有点更严重了,啥信息都没有,原来是有乱码输出的。开发板还一直在叫。

为什么单单改了一下长度:

开发板会在一直叫呢?

我们来回顾一下前面学过的东西:

如上图,在210的uboot启动的过程中,首先是先运行IROM里的BL0里的程序。BL0程序会把BL1里的程序往SRAM里复制。BL1的最大值是16k。复制进来之后,BL0会做相应的操作:

其中的一个操作是:

是去检查Checksum。

具体的过程是这样的:在BL0去把BL1里的16k程序复制到SRAM里的时候,回去统计BL1里1的个数。然后在我们的BL1里,4字节的头:

可以看到也有CheckSum,就是BL1里1的个数。当上面的两者不一致的时候,BL0就认为传递过来的映象有问题,就会产生叫声。

问题是出在:

加头程序里,有一个for循环,就是统计加头文件里1的个数的。本来BL1的最大值是16k的,这里的IMG_SING已经被赋值为32k,所以统一1的个数不只是BL0里的1,也有BL2里的1,导致与BL0统计的1的个数不一样,所以会啸叫。这里把它改回16k

改了之后重新编译,重新加头信息:

重新下载,设置NandFlash启动:

可以看到控制台已经正常输出了。问题终于解决了。

上面就是一个解决嵌入式异常的流程,要善于用排除法,排除干扰因素等。

时间: 2024-08-04 14:56:48

15.210控制台故障分析(解决问题的思路)的相关文章

解决问题的思路

今天早上,我来公司打开电脑,发现注册表打不开了,exe文件也打不开了,系统提示:windows找不到路径.我直接急了,想到我昨天把注册表修改了,没有改回去.于是第一个反应是我改注册表出问题了.赶紧在网上各种查资料,如何恢复注册表.甚至到万不得已的情况下需要重新装系统.后来在网上看到,有人怀疑是不是电脑中毒了,用卡巴斯基扫描,没有扫到什么.于是我就拿360扫描,也没有扫到什么,后来打开360系统急救箱,一边扫描,同时打开360,让在线重装系统.就在这时候,急救箱扫描到了一个重要信息: 报告说这个文

解决问题的思路是怎样的?

四个观点:第一个观点,掌握更大层次的知识结构,建立系统思想,了解局部,必须了解全局.第二个观点,建立不同知识的横向和纵向联系,第三个观点,决策和行动的时空观.第四个观点,思考和实践的统一. 第二个观点,就是世界的事物就是具有联系的,知识是反映客观世界的,所以知识点之间是联系的,比如营销学,营销学的纵向联系的,它有上下级学科,比如下级有经济学和行为科学,下级学科是营销策划,横向联系是指平级的学科,如企业管理中的几个智能之间的平级,如人力资源.第三个观点,时空观,比如足球比赛策略的时空观,我写的论文

从别人解决问题的思路中得到进步

今天遇到一个需要匹配正则表达式的一段代码,用了多行匹配的正则表达式,可是没效果.求教群里的大牛后大牛给出一个正则表达式,说我的正则表达式是可以的,在后面加个模式定界符就可以了,于是在后面加了/i,表示不区分大小写字母的搜索,于是问题解决了.大牛说他都是一边做一边看手册.一个人的技术不一定能顾及都技术的每一个细节,这时候手册的作用就出来了,难点易混淆的点里面都有代码说明,能很好地解决当前遇到的问题.

210中断故障分析

1.把中断注销掉,采用轮询的方式,来使用按键,看它能否工作. 采用读取按键的状态来轮询:按键的状态有对应I/O口的数据寄存器保存,可以读取该寄存器来判断按下与否. 如果还出问题,反汇编之:arm-linux-objcump -D -S gboot.elf >dump 看它用到了fp寄存器,可知用到了栈,那么去检查.如果没问题,再去看内存的初始化,与uboot进行对照,参考错误会出现在哪儿.再恢复为中断的形式去测试.

在项目中解决问题的思路

修改好代码,添加数据时报错. 1. 在添加第一条的时候成功 2. 增加了代码,再添加第二段代码失败. 3. 找原因,新代码没影响以前代码. 4. 错在哪,F12看详情. 5. 根据报错原因,违反完整性约束.看着像数据库的事. 6. 去数据库看到第一条时id为0,就知道是没设置自增主键. 总结:花费了这么多条.其实可以在第三步就去找错误信息,这样便会省去了一部分时间.

【解决问题.思路篇】StringIndexOutOfBoundsException:String index out of range: -1

看到题目,就应该能想到应该是字符串过长引起的问题.下面咱们分析一下. 报错: 严重: Servlet.service()for servlet jsp threw exception java.lang.StringIndexOutOfBoundsException:String index out of range: -1 根据代码跟踪,发现是首页数据加载完之后就会报错,所以继续跟踪,发现了问题. 当我们输入了访问地址:localhost:8080页面以及数据加载完就会报错,抛异常.但是不影响

数据竞赛思路分享:机场客流量的时空分布预测

历时两个月的比赛终于结束了,最终以第32名的成绩告终,在此和大家分享下解决问题的思路. 从初赛到复赛,有走过弯路,也有突然灵光一现的时刻.一路走来,对数据各种把玩,分析了各种可能的情况,尽可能得挖掘数据中潜在的信息来构建更为准确的模型. 本文无法涵盖所有的分析历程,但是会涉及解决问题的主要思路以及部分代码,详细的代码见Github页面 竞赛详细信息参见比赛官方网站 1. 问题描述 机场拥有巨大的旅客吞吐量,与巨大的人员流动相对应的则是巨大的服务压力.安防.安检.突发事件应急.值机.行李追踪等机场

java程序--控制台五子棋

控制台五子棋,具体思路见代码注释. 代码如下: <span style="font-size:18px;">package test; import java.io.IOException; import java.util.Scanner; //控制台简单五子棋 public class GoBang { //二维数组作为棋盘 private static char[][] board=new char[16][16]; //已下棋子数目 private static i

ECS云主机SSH连接提示&ldquo;Connection reset by peer&rdquo;的解决办法和解决思路

三周前刚从上家公司换到新的公司,这家公司与上家公司相比对阿里云的云计算环境更加的依赖,使用的ECS实例和其他服务如SLB.RDS.OSS等更多了一个数量级.这篇文章的背景就是为了解决阿里云ECS云主机SSH连接的一个问题,从故障发现到故障排除到最后反思的一个详细过程.文章比较长,图片众多,建议有时间仔细阅读,没时间就阅读文末的"总结和反思"部分即可. 故障发现: 2017-05-23 下午17:00点前同事报告称GitLab所在的服务器访问出现异常.经查发现在公司内无法正常通过SSH连