自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 信号量

信号量(semaphore)是用于保护临界区的一种常用方法。只有得到信号量的进程才能执行临界区代码,而没有得到信号量的进程进入休眠等待状态。1 定义信号量struct semaphore sem;include/linux/semaphore.hstruct semaphore{ spinlock_t lock; unsign

2013-09-04 20:41:14 4349

原创 内核链表分析

借助上一篇文章container_of(ptr, type, member) 的实现,讨论分析链表在内核的实现。我们用以下的结构体来描述一个学生struct student { char *name; int age;}用链表来存储多个学生,则可以在结构体加上struct student *next 指向下一个学生struct student { char *

2013-09-04 19:45:30 1248

原创 内核container_of(ptr,type,member) 解析

container_of(ptr,type,member) 用于在已知结构体里面成员member和该成员指针ptr(就是地址)和结构体类型type, 返回该成员所在的结构体的指针(就是地址), 例如已知struct student a { char *name; int age;}int *page = &age;container_of(page, struct stu

2013-09-04 16:35:16 4427

原创 内核定时器

内核定时器可以实现定时执行某个事务,一个典型的应用就是使用内核定时器实现轮训操作,因为定时器到时后可以在定时器函数里面重新定时启用该定时器,达到循环启用定时器的作用,这样可以实现定时轮训硬件struct timer_list { /* * All fields that change during normal runtime grouped to the

2013-09-04 15:57:29 1181

原创 linux内核时间操作

linux内核是通过定时器中断来跟踪时间流;使用"HZ"宏表示1秒的时钟中断次数;并使用"jiffies"及"jiffies_64"变量来记录时钟中断次数,在系统引导时计数器初始化为0。  示例4_1#include linux/jiffies.h>unsigned long stamp;stamp = jiffies + HZ; /* 之后1秒 */while

2013-09-04 15:26:21 896

原创 内核延迟操作

内核延迟操作内核延迟分为长延迟和段延迟, 长延时一般以jiffies为单位, 短延时则以jiffy为单位, 对于不同延迟应该选用不同的实现方法。长延迟一般通过硬件时钟滴答来实现,  对于长延迟,可以使用等待队列机制#include long wait_event_timeout(wait_queue_head_t, condition, long timeout); // 休眠时不可中断

2013-09-04 15:24:32 888

原创 内核线程

linux 内核线程拥有独立堆栈和优先级运行机制,内核线程跟用户空间进程一样用结构体struct task_struct来描述,所以从运行机制看,实际上就是一个进程,并且共享父进程资源,但是没有自己独立的进程空间,而且还不能跟用户空间交互,即current->mm 为空。创建内核线程o 利用kernel_thread() 创建使用该接口创建的线程,必须在该线程中调用daemonize(

2013-09-04 14:36:48 1506

原创 内核通知链分析

内核通知链为内核子系统之间的事件通知机制,内核中用链表来维护通知链。应用实例:事件通知者:o 定义通知链表头static BLOCKING_NOTIFIER_HEAD(pm_chain_head);o 定义通知链注册函数,被通知者通过这个函数注册该通知链,通过pm_chain_head 链表头跟通知者关联起来int register_pm_notifier(struct notifie

2013-09-04 11:17:36 1632

原创 利用hardware watchdog debug kernel bug

本文根据watchdog特性讨论 内核开发过程当中watchdog更多的应用场景s3c2410硬件Watchdog通过利用内部定时器定时复位,通常用于检查调试cpu是否hung 或者关中断情况下while死循环导致系统无法正常运行。在内核编程中,可以通过内核线程定时给watchdog的复位清零, 使得watchdog计数器永远不会被复位,当内核出现cpu hung或者死循环导致无法调度时,内核

2013-09-03 21:06:26 2712

原创 watchdog 分析

本文分析s3c2410-s3c watchdog linux驱动。如图, S3C2440的Watchdog模块提供了三个寄存器来对Watchdog进行操作,他们分别是:定时器控制寄存器WTCON、定时器数据寄存器WTDAT和定时器计数寄存器WTCNT。注意:在对定时器数据寄存器WTDAT进行操作时必须在定时器控制寄存器WTCON使能之前写入一个计数目标值,当Watchdog使能

2013-09-03 20:59:24 2722

原创 利用用平台GPIO LED调试

GPIO 驱动的 LED 由于操作简单和可视化即可以在板上直接看到其闪烁时长和频率,我们可以通过LED这种特性用于调试开发过程当中各种情景, 如统计某个中断出发频率,某些在linux 内核比较难以调试的环境, 比如休眠唤醒模式, soc各种低功耗模式等环境, 这样即使在普通串口打印不能正常工作的环境,我们也可以利用LED辅助这些环境下的调试。0 GPIO LED 设备驱动分析区分于keyb

2013-09-03 17:04:40 4375 1

原创 git 开发分支模型

一般使用以下分支模型来开发项目,能够使得本地 的相关修改基于辅服务器的最新版本,避免冲突。master        主分支:用于跟服务器同步,永远不要在里头更新,只做:git pullfeature        feature 分支:用于开发某一个feature所建立的新分支        feature/bugfix: 用于fix某一个feature 的bugfixu

2013-09-02 15:43:18 919

原创 解析 Section Mismatch

Section Mismatch 可能引发非法内存访问,进而引发内核crush崩溃0 配置 Section Mismatch 检测CONFIG_DEBUG_SECTION_MISMATCH=y1 如何引发 Section Mismatch1.1 非法访问 __init section中的资源,因为带有__init 标记的section会在linux启动初始化完成后被free掉,这样

2013-08-31 16:27:15 1254

原创 regmap使用介绍

内核3.1引入一套新的API regmap,目的是提取出关于I2C SPI irq等相关注册、使能以及读写的公共部分,以提高代码的可重用性,并且使得在使用如上内核基础组件时变得更为简单易用。0 基础结构struct regmap_config { int reg_bits; // 寄存器地址的位数,必须配置,例如I2C寄存器地址位数为 8 int pad_bits; //

2013-08-31 15:33:33 29963

原创 sudo时不需要每次都输入root密码

在ubuntu等linux发行版本,有时需要借助sudo取得root权限,但是每次都需要输入root密码,为了方便开发,可修改 /etc/sudoers这个文件,如下:    # Members of the admin group may gain root privileges    %admin ALL=(ALL) ALL    w ALL=(ALL)NOPASSWD: AL

2013-08-31 14:49:55 7649

原创 Android 下收发input事件的工具 getevent 和 sendevent

Android 自带了 getevent 和 sendevent,分别用于获取设备报送的事件和模拟产生事件,前者用于辅助设备驱动的验证,后者用于模拟事件进行上层应用的验证。关于event设备的获取,在 /proc/bus/input/devices 下面:$ adb shell cat /proc/bus/input/devicesgetevent和sendevent用法:

2013-08-31 14:40:23 23564

原创 在 Android 通过 get_event 获得 input 设备 上报event

Android 本身有一个genevnet 和 sendevent 工具用来从内核获取event事件和向内核发送event事件,具体可以参考  o get_evnet 是一个可以获得注册成input设备上报event的调试工具。o usage: get_event /dev/input/eventX, X is 0, 1, 2,3,  4, 5,6o 附件为其源代码, 可以采用静态

2013-08-31 14:31:51 12358

原创 根据内核Oops 定位代码

内核开发时有时候出现Oops,例如一个野指针会导致内核崩溃,如运行时出现以下log:   5.438972] bells bells:  wm5102-aif1 samsung-i2s.0 mapping ok[    5.443812] bells bells: Failed to add route OPCLK->Sub CLK_SYS[    5.450499] Unable

2013-08-31 14:15:49 20245 5

原创 跟踪Android callback 调用堆栈

0 在调试 android  系统时可以通过打印调用堆栈 callback stack 来分析和解决android问题。1 java 层打印callback stack 可以通过 catch exception 然后 使用 Log.w(LOGTAG, Log.getStackTraceString(throwable)) 打印调用堆栈Throwable throwable = new

2013-08-31 11:40:36 16457

转载 堆与堆排序

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节

2013-08-28 11:46:52 667

转载 快速排序

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。 总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快

2013-08-28 11:41:01 1069

转载 归并排序的实现

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。//将有序数组a[]和b[]合并到c[]中void MemeryA

2013-08-28 11:32:51 718

转载 直接选择排序及交换二个数据的正确实现

直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。 设数组为a[0…n-1]。1.      初始时,数组全为无序区为a[0..n-1]。令i=02.      在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。

2013-08-28 11:17:52 615

转载 希尔排序的实现

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔

2013-08-28 10:32:30 643

转载 直接插入排序三种实现

直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 设数组为a[0…n-1]。1.      初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12.      将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。3.     

2013-08-28 10:25:42 602

转载 冒泡排序三种实现方法

冒泡排序是非常容易理解和实现,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。 按照定义很容易写出代码://冒泡排序1void BubbleSort

2013-08-28 09:58:47 1537

转载 C++函数重定义、重载、重写

1.重写(override):      父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。1)被重写的函数不能是static的。必须是virtual的,或者是override的(即函数在最原始的基类中被声明为virtual,c++中没有override)。2)重写函数必须有相同的类型,名称和参数列表3)重写函数的访问修饰符可以不同。尽管virtual是priva

2013-08-03 11:16:58 644

转载 重写、覆盖、重载、多态几个概念的区别分析

override->重写(=覆盖)、overload->重载、polymorphism -> 多态 override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。重写(覆盖)的规则:   1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.   2、重写方法的访问修饰符一定要大于被重写方法的

2013-08-03 11:12:35 2309 1

转载 全局对象在程序进入main之前construct, 离开main后destruct

Solve  Bjarne Stroustrup's little puzzle:Given the program:#includeiostream.h>// DON'T use or using namespace std;main() {    cout "Hello world" endl;}modify

2013-08-03 11:08:43 651

转载 C语言printf——动态指定输出格式长度

printf动态指定长度信息的数字,采用”*”来占用一个本来需要一个指定宽度或精度的常数数字的位置,例如:printf(s, "%.*s%.*s", 7, a1, 7, a2);或printf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);printf(s, "%-*d", 4, 'A'); //产生"65 "printf(s, "%#0

2013-08-03 11:07:29 1499

转载 据说是美国最“怪”C程序大赛的获奖程序

int main(){    printf(&unix["/021%six/012/0"], (unix)["have"] + "fun" - 0x60); }gcc -S编译成汇编代码如下:        .file   "test.c"        .section        .rodata.LC0:        .string "fun".LC1:

2013-08-03 11:05:35 945

转载 C 风格(C-style)强制转型

转载自 http://blog.csdn.net/starryheavens/article/details/4617637C 风格(C-style)强制转型如下:(T) expression  或T(expression) //函数风格(Function-style)两种形式之间没有本质上的不同。对于具有转换的简单类型而言C 风格转型工作得很好。然而,这样的转换符也能

2013-08-03 11:02:10 1351

转载 C++虚函数机制

转载自 http://blog.csdn.net/starryheavens/article/details/45496161.1      简介编译器对每个包含虚函数的类创建一个表(称为VTABLE)。在VTABLE中,编译器放置特定类的虚函数地址。在每个带有虚函数的类中,编译器秘密地置一指针,称为vpointer(缩写为VPTR),指向这个对象的VTABLE。通过基类指针做虚函数调

2013-08-03 11:01:15 603

原创 Android Native C Log

我们在做Android java的时候,为了调试我们经常使用Log.i,Log.d等等log函数,这样非常方便我们调试使用。但是如果是我们在使用Native C在做的时候,实际上也是可以利用LOG来输出调试信息的。查看方式一样。有两种方式:方式一:    包含#include     我们查看这个文件system/core/include/cutils/log.h

2013-06-03 16:29:23 2804

转载 ida debug android so

这里记录本人的学习的过程,分享给大家.希望大家不要像我一样走弯路.我的方法只需要ida,不用sdk,ndk,jre什么一大票东西,很快就能上手有什么不对之处欢迎指正.-----------------------------------------在xda看到受到某人鼓动,心血来潮想写一个官方rom的解扰器.sony的平板的的官方rom是加密的,直接看不到文件内容.心想既然平板

2013-05-30 21:24:42 17607 4

转载 用IntelliJ代替Eclipse,调试Android Source codes

本文所说的调试Android Source Code,是指区别于一般的Android App,是对Android系统源代码,包括自带的Apps,比如Mms, Contacts, Dialer等的开发和调试,需要对IDE做特殊的配置。    其实整个配置的目的,是2个方面:    1,在调试的时候,可以看到相关代码的引用,即看到符号表,这样才可以step into进去debug。

2013-05-30 19:16:51 6563

转载 android中c/c++程序的调试(eclipse)

android中c/c++程序的调试(eclips)1.          使用gdbserver调试使用JDWP只能调试java层面的程序,如果想调试C层面的代码,需要使用gdbserver方式,gdbserver的服务端和客户端都包含在android的源码中。server端是out/target/product/xxxxxx/system/bin/gdbserver。

2013-05-30 19:15:42 889

转载 音视频流::ffplay分析

网络以前用过qt4+mplayer来用过一个播放器。感觉只是加个外壳,没什么意思。我同学还跟我说,mplayer不是那么容易做的。直到现在,我还记住这句话。那时,我们一起学linux,感觉能用qt做个二次开发已经不错。直到现在,我真正接触ffmpeg,sdl,OSS,OpenGL。我才感觉到,原来开发一款播放器是这么有趣。在这里,我想整理一下思路,因为确实遇到了不少问题。

2013-04-26 08:58:24 848

转载 关于ffmpeg 的总结

http://hi.baidu.com/x3030/blog/item/e680052483bb7ee398250a7c.html关于ffmpeg 的总结(一个linux 下 集 屏幕录像录音,音频视频转换,合并音频视频文件,格式转换于一身的命令) 当然先安装了 gentoo 下一条命令搞定emerge  ffmpeg 格式转换 (将file.a

2013-04-26 08:57:47 921

转载 ubuntu下ffmpeg的一些命令收集

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由Fabrice Bellard发起的,现在由Michael Niedermayer主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视

2012-12-28 13:54:55 2055

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除