Linux设备驱动程序--学习笔记(4)

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 初始化/释放


7.--num;或者num--;这个操作不是原子操作,因为用汇编代码看的话要经历:读取->修改->返回。在这个过程有可能会被中断导致出错


8.原子操作:原子操作指的是在执行过程中不会被别的代码路径所中断的操作


9.驱动程序的原子操作函数有:
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.信号量:是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区的代码,当获取不到信号量时,进程进入休眠状态。


11.驱动程序中的信号量操作有:
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);


14.在给结构体分配内存时,有时候会多分配一块内存用于存储"私有数据".


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时,显示花屏




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值