Linux驱动知识点

 

#

i2c_add_driver和i2c_new_device匹配后调用i2c_probe
i2c控制器被注册为Platform设备。

 

#

启动开发板,在超级终端中输入命令“cat /proc/misc”也可以查看对应的杂项设备。

前面介绍过主设备号只有 256 个,而设备又非常多,所以引入了子设备号。

其中misc杂项设备的主设备号是 10,在任何 Linux 系统中它都是固定的。

 

#

1号进程是init进程,0号进程是内核进程swapper进程。

 

#

自旋锁本质是忙等待,如果获取释放自旋锁的时间较久,会降低系统性能。
不可以递归使用自旋锁。
获取自旋锁后不可以再调用阻塞接口,
不可以调用copy_to_usr copy_from_usr kmalloc等可能引起阻塞的函数。
内核信号量只能在进程上下文之间使用(驱动中对应应用层进程的打开,读写,关闭等函数体),不能在中断上下文中使用。
也就是说,进程上下文同步使用信号量。  
而,中断上下文和进程上下文之间,进程上下文和其他内核代码之间,使用自旋锁。

 

#

wait_event_interruptible(wq, condition)
用wake_up_interruptible()唤醒后,wait_event_interruptible(wq, condition)宏,
自身再检查“condition”这个条件以决定是返回还是继续休眠,
真则返回,假则继续睡眠,
这个过程中若有中断,会响应执行中断函数。

只有当执行wake_up_interruptible()并且condition条件成立时才会把程序从队列中唤醒。
内核中虽然定义了很多唤醒等待队列中进程的函数,但是最终调用的都是__wake_up()

#define wake_up(x)                __wake_up(x, TASK_NORMAL, 1, NULL)
#define wake_up_nr(x, nr)        __wake_up(x, TASK_NORMAL, nr, NULL)
#define wake_up_all(x)            __wake_up(x, TASK_NORMAL, 0, NULL)
#define wake_up_locked(x)        __wake_up_locked((x), TASK_NORMAL)

#define wake_up_interruptible(x)        __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)
#define wake_up_interruptible_nr(x, nr)    __wake_up(x, TASK_INTERRUPTIBLE, nr, NULL)
#define wake_up_interruptible_all(x)    __wake_up(x, TASK_INTERRUPTIBLE, 0, NULL)
#define wake_up_interruptible_sync(x)    __wake_up_sync((x), TASK_INTERRUPTIBLE, 1)

而__wake_up()函数在加锁之后调用的是__wake_up_common() .

 

#

 * pwm_config API 详解
 * 该函数有三个参数,第一个是当前设置的pwm设备,第二个和第三个分别是占空比与周期。
 * pwm_config(pwm1, 1200000, 5000000);
 * 占空比与周期的单位均是ns, 
   其中5000000ns即表示5ms,说明一个波形的周期是5ms 
   其中1200000ns即表示1.2ms,说明一个波形中电平值为高时持续时间为1.2ms

 

#

内核模块无法使用glibc库函数,下面网站是常用的 linux内核库函数

https://blog.csdn.net/qq_44710568/article/details/105382670

 


#

 

printk 打印等级 使用示例:

 


#

模块加载、卸载  /  模块间的依赖关系

 

#

 

 

 

#

 

 

#

 


#

 


#

 


#

 


#

 


#

 


#

 

 

 

 

 

.

posted @ 2020-10-03 22:56  一匹夫  阅读(270)  评论(0编辑  收藏  举报