linux 设备驱动程序 (6) – 阻塞型 io、poll linux 设备驱动程序 (6) – 阻塞型 io、poll 阻塞型 IO上篇的例子中, 当资源不可获取时 (读写指针指向同一个位置) 我们提到了采取阻塞的方式. 这一篇展开叙述阻塞 io. 在用户态程序中, 调用进程通常只会简单的调用 read 和 write, 不会考虑数据是否可用, 输出缓冲区是否已满之类的问题. 在我们的驱动程序中, 当遇见这种情况应当 [默认] 阻塞该进程, 直到数据可 2014-03-04 #linux #驱动开发
linux 设备驱动程序 (5) – 字符设备驱动例子 linux 设备驱动程序 (5) – 字符设备驱动例子 这次给出一个例子, 比 (3) 中的例子稍微复杂一些. 在 (3) 中, 给出了一个字符设备的例子, 会保存最后一个写入的字节. 这次的例子使用一个链表保存写入的数据, 读取时从链表中移出数据:![image_1bl0atutt1kn7iv5t3b18q8fr49.png-5.9kB][1] 因此这个驱动和 FIFO 和管道非常相似, 当 2014-03-03 #linux #驱动开发
c 标准库字符输入输出 c 标准库字符输入输出 按功能分类读取一个字符 getchar Get character from stdin (function) getc Get character from stream (function) fgetc Get character from stream (function) 123int getchar ( void 2014-03-01 #C #标准库
拥有锁的时候最好不要进行休眠 拥有锁的时候最好不要进行休眠 当拥有一个自旋锁,seqlock 和 RCU 锁时禁止休眠。关闭中断时禁止休眠原因是,当拥有这些锁的时候必须确保程序处于一个原子的上下文中。具体可见驱动 4 拥有一个信号量的时候尽量使休眠的短一些。原因很简单,你拿着一个锁不用,却去睡觉了,不是相当于占着茅坑不拉屎吗?结果导致其他等待信号量的线程也要休眠。 2014-02-18 #错题本 #坑
linux 设备驱动程序 (4) – 并发 linux 设备驱动程序 (4) – 并发 进行 linux 驱动开发不得不考虑的问题就是并发问题. 因为在内核态, 代码是可抢占的, 你不知道什么时候内核会抢占你对 CPU 的使用权来执行另一段代码 (这段代码可能会修改掉你的数据). 而且现在大多使用 SMP(对称多处理器), 代码甚至可以同时执行. 性能得到了很大提升但是编程的复杂程度也高了很多. 特别是在如何防止数据被其他执行线程修改上. 2014-02-17 #linux #驱动开发
linux 数据结构函数 linux 数据结构函数 今天翻 man page, 发现 linux 下的 libc 比标准库要丰富很多, 除了提供了一些系统相关的包装函数 (fdopen popen dprintf 之类) 来降低编程难度以外, 还提供了一组数据结构相关的函数. 粗略看了一下, 提供了以下数据结构: 哈希表 队列 二叉查找树 还提供了简单的线性查找算法.哈希表: 123456789#include &l 2014-02-09 #linux #内核 #kernel
[转]Linux Netcat 命令:网络工具中的瑞士军刀 netcat 是网络工具中的瑞士军刀,它能通过 TCP 和 UDP 在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用 netcat 命令所能完成的事情令人惊讶。 英文原文: Linux Netcat command – The swiss army knife of networking,编译:oschina netcat 所做的就是在两台电脑之间建立链接并返回 2014-02-08 #linux #netcat
linux设备驱动程序(3) – 字符设备驱动(设备号 注册设备) 这次我们学习最简单的一种设备, 字符设备驱动的开发. 最终写出一个字符设备, 用户可以进行打开和关闭, 并向他写入数据, 它会始终保存着最后一次写入的数据, 对它进行读取会读出最后一次写入的数据. 1.设备号在linux中执行ls -l命令, 在日期之前可以看到两个用逗号隔开的数, 这个便是设备号, 逗号之前的是主设备号(major)后面的是次设备号(minor). 在内核中, 设备号使用dev 2014-01-29 #linux #驱动开发
linux设备驱动程序(2) – 内核版本 导出符号 模块参数 关于 内核版本 导出符号 模块参数 的内容 1.内核版本有时模块会针对多个不同版本的内核进行编译, 这时就应该用到预处理命令来实现条件编译. 主要通过测试<linux/version.h>中的宏来完成. UTS_RELEASE: 内核版本的字符串, 如”2.6.10″ LINUX_VERSION_CODE: 内核版本的二进制表示, 每个版本号对应一个字节, 如2.6.10版的LINU 2014-01-28 #linux #驱动开发
记录一下开发过程的小插曲minimad libmad是一个开源mp3软件解码库(很久以前的东西了, 原来曾用过, 突然有想法把它放我mk808上试试), c+汇编写的, 本身对arm平台有汇编优化, 可是因为年代久远而且是针对armv4优化的, 优化了还不如不优化(优化了反而有杂音, 关了之后很好). 源代码目录里有一个示例用的minimad.c, 是基于这个库的一个简单的mp3播放器. 插上我的号称7.1channel的usb外置声 2014-01-27 #linux #minimad