这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
嵌入式培训专家
Linux设备驱动开发http://
这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
华清远见
今天的内容Linux设备驱动的现状从 nonos驱动到 Linux驱动内核设施自旋锁、信号量、互斥量、完成量异步通知、信号阻塞与非阻塞内存与 I/O操作, DMA中断, tophalf/bottomhalf字符设备驱动复杂设备驱动的框架 LCD设备 FRAMEBUFFER FLASH设备 MTD TTY设备块设备用户空间的设备驱动设备驱动开发流程开发环境建设调试手段用户空间测试设备驱动的学习方法
这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
华清远见
Linux设备驱动的现状高需求 Linux内核的绝大多数代码为设备驱动新设备、新芯片、新驱动的需求
高门槛涉及到大量硬件操作涉及到内核基础知识涉及到并发控制与同步复杂的软件结构框架
高回报
这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
华清远见
从 nonos驱动到 Linux驱动 nonos驱动
单刀直入
简单
直接提供 API
Linux驱动
兵团战役
复杂
间接提供 API
应用软件
用户应用程序操作系统 API
设备驱动 SerialSend SerialRecv LightOn LightOff FlashWr FlashRd
操作系统
驱动中独立于设备的接口
硬件驱动中的硬件操作
串口
LED
FLASH硬件
nonos驱动与应用
onos驱动与应用
这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
华清远见
并发和竞态并发和竞态:对称多处理器 ( SMP )的多个 CPU单 CPU内进程与抢占它的进程中断(硬中断、软中断、 Tasklet、底半部)与进程之间
处理思路:
常用方法:
lock()//锁定,拿虎符 ... criticalsection//临界区,调动军队 ... unlock()//解锁定,归还虎符
中断屏蔽原子操作自旋锁信号量互斥体
这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
华清远见接口整型原子操作
原子变量设置原子变量的值 voidatomic_set(atomic_t*v,inti);//设置原子变量的值为 i atomic_tv=ATOMIC_INIT(0);//定义原子变量 v并初始化为 0获取原子变量的值 atomic_read(atomic_t*v);//返回原子变量的值原子变量加/减 voidatomic_add(inti,atomic_t*v);//原子变量增加 i voidatomic_sub(inti,atomic_t*v);//原子变量减少 iξ原子变量自增/自减 voidatomic_inc(atomic_t*v);//原子变量增加 1 voidatomic_dec(atomic_t*v);//原子变量减少 1η操作并测试 intatomic_inc_and_test(atomic_t*v); intatomic_dec_and_test(atomic_t*v); intatomic_sub_and_test(inti,atomic_t*v);操作并返回 intatomic_add_return(inti,atomic_t*v); intatomic_sub_return(inti,atomic_t*v); intatomic_inc_return(atomic_t*v); intatomic_dec_return(atomic_t*v);
位原子操作
设置/清除/反转位 voidset_bit(nr,void*addr); voidclear_bit(nr,void*addr); voidchange_bit(nr,void*addr);测试位 test_bit(nr,void*addr);η测试并操作位 inttest_and_set_bit(nr,void*addr); inttest_and_clear_bit(nr,void*addr); inttest_and_change_bit(nr,void*addr);
这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
华清远见自旋锁:
自旋锁 VS
信号量忙等待,无调度开销进程抢占被禁止锁定期间不能睡觉spinlock_tlock; spin_lock_init(&lock);
spin_lock(&lock);//获取自旋锁,保护临界区 ...//临界区 spin_unlock(&lock);//解锁
信号量
拿不到就切换进程,有调度开销锁定期间可以睡觉,不用于中断上下文
//定义信号量 DECLARE_MUTEX(mount_sem); down(&mount_sem);//获取信号量,保护临界区 ... criticalsection//临界区 ... up(&mount_sem);//释放信号量
这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
华清远见
设备访问方式资源可获得
读写返回读写系统调用返回阻塞读写函数
poll()或select()返回阻塞 poll系统调用
读写返回读写系统调用返回
信号处理函数 (进行读写 )用户空间 signal signal读写系统调用系统调用
唤醒唤醒唤醒 xxx_func() yyy_func()中断
读写函数
中断资源可获得
读写函数
内核空间
资源状态变更资源状态变更资源不可获得阻塞I/O资源可获得非阻塞轮询 I/O
异步通知
这是Linux大型培训机构华清远见的Linux设备驱动开发整体介绍,对初学者了解驱动开发的架构知识很有作用。
华清远见
1staticssize_txxx_write(structfile*file,constchar*buffer,size_tcount, 2loff_t*ppos) 3{ 4... 5DECLARE_WAITQUEUE(wait,current);//定义等待队列 6add_wait_queue(&xxx_wait,&wait);//添加等待队列 7 8ret=count; 9/*等待设备缓冲区可写 */ 10do 11{ 12avail=device_writable(...); 13if(avail<0) 14__set_current_state(TASK_INTERRUPTIBLE);//改变进程状态 15 16if(avail<0) 17{ 18if(file>f_flags&O_NONBLOCK)//非阻塞 19{ 20if(!ret) 21ret=EAGAIN; 22gotoout; 23} 2 …… 此处隐藏:3955字,全部文档内容请下载后查看。喜欢就下载吧 ……
