使用如下patch,关闭串口打印,可以至少节省几百ms的时间。
1 | diff --git a/arch/arm64/configs/xxx_defconfig b/arch/arm64/configs/xxx_defconfig |
thinking all the time
使用如下patch,关闭串口打印,可以至少节省几百ms的时间。
1 | diff --git a/arch/arm64/configs/xxx_defconfig b/arch/arm64/configs/xxx_defconfig |
需求:
使用SourceInsight查看源代码。要么将整个kernel的源代码添加进去,要么是需要哪个文件就添加哪个。
有没有什么办法可以将Kernel目录中编译到的.c
文件统一生成一个文件,然后导入到SourceInsight去加载对应的.c文件。
我们注意到,编译kernel,如果编译了.c
文件,那么在与之对应的目录下生成.o
或.mod.o
文件。因此,可以递归索引查找kernel目录下所有的文件,将.o
过滤出来,与之对应的.c文件就是我们要查找的文件,因此有了下面的python代码。
参照下面的patch:
1 | diff --git a/arch/arm/configs/xxx_defconfig b/arch/arm/configs/xxx_defconfig |
在项目A(纯linux系统),挂载/system
分区为rw
的时候,使用如下命令,该命令可正常挂载。
1 | # mount -o remount,rw /system |
但是,在另外一个项目B上(Android系统),想要使用该命令去挂载,发现挂载失败,输出的log如下:
mount: ‘/dev/block/mmcblk0p1’->’/system’: Device or resource busy
上网搜了一下,发现是mount
用法错了,修改之后如下:
1 | # mount -o rw,remount /system |
具体这两者的差异是由于项目A和项目B使用的命令工具不一样,前者使用busybox
,后者使用toybox
。具体两者关于mount
命令的用法,还在继续查找。
https://landley.net/toybox/help.html
https://busybox.net/downloads/BusyBox.html
在kernel中,有一个函数可以用来产生panic,就是panic()
函数。
本文主要讲述如何模拟产生panic以及输出堆栈信息。
在嵌入式开发中,出现freeze的问题很让人头疼,就是那种不发生kernel panic,什么log不输出,串口终端死掉,无法输入输出。这时候,肯定是哪里出现了死锁或者死循环,长时间占用CPU资源,导致其他进程无法运行。
比如说,在底层的USB Host控制器驱动中,设置完某个控制寄存器,然后用while来检查状态寄存器的某一位是否满足条件。如果该控制器本身出现了问题,那么,将会一直卡在while中无法退出,此时就会出现freeze。
还有,我们有时候会看到watchdog/0
进程的CPU占用率非常高,此时也有可能是哪个循环语句占用太长的时间导致的。
以下的内容参照:http://blog.csdn.net/luckyapple1028/article/details/51932414
这篇文章帮助很大,在此表示感谢。
本文主要讲述taglist
+ vim
+ ctags
+ cscope
这几个工具的安装以及结合起来使用。
本文将介绍__func__
和__LINE__
和格式化打印%p
、%pf
、%pF
的用法。
最近在看Linux USB Composite Framework
的内容,经常看到函数指针跳转来跳转去。比如说会看到某个代码执行结构体中的.bind
函数指针,但又不知道到底是谁在调用它。
此时,就可以用dump_stack()
这个函数来追踪函数调用关系。当然,还是要自己尝试学习理解这个框架结构,不然纯粹的知道函数调用关系意义不大。另外,dump_stack()
可用来定位Kernel Panic和Oop的问题,配合objdump
和addr2line
可以定位到哪一行的哪句代码出现问题。
需求:
在开发过程中,我们经常需要读取CPU中某个寄存器的地址,比如说读取某一个GPIO的输出状态。如读取GPIO1_IO01
的值(以i.MX6为例),那么就是要读取寄存器0x0209c000
中bit1的值。
ioremap_nocache()
将该地址映射出来,然后去读取。mmap()
去读取。下面我们将使用mmap()
函数读取该寄存器的值,并写一个专门的应用程序regctl
来读写任意寄存器的值。