再低级的错误,也是错误,是因为有一些细节没有注意到,高手往往高在细节之处。共勉之。
一、裸机移植标准输入输出函数(stdio)
跟着教学视频进行移植,下载调试发现串口调试助手没有任何输出。经过一番折腾发现,是printf的传参出了问题。
错误:printf('A');
正确:printf("A");
这个问题应该很好发现,但在Linux下用arm-2009q3进行编译,那时还不太习惯,完全没留意去看警告和报错。导致这么简单的一个错误,却是找了很久才发现。即使不是报错,警告也不应该忽视。
二、裸机SD卡重定位失败,无法跳转到BL2
程序编译下载运行后,通过添加LED点亮的代码,发现程序卡在了长跳转BL2的地方,如下截图:
在开发板上只看到点亮了一个LED灯,即程序死在了第33行的代码中。
解决办法:
(1)之前在linux下并没有成功写入bin文件,后来重启linux系统后就好了。此时应该如下图,可以看到/dev/sdb和/dev/sdb1:
(2)问题的根源是,write2sd的时候,第二个镜像烧录错了,烧录成了SD卡启动使用的镜像BL2.bin,应该是烧录uart.bin才对。
两种改法:
A、把下图中的BL2.bin改成uart.bin:
B、不改write2sd,把BL2的Makefile改为如下:
三、自写的shell程序无法正常回显
在调试shell程序的时候,发现串口助手没办法正常回显,经排查,发现是uart_getchar这个底层函数有bug。下图为正确的代码。
原本错误的代码为:
return (rURXH0 &0x0f);
四、刷机后卡在开机画面处,无法进入系统。
试过android4.04、Android2.3、linuxqt等系统都不行。初步怀疑是镜像的问题。后面也不知道为什么突然就把linuxQT刷好了。
当时的步骤如下:
A、 向SD卡中烧录QT的uboot。
B、 改回默认uboot的环境变量。重启uboot。
C、 Fdisk –c 0 进行分区,进入fastboot。
D、 依次烧录三个镜像。
E、 Fastboot reboot
根据后面的朱老师所讲,应该是不同系统之间环境变量的问题(传参问题),或者说是uboot 的问题。下次遇到这样的问题再深入研究一下。