- 博客(261)
- 资源 (28)
- 收藏
- 关注
原创 INIT_WORK(工作队列的理解)
以前内核里对这个函数是这样定义的 #define INIT_WORK(_work, _func, _data),可以理解为INIT_WORK会在你定义的_work工作队列里面增加一个工作任务,该任务就是_func。_func这个任务会需要一些数据作为参数,这个参数就是通过_data传递的 而现在看驱动的时候你会发现调用INIT_WORK的时候是只有两个参数,去掉了数据的部分。也许你
2012-12-11 10:15:13 2787
原创 多维数组与指针 精析
可以认为 C语言中只有一维数组,没有真正的二维数组。如二维数组 a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}} ,可以认为是一个 一维数组 : a[3]={ a[0], a[1], a[2] }其中 a[0],a[1],a[2] 又是三个有四个元素的一维数组, 即 a[0]={ 1,3,5,7 },a[1]={ 9,11,13,15
2012-10-26 15:41:34 1277 1
原创 浅谈C中静态变量与全局变量初始化时间
int a;main(){while(1){ static b=1; a=2; b++; a++;}}我们所理解的静态变量b,只知道它在上面的函数内部只初始化一次,其实是个假像 ,我要表达的是,事实上b初始化的值,不是在循环体完成的.继续下看.while(1){ st
2012-10-26 13:43:10 17596 4
转载 C中的const
问题1:const变量&常量 例:为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? const int n = 5; int a[n]; 答案与分析: 1)这个问题讨论的是“常量”与“只读变量”的区别。常量,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区
2012-10-26 10:36:14 1447
原创 ntohs和htons区别?
一直以来都对这个两个函数含含糊糊的,今天又用到所以特意查看linux的源代码(/include/netinet/in.h)# if __BYTE_ORDER == __BIG_ENDIAN/* The host byte order is the same as network byte order, so these functions are all just identity
2012-09-26 20:19:17 6021
原创 一个c回调函数的例子
01#include02// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)03 04typedef int (*CallBackFun)(char *p); // 为回调函数命名,类型命名为 C
2012-09-24 16:46:48 13045 1
原创 详解大端模式和小端模式
一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必
2012-09-13 19:07:57 1293
原创 memcpy memmove区别和实现
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。memmove的处理措施:(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝(3)当源内存
2012-09-03 11:39:34 1863
原创 Linux下串口参数VTIME和VMIN的用法
Linux下串口参数VTIME和VMIN的用法 VTIME指定了等待的时间,VMIN指定了读取字符的最小数量。 它们不同组合地取值会得到不同的结果,分别如下: 1.当VTIME>0,VMIN>0时。read调用将保持阻塞直到读取到第一个字符,读到了第一个字符之后开始计时,此后若时间到了VTIME或者时间未到但已读够了VMIN个字符则会返回;若在时
2012-08-21 08:33:42 5031 1
原创 修改内核编译配置菜单(make menuconfig)
1.所加目录为daiq,文件如下:[daiq@localhost daiq]$ tree.|-- Kconfig|-- Makefile`-- test.c#注意此时各个目录中的Makefile和Kconfig文件是空的2.在新增的相应目录添加Kconfig和Makefile文件,上面的目录中已经添加。3.修改新增目录的父目录的Kconfig和Makefile文
2012-08-07 11:23:35 2745
原创 修改内核编译配置菜单(make menuconfig)
A.在Linux内核中增加自己的程序步骤(注意这里只是程序文件): 1.将编写的源代码复制到Linux内核源代码的相应目录中。2.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项3.在目录的Makefile文件中增加对新源代码的编译条目。B.在Linux内核drivers/目录中增加目录和子目录步骤: 1.所加目录为daiq,文件如下:[daiq@lo
2012-08-07 11:10:38 183
原创 C语言隐式类型转换
隐式类型转换分三种,即算术转换、赋值转换和输出转换。1.算术转换 进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数招必须转换成同 一类型的数据才能运算,算术转换原则为: 整型提升:对于所有比int小的类型,包括char, signed char, unsigned char, short, unsigned short,首先会提升为int类型
2012-08-03 14:31:30 22526 3
原创 linux系统修改NAND Flash分区
在修改NAND Flash分区时,需要修改linux2.6.21/ arch/ mach-at91rm9200/目录中board-dk.c文件的dk_nand_partition结构。本系统将1G NAND Flash划分为1个分区。dk_nand_partition结构如下修改:static struct mtd_partition __initdata dk_nan
2012-07-26 21:27:29 268
原创 修改Bootstrap源码支持不同大小nandflash
原开发板是256M的NANDFLASH,目的是想用一个64M的nandflash,并且从nandflash启动。 主要是对bootstraps修改,修改地方如下:(以百特光盘自带的AT91Bootstrap1.2为例) 1:AT91Bootstrap1.2/include/nand_ids.h中的增加两行{0xecf1, 0x400, 0x20000, 0x800, 0x4
2012-07-26 11:41:21 3085 2
原创 内核配置的Default kernel command string和uboot的bootargs变量区别
1. 如果uboot的bootargs设置了,kernel的Boot options中的Default kernel command string设置与否,都不启作用,即bootargs覆盖掉设置的Default kernel command string,打印的信息也是bootargs传过来的command string。 2. 如果uboot的bootargs未设置
2012-07-26 11:12:32 2429 1
原创 从free到page cache
Free我们经常用free查看服务器的内存使用情况,而free中的输出却有些让人困惑,如下: 图1-1先看看各个数字的意义以及如何计算得到:free命令输出的第二行(Mem):这行分别显示了物理内存的总量(total)、已使用的 (used)、空闲的(free)、共享的(shared)、buffer(buffer大小)、 cache(cache的大小)的内存。
2012-05-18 10:37:25 1562
原创 linux free命令解析
因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。先说下free命令怎么看内存[c-sharp] view plaincopy[root@ahsq proc]# free total used free shared buffers cached Me
2012-05-17 19:13:30 2712
原创 wait_event_interruptible_timeout和schedule_timeout区别
一、适用情况wait_event_interruptible_timeout和schedule_timeout的区别当在某个硬件驱动程序中使用wait_event_interruptible_timeout时,执行的继续可以通过以下两种方式获得:1.其他人在等待队列上调用了wake_up2.超时到期。而调用schedule_timeout的进程始终会在超时到期时被唤醒。二、
2012-04-22 21:17:01 12567
原创 xmlInitParser和xmlCleanupParser 多线程操作
使用libxml2库的朋友,可能会对它提供的初始化接口(xmlInitParser )和清除资源接口(xmlCleanupParser )感到困惑.因为在它主页中提供的例子里面,各处使用的情况差别很大. 我花了些时间把这两个接口使用方法整理如下:1. 在单线程(single-threaded)环境中 xmlInitParser 可以被调用一次,或者被调用多次(多于一次),甚至可
2012-04-20 18:25:09 2280 1
原创 select 和poll函数调用驱动的poll->poll_wait 理解
poll_wait不会挂起当前进程,而是把自己注册到某个事件等待队列中.poll_wait()是用在select系统调用中的. 一般你的代码会有一个struct file_operations结构, 其中fop->poll函数指针指向一个你自己的函数, 在这个函数里应该调用poll_wait() 当用户调用select系统调用时,select系统调用会 先调用
2012-04-10 19:53:49 6145 2
原创 Linux设备驱动编程之poll()函数原理
阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时,并不挂起。被挂起的进程进入sleep状态,被从调度器的运行队列移走,直到等待的条件被满足。 在Linux 关于上述例程,我们补充说一点,如果将驱动程序中的read函数改为:static ssize_t globalv
2012-04-10 10:44:18 5228 2
原创 class_create(),class_device_create()创建/dev/xxx 名字
在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_c
2012-03-27 11:30:48 2112
原创 字符设备驱动poll函数
#ifndef _MEMDEV_H_#define _MEMDEV_H_#ifndef MEMDEV_MAJOR#define MEMDEV_MAJOR 0 /*预设的mem的主设备号*/#endif#ifndef MEMDEV_NR_DEVS#define MEMDEV_NR_DEVS 2 /*设备数*/#endif
2012-03-08 17:47:17 1387
原创 字符设备驱动poll函数
#ifndef _MEMDEV_H_#define _MEMDEV_H_#ifndef MEMDEV_MAJOR#define MEMDEV_MAJOR 0 /*预设的mem的主设备号*/#endif#ifndef MEMDEV_NR_DEVS#define MEMDEV_NR_DEVS 2 /*设备数*/#endif
2012-03-08 17:45:54 95
原创 ARM9260内部中断和外部中断触发方式
1.内部中断(0~31) 内部中断可以有4中触发方式 static struct irq_chip at91_aic_chip = { .name = "AIC", .irq_ack = at91_aic_mask_irq, .irq_mask = at91_aic_mask_irq,
2012-03-06 13:54:53 2835
原创 子网掩码和网关的关系
子网掩码有数百种,这里只介绍最常用的两种子网掩码,它们分别是“255.255.255.0”和“255.255.0.0”。 1.子网掩码是“255.255.255.0”的网络:最后面一个数字可以在0~255范围内任意变化,因此可以提供256个IP地址。但是实际可用的IP地址数量是256-2,即254个,因为主机号不能全是“0”或全是“1”。 2.子网掩码是“255.255.0
2012-02-25 16:00:40 23260 1
原创 linux 内核编译文档
一、makemenuconfig说明:make menuconfig(或者其他的配置命令),命令执行完后产生文件.config(隐含的),其中保存着配置信息。下一次再做make menuconfig将产生新的.config文件,原.config被改名为.config.old。 二、make oldconfig优点:迅速; 如果新内核选项没有出现在您的配置文件中,它会停下来并等候
2012-02-21 09:30:38 1528
原创 高级字符设备驱动--中断下半部机制之workqueue(二)
工作队列workqueue工作队列(work queue)是另外一种将中断的部分工作推后的一种方式,它可以实现一些tasklet不能实现的工作,比如工作队列机制可以睡眠。这种差异的本质原因是,在工作队列机制中,将推后的工作交给一个称之为工作者线程(worker thread)的内核线程去完成(单核下一般会交给默认的线程events/0)。因此,在该机制中,当内核在执行中断的剩余工作时就处在
2012-02-20 22:03:50 957
原创 libxml2 node type预定义常量
预定义常量以下常量由本扩展模块定义,因此只有在本扩展模块被编译到 PHP 中,或者在运行时被动态加载后才有效。XML constantsConstantValueDescriptionXML_ELEMENT_NODE (integer)1Node is an elementXML_ATT
2012-02-20 22:03:39 1443
原创 高级字符设备驱动--中断下半部机制之tasklet(一)
综述 Linux把中断处理例程分两部分:上半分:实际响应中断的例程。下半分:被顶部分调用,通过开中断的方式进行。两种机制实现:Tasklet工作队列work queue上半部的功能是"登记中断",当一个中断发生时,它进行相应地硬件读写后就把中断例程的下半部挂到该设备的下半部执行队列中去。因此,上半部执行的速度就会很快,可以服务更多的中断请求。但是,仅有"
2012-02-20 21:34:00 946
原创 c语言中的的内联(inline)函数
c语言中的的内联(inline)函数发表于 2011 年 01 月 26 日 由 adminc/c++中的inline,使用在函数声明处,表示程序员请求编译器在此函数的被调用处将此函数实现插入,而不是像普通函数那样生成调用代码(申请是否有效取决于编译器)。一般地说,这样作的优点是省掉了调用函数的开销;缺点则是可能会增加代所生成目标代码的尺寸(二班的除外,二班情况下,inli
2012-02-18 18:43:22 30740 1
原创 强制内联和强制不内联
1.强制不内联一个函数,如果代码量比较少的话,用 -O3优化开关的话,gcc有可能将这个函数强制内联(inline)即使,你在函数前没有写inline助记符。如果是一个手写汇编的函数,那样的话很有可能破坏参数。gcc里有强制不内联的,用法如下void foo() __attribute__((noinline));但是有的gcc可能会忽略 noinline。那么你可以将你实
2012-02-18 18:42:05 20679
原创 GCC and C99 inline
C语言的inline转以前我用Docbook写的一篇关于C语言inline关键字使用的文章。唉,要是能用docbook直接写Blog就好了。用得越多发现Docbook这个东西真是越好用啊~~ 本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definitio
2012-02-17 19:27:41 1203
原创 GCC 中的inline关键字
inline关键字是C99中新加的,使用的时候,要注意以下两点:1、inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了
2012-02-17 19:26:32 140
原创 inline函数定义放在头文件中的作用
两个文件:main.c中得代码如下#include #include "print_inline.h"int main(int argc, char *argv[]){ print_inline();system("PAUSE"); return 0;}print_inline.h文件中得代码:#include inline
2012-02-17 19:25:35 6796 2
原创 errno 列表
errno.h 写道#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR 4 /* Interrupted system call */#de
2012-02-15 19:16:53 3315
sscom5.13串口调试工具
2023-03-27
sttoolset-STM32读写HEX工具
2023-03-27
CmBacktrace开源代码,亲测可用
2023-03-27
PT1000 分度表C语言代码
2020-12-29
STM32_OS.zip
2020-06-17
Quartus_13.0_WinXp_32bit破解器
2013-06-24
Linux-C-编程一站式学习
2012-09-03
python教程pdf合集
2012-03-18
C语言函数速查手册--标准库函数
2010-08-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人