1.void *memset(void *s,int ch,size_t n);memset函数将s中当前位置后面的n个字节(typedef unsigned int size_t)用ch替换并返回s。作用是在一段内存块中填充某个给定的值,它是对较大的结构体或者数组进行清零操作的一种最快方法
2.void *memcpy(void *dest,const void *src,size_t n);从src所指的内存中拷贝n个字节给dest所指的内存中,dest和src可以是数组或者结构体;memset和memcpy函数的头文件都是#include<string.h>
3.忽然发现要想着一个函数的头文件可以在shell中用"man 函数名"来查看这个函数应包含的头文件和函数原型与用法等,非常有用
4.在shell中杀死前台的进程可以用"ctrl+c",杀死后台进程可以用"kill -9 <PID>",除了杀死进程外,kill还可以传递信号给进程
5.为了使设备支持异步通知机制,驱动程序中涉及以下3项工作:(1)支持F_SETOWN命令,能在这个控制命令处理中设置filp->f_owner为对应进程ID,不过此项工作已由内核完成,设备驱动无须处理;(2)支持F_SETFL命令,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行,fasync >fasync_helper(fd,filp,on,&button_async),其中helper函数负责初始化fasync_struct结构的button_async(里面包含进程ID),button_async将在kill_fasync中用到;(3)在设备资源可获得时,调用kill_fasync()函数激发相应的信号SIGIO给进程
6.在用户程序中:(1)调用signal(SIGIO,my_func);设置信号处理函数(2)fcntl(fd,F_SETOWN,getpid());让设备和本进程关联,kill_fasync的信号知道发给哪个进程PID(3)flag=fcntl(fd,F_SETFL);fcntl(fd,F_SETFL,flag|FASYNC);设置fasync的标志为异步通知,会调用驱动的fasync > fasync_helper 初始化/释放
8.原子操作:原子操作指的是在执行过程中不会被别的代码路径所中断的操作
1.atomic_t v=ATOMIC_INIT(1);/*定义原子变量v并初始化1*/
2.atomic_read(atomic_t *v); /*返回原子变量的值*/
3.void atomic_inc(atomic_t *v)/*原子变量增加1*/
4.void atomic_dec(atomic_t *v)/*原子变量减少1*/
5.void atomic_dec_and_test(atomic_t *v)/*自减操作后测试是否为0,为0返回true,否则返回false*/
10.信号量:是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区的代码,当获取不到信号量时,进程进入休眠状态。
static DECLARE_MUTEX(button_lock);/*定义互斥锁并初始化*/
void down(struct semaphore *sem);/*获取信号量*/
int down_interruptible(struct semaphore *sem);/*中断方式获取*/
int down_trylock(struct semaphore *sem);/*试图获取信号量,获取不到就返回不休眠*/
void up(struct semaphore *sem);/*释放信号量*/
12.阻塞:是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。
13.非阻塞:进程不能进行设备操作时不挂起,进程要么放弃调用要么不停查询,直到可以进行操作为止。eg:fd=open("...",O_RDWR|O_NONBLOCK);
15.周期和频率的转化(周期的倒数等于频率?):1us可以看成1MHz,0.1us(100ns)可以看成10MHz
16.inv(inverted)是反转的意思
17.framebuffer(帧内存,储存像素的值)位于SDRAM里面,且地址必须连续,所以不能用kmalloc函数
18.u8是unsigned char,u16是unsigned short int,u32是unsigned long int.这些都是需要自己定义不是系统自带的
19.LCD的使能操作:1.打开电源;2.打开背光
20.当把大量垃圾数据写到framebuffer时,显示花屏