12 2017 档案

摘要:本节总结: uboot启动流程如下: 1)设置CPU为管理模式 2)关看门狗 3)关中断 4)设置时钟频率 5)关mmu,初始化各个bank 6)进入board_init_f()函数 (初始化定时器,GPIO,串口等,划分内存区域) 7)重定位 复制uboot,然后修改SDRAM上的uboot链接地 阅读全文
posted @ 2017-12-28 16:29 诺谦 阅读(50188) 评论(9) 推荐(11)
摘要:当产品要发布之前,都会进行反复的测试输入,比如:测试按键,遥控,触摸等等. 当出现bug时,就还需要不停地找规律,修改程序,直到修复成功,会显的非常麻烦 答: 可以通过之前在35.Linux-分析并制作环形缓冲区里学的,使用myprintf()保存到环形缓冲区. 当出错时,直接可以通过缓冲区里的数据 阅读全文
posted @ 2017-12-22 15:40 诺谦 阅读(1185) 评论(3) 推荐(2)
摘要:1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(Software Interrupt)指令,从而产生软件中断,swi指令如下所示: 2)然后CPU会跳到异常 阅读全文
posted @ 2017-12-20 18:35 诺谦 阅读(2676) 评论(1) 推荐(4)
摘要:1.在之前第36章里,我们学习了通过驱动的oops定位错误代码行 第36章的oops代码如下所示: 1.1那为什么在上一章,我们用错误的应用程序,却没有打印oops,如下图所示: 接下来,我们便来配置内核,从而打印应用程序的oops 2.首先来搜索oops里的:Unable to handle ke 阅读全文
posted @ 2017-12-15 23:14 诺谦 阅读(3352) 评论(0) 推荐(1)
摘要:1.gdb和gdbserver调试原理 通过linux虚拟机里的gdb,来向开发板里的gdbserver发送命令,比如设置断点,运行setp等,然后开发板上的gdbserver收到命令后,便会执行应用程序做相应的动作,来实现调试的功能 和之前学的裸板GDB调试 一样,只不过之前学的是在win下的,本 阅读全文
posted @ 2017-12-13 18:07 诺谦 阅读(3338) 评论(0) 推荐(2)
摘要:1.strace简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。通过strace可以知道应用程序打开了哪些文件,以及读写了什么内容,包括消耗的时间以及返回值等 2.安装strace命令 首先需要以下两个文件: strace-4.5.15.tar.bz2 strace-fix-arm- 阅读全文
posted @ 2017-12-13 17:31 诺谦 阅读(1974) 评论(0) 推荐(0)
摘要:当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的? 答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次,所以当CPU一直在某个进程中时,我们便在中断函数中打印该进程的信息 1.先来回忆下 在之前的第5章内核中断运行过程:http://www. 阅读全文
posted @ 2017-12-11 18:16 诺谦 阅读(1806) 评论(0) 推荐(0)
摘要:上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的 本章便通过栈信息来分析函数调用过程 1.上章的oops栈信息如下图所示: 9fe0: 代表最初的栈顶SP寄存器位置 9e80:代表函数出错的 阅读全文
posted @ 2017-12-09 16:53 诺谦 阅读(3296) 评论(0) 推荐(2)
摘要:1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示: 1.2然后编译装载26th_segmentfault并执行测试程序后,内核便打印了oops出来,如下图所示 阅读全文
posted @ 2017-12-08 18:49 诺谦 阅读(6071) 评论(0) 推荐(2)
摘要:在上章34.Linux-printk分析、使用printk调试驱动里讲述了: printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[] 1.环形缓冲区log_buf[]又是存在内核的哪个文件呢? 位于/proc/kmsg里,所以除了dme 阅读全文
posted @ 2017-12-07 18:38 诺谦 阅读(7598) 评论(1) 推荐(2)
摘要:本节学习目的 1)分析printk()函数 2)使用printk()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表示printk()输出在开发板的LCD屏上 当uboot的命令行里的“console=ttySA0, 阅读全文
posted @ 2017-12-06 15:56 诺谦 阅读(6489) 评论(2) 推荐(2)
摘要:在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM、nandflash的控制时序等都还没初始化,所以我们就只能使用前0~4095地址,在前4k地址里来初始化SDRAM,nandflash,初始化完成后,才能将nandflas 阅读全文
posted @ 2017-12-01 11:35 诺谦 阅读(4410) 评论(0) 推荐(3)