嵌入式驱动
你好啊陈同学
这个作者很懒,什么都没留下…
展开
-
mount.nfs: access denied by server while mounting
access denied by server while mounting在服务器端/etc/exports中加入insecure原创 2021-12-20 15:22:18 · 393 阅读 · 0 评论 -
学习笔记十:linux驱动之内核定时器
内核定时器 定时器是我们最常用到的功能,一般用来完成定时功能,本章我们就来学习一下Linux内核提供的定时器API函数,通过这些定时器API函数我们可以完成很多要求定时的应用。Linux内核也提供了短延时函数,比如微秒、纳秒、毫秒延时函数,本章我们就来学习一下这些和时间有关的功能。配置系统频率 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置,设置好以后就周期性的产生定时中断,系统使用定时中断来原创 2021-11-06 00:14:55 · 289 阅读 · 0 评论 -
学习笔记九:linux驱动之等待队列
等待队列 waitqueue(等待队列)是内核用于管理等待资源的进程,当某个进程获取的资源没有准备好的时候,可以通过调用函数将当前进程添加到等待队列中,然后切换到其他进程继续执行。 当资源准备好,由资源提供方通过调用wake_up函数唤醒等待队列中的所有进程头文件#include <linux/wait.h>定义方法wait_queue_head_t wq;init_waitqueue_head(&wq);阻塞接口wait_event(wq,condition);原创 2021-11-05 23:47:02 · 397 阅读 · 0 评论 -
jiffies的初始值不为0
jiffiesjiffies记录了系统启动以来,经过了多少tick。一个tick代表多长时间,在内核的CONFIG_HZ中定义。比如CONFIG_HZ=200,则一个jiffies对应5ms时间。所以内核基于jiffies的定时器精度也是5ms。jiffies的初始值并不是0,而是300s后即将溢出的的值。这是为了存在溢出问题的情况下,尽早暴露问题。arch/arm/kernel/vmlinux.lds.S: jiffies = jiffies_64;include/linux/jiffi原创 2021-11-04 15:05:47 · 363 阅读 · 0 评论 -
modprobe和insmod的区别
modprobe和insmod首先modprobe和insmod都可以实现加载模块,但是更加推荐使用modprobe而不是insmod。因为modprobe可以解决模块间依赖的问题,比如A模块使用了符号导出,导出的符号需要在B模块中使用,这就要求在加载模块时需要先加载模块A再加载模块B,在insmod的情况下会给报错,而用modprobe则会在/lib/modules/$(shell uname -r)/目录下去寻找依赖模块。另一种情况,现在需要加载模块A,而模块A已经加载过了,已经存在了,使用insm原创 2021-11-02 15:59:52 · 1602 阅读 · 0 评论 -
学习笔记八:linux驱动之内核信号量
信号量信号量分为用户信号量和内核信号量,用户信号量又分为POSIX信号量和SYTEM V 信号量,POSIX信号量又细分为无名信号量与有名信号量。所以总共有四种信号量,即无名信号量、有名信号量、SYTEM V信号量、内核信号量。该文章中主要讲内核信号量的使用方法:初始化在linux/semaphore.h中#include <linux/semaphore.h>struct semaphore sem;sema_init(&sem,1);// 第一个参数是要操作的信号量原创 2021-10-26 13:48:00 · 189 阅读 · 0 评论 -
学习笔记七:linux驱动之ioctl用法
ioctl在用户空间, ioctl 系统调用有下面的原型:int ioctl(int fd, unsigned long cmd, ...);ioctl 驱动方法有和用户空间版本不同的原型:int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);inode 和 filp 指针是对应应用程序传递的文件描述符 fd 的值, 和传递给 open 方法的相同参数. cmd 参数原创 2021-10-18 20:30:29 · 3605 阅读 · 0 评论 -
学习笔记六:linux驱动之互斥锁mutex
互斥锁mutex互斥体概述信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,mutex用于互斥操作。mutex的语义相对于信号量要简单轻便一些,在锁争用激烈的测试场景下,mutex比信号量执行速度更快,可扩展性更好,另外mutex数据结构的定义比信号量小。互斥锁使用注意事项:1.同一时刻只有一个线程可以持有mutex。2.只有锁持有者可以解锁,不能在一个进程中持有mutex,在另外一个进程中释放他。3.不允许递归地加锁和解锁。4.当进程持有mutex时,进程不可以退出。5原创 2021-10-14 18:21:01 · 1371 阅读 · 0 评论 -
学习笔记五 :linux驱动之原子变量
原子变量原子变量atomic_t,定义在linux/types.h中typedef struct { int counter;} atomic_t;在asm/atomic.h中// 读取原子变量的值#define atomic_read(v) READ_ONCE((v)->counter)// 设置原子变量的值// 参数 v:操作的量的地址 i:给原子变量的设置值#define atomic_set(v,i) WRITE_ONCE((v)->counter, (i))原创 2021-10-14 15:17:17 · 640 阅读 · 0 评论 -
学习笔记四 :linux驱动之module_param的用法
从 main函数说起我们在用户太写程序时都喜欢用main函数的如果参数来向程序内传递数据#include <stlib.h>#include <stdio.h>int main(int argc,char **argv){ exit(0);}其中argc为传入程序内参数的个数,argv为传入的参数 ,其中的第一个参数argv[0]为当前文件的含路径的名字,所以实际传入程序内的参数个数为argc-1个。内核模块传入参数内核模块中没有main函数,所以向模块内部传入原创 2021-09-27 19:38:17 · 4645 阅读 · 1 评论 -
学习笔记三 :linux驱动之符号导出EXPORT_SYMBOL
符号导出EXPORT_SYMBOL在写linux驱动程序的过程中遇到一个模块中编写的函数,或者变量需要在另一个模块中使用的时候就可以用符号导出EXPORT_SYMBOL。在Linux内核源码目录下有一个文件Module.symvers,该文件内就存放的linux内核中导出的符号。下面的代码是使用方法,首先是模块A,模块A中有一个变量num,和一个函数print_hello需要在模块B中使用,所以需要将模块A中的这两个导出。// 模块A#include <linux/module.h>原创 2021-09-19 12:59:02 · 642 阅读 · 0 评论 -
学习笔记二:新Linux驱动之字符设备驱动
新字符驱动设备首先看看分配设备号的函数(动态分配和静态分配):int register_chrdev_region(dev_t, unsigned, const char *);// 静态分配:通过已知未使用的主设备号像内核注册设备号// 缺点:设备号可能重复导致注册失败// 参数1:申请的设备号// 参数2:申请设备号个数(主设备号不变,次设备号增加)// 参数3:设备名(体现在/proc/devices)// 返回值: 成功返回0,失败返回负数int alloc_chrdev_reg原创 2021-08-12 13:27:33 · 99 阅读 · 0 评论 -
学习笔记一:Linux驱动之字符设备驱动
学习笔记一:Linux驱动之字符设备驱动先把用到的函数写在前面:// 注册字符设备int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops);// 取消注册字符设备void unregister_chrdev(unsigned int major, const char *name);// file_operations中经常需要实现的成员如下struct file_原创 2021-08-04 14:40:01 · 131 阅读 · 0 评论