自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 【共享内存和信号量】

(2)V(sv):我们将释放信号量称为V操作,释放信号量的本质就是归还临界资源中某块资源的使用权限,当释放成功时临界资源中资源的数目就应该加一,因此V操作本质就是让计数器加一,如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给他加1。(1)P(sv):我们将申请信号量称为P操作,申请信号量的本质就是申请获得临界资源中某块资源的使用权限,当申请成功时临界资源中资源的数目应该减去一,因此P操作的本质就是让计数器减一,如果sv的值大于零,就给它减1;通常用于获取资源的使用权;

2024-05-23 10:50:58 823

原创 【bug 记录】

如果pthread_mutex_unlock在while外面,则需要再if里面解锁,不然cmd一直被锁住无法修改,风扇无法关闭,如果在while里面则不用在if里面解锁。ioctl传参的时候cmd的数据类型unsigned char会报错,case语句超出unsigned char最大值,if(){} if(){} 会判断所有条件是否成立,互不干预,并都会去执行判断一次;当先开启数码管响应后,再去控制led,led控制会被数码管的响应覆盖;所以在数码管的条件语句中需要添加一句将数码管指令赋值为0x70;

2024-05-17 20:35:31 164

原创 【线程同步与互斥】

pthread_create()之前的全局资源—>有线程操作的全程资源—>变为临界资源。线程间互斥===有你没他(无执行顺序,CPU调度到哪个线程就哪个线程执行)静态变量,全局变量,系统资源。线程间同步===有序执行。条件变量+互斥锁(同步)同步和互斥是为了什么?2.条件变量+互斥锁。

2024-05-14 14:56:35 128

原创 【I2C总线驱动】

Inter-Integrated Circuit: 字面意思是用于“集成电路之间”的通信总线,简写:IIC(或者I2C)i2c传输的要点就是: 传输一个字节 后面必然紧跟一个"响应"信号----应答信号.这个响应信号可能来自主机,或者是从机,具体是谁,就要看传输方向。传输方向分两种情况(每种情况又有两种可能: A无应答和 B有应答):1.主机->从机,主机对从机发一个字节之后,主机要读取从机的响应信号(主机读SDA线)

2024-04-08 15:18:22 574

原创 【LV16 Day3 平台总线开发 ID匹配和设备树匹配】

id匹配(可想象成八字匹配):一个驱动可以对应多个设备 ------优先级次低用到结构体数组,一般不指定大小,初始化时最后加{}表示数组结束设备中增加资源,驱动中访问资源。

2024-03-30 19:28:14 227

原创 【LV16 day2 平台总线驱动开发---名称匹配】

​ driver模块中,struct platform_driver成员driver的name成员必须指定,但与device模块中name可以不相同。初期方案,各种device需要编码方式注册进内核中的设备管理结构中,为了进一步减少这样的编码,引进设备树。2.2 id匹配(可想象成八字匹配):一个驱动可以对应多个设备 ------优先级次低。2.3 设备树匹配:内核启动时根据设备树自动产生的设备 ------ 优先级最高。​ 带来的问题-------怎样将二者进行关联(匹配)?

2024-03-30 16:40:11 772

原创 【LV16 day1 自动mknod】

仅devfs,导致开发不方便以及一些功能难以支持:热插拔。

2024-03-30 16:11:26 738

原创 【LV15 day15 中断上半部和中断下半部】

起源:struct tasklet_struct{​ struct tasklet_struct *next;​ unsigned long state;​ atomic_t count;​ void (*func)(unsigned long);​ unsigned long data;};void tasklet_func(unsigned long data);6.4 调度tasklet三、按键驱动之tasklet版四、下半部机制之workqueue ----- 基于内

2024-03-29 17:51:01 256

原创 【LV15 day14 中断处理:按键驱动程序编写】

一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件。

2024-03-26 17:21:07 306

原创 【Day14 LED驱动设备树版】

减少垃圾代码减轻驱动开发工作量驱动代码和设备信息分离参考Open Fireware设计用来记录硬件平台中各种硬件设备的属性信息。

2024-03-21 16:44:18 875 1

原创 【内核内存管理、动态分配及IO访问、LED驱动】

内核将物理内存等分成N块4KB,称之为一页,每页都用一个struct page来表示,采用伙伴关系算法维护内核地址空间划分图:3G~3G+896M:低端内存,直接映射 虚拟地址 = 3G + 物理地址​ 细分为:ZONE_DMA、ZONE_NORMAL大于3G+896M:高端内存​ 细分为:vmalloc区、持久映射区、固定映射区。

2024-03-20 10:46:31 765

原创 【LV15 day10 信号量 互斥锁】

b.初始化信号量 void sema_init(struct semaphore *sem, int val);c.获得信号量P int down(struct semaphore *sem);c.释放互斥体 void mutex_unlock(struct mutex *lock);b.获取互斥体 void mutex_lock(struct mutex *lock);d.释放信号量V void up(struct semaphore *sem);

2024-03-12 17:03:38 176

原创 【lv15 day9 原子变量和自旋锁的应用】

e.操作并测试:运算后结果为0则返回真,否则返回假 int atomic_inc_and_test(atomic_t *v);原子变量:存取不可被打断的特殊整型变量 a.设置原子量的值 void atomic_set(atomic_t *v,int i);//原子变量增加i void atomic_sub(int i,atomic_t *v);

2024-03-11 20:42:56 1490

原创 【LV15 DAY8 多路复用及信号驱动】

static int hello_fasync(int fd, struct file *filp, int mode) //函数名初始化给struct file_operations的成员.fasync。当timeout不为NULL时,如超时设置为0,则select为非阻塞,超时设置 > 0,则无描述符可被操作的情况下阻塞指定长度的时间。void input_handler(int signum)//应用自己实现的信号处理函数,在此函数中完成读写。//将描述符设置给对应进程,好由描述符获知PID。

2024-03-09 17:45:48 1748

原创 【LV15 DAY7 阻塞和非阻塞】

init_waitqueue_head(wait_queue_head_t *pwq) //初始化等待队列头。返回:正常唤醒返回0,信号唤醒返回非0(此时读写操作函数应返回-ERESTARTSYS)​ open时由O_NONBLOCK指示read、write时是否阻塞。wait_queue_head_t //等待队列头数据类型。功能:条件不成立则让任务进入浅度睡眠,直到条件成立醒来。一、五种IO模型------读写外设数据的方式。非阻塞:不能操作就返回错误。驱动层:通过等待队列。

2024-03-09 15:48:18 370

原创 【stm32 外部中断】

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。

2024-03-09 14:45:45 293

原创 【LV15 DAY6 ioctl】

dir(direction),ioctl 命令访问模式(属性数据传输方向),占据 2 bit,可以为 _IOC_NONE、_IOC_READ、_IOC_WRITE、_IOC_READ | _IOC_WRITE,分别指示了四种访问模式:无数据、读数据、写数据、读写数据;type(device type),设备类型,占据 8 bit,在一些文献中翻译为 “幻数” 或者 “魔数”,可以为任意 char 型字符,例如 ‘a’、’b’、’c’ 等等,其主要作用是使 ioctl 命令有唯一的设备标识;

2024-03-07 19:12:46 802

原创 LV15 day5 字符设备驱动读写操作实现

ppos:对于需要位置指示器控制的设备操作有用,用来指示读取的起始位置,读完后也需要变更位置指示器的指示位置。ppos:对于需要位置指示器控制的设备操作有用,用来指示写入的起始位置,写完后也需要变更位置指示器的指示位置。filp:指向open产生的struct file类型的对象,表示本次write对应的那次open。filp:指向open产生的struct file类型的对象,表示本次read对应的那次open。pbuf:指向用户空间一块内存,用来保存被写的数据。在通过应用层app调用。

2024-03-07 17:01:42 410

原创 【LV14 day4 字符设备驱动基础框架】

应用层app系统调用open函数使用文件名,struct inode查询是否有该文件名的对象,若没有则创建,有则查询该设备的设备好devno对应的cdev对象,再通过cdev对象得到操作函数集fops,然后open函数创建struct file对象将操作函数集设置到该对象下面的成员f_ops里面,再把struc file对象填到描述符数组里面,得到文件描述符,同时调用驱动程序的drive_open函数,再通过system_open函数返回文件描述符给到应用层的open函数。

2024-03-01 16:23:01 611

原创 【LV15 day3 注册字符设备】

五、注册字符设备struct cdev{struct kobject kobj;//表示该类型实体是一种内核对象struct module *owner;//填THIS_MODULE,表示该字符设备从属于哪个内核模块const struct file_operations *ops;//指向空间存放着针对该设备的各种操作函数地址struct list_head list;//链表指针域dev_t dev;//设备号unsigned int count;//设备数量};自己定义的结构体中必须有

2024-02-29 20:36:08 698

原创 【LV14 day11 用户和内核空间】

实际内存操作时,需要将虚拟地址映射到实际内存的物理地址,然后才进行实际的内存读写。执行流:有开始有结束总体顺序执行的一段独立代码,又被称为代码上下文。三、模块编程与应用编程的比较。一、内核空间和用户空间。四、内核接口头文件查询。

2024-02-29 11:40:00 146

原创 【lv15 day1 设备号申请和注销】

mknod 设备文件名 设备种类(c为字符设备,b为块设备) 主设备号 次设备号 //ubuntu下需加sudo执行。分配成功后在/proc/devices 可以查看到申请到主设备号和对应的设备名,mknod时参数可以参考查到的此设备信息。name:/proc/devices文件中与该设备对应的名字,方便用户层查询主设备号。功能:手动分配设备号,先验证设备号是否被占用,如果没有则申请占用该设备号。功能:动态分配设备号,查询内核里未被占用的设备号,如果找到则占用该设备号。

2024-02-29 11:33:00 844

原创 【lv14 day10内核模块参数传递和依赖】

​ 既然内核模块的代码与其它内核代码共用统一的运行环境,也就是说模块只是存在形式上独立,运行上其实和内核其它源码是一个整体,它们隶属于同一个程序,因此一个模块或内核其它部分源码应该可以使用另一个模块的一些全局特性。bool bool insmod xxx.ko 变量名=0 或 1。perm:给对应文件 /sys/module/name/parameters/变量名 指定操作权限。传参方式 insmod xxx.ko 数组名=元素值0,元素值1,…

2024-02-26 20:02:19 346

原创 【LV14 day9内核模块编译】

4.对于静态加载的模块其本质是定义一个全局函数指针,并将其赋值为指定函数,链接时将地址放到特殊区段(.exitcall段),方便系统必要时统一调用,实际上该宏在静态加载时没有意义,因为静态编译的驱动无法卸载。类似于浏览器、eclipse这些软件的插件开发,Linux提供了一种可以向正在运行的内核中插入新的代码段、在代码段不需要继续运行时也可以从内核中移除的机制,这个可以被插入、移除的代码段被称为内核模块。其本质也是一个宏,宏体也是一个特殊链接标记,指示链接器在ko文件指定位置说明本模块源码遵循的许可证。

2024-02-26 20:01:10 1770

原创 【Linux内核模块加新功能 DAY6-8】

ko #此处为内核模块文件名,将内核模块插入正在执行的内核中运行 ----- 相当于安装插件。sudo rmmod?#,此处为插入内核后的模块名,此时将已被插入的内核模块从内核中移除 ----- 相当于卸载插件。insmod ./?.ko #将内核模块插入正在执行的内核中运行 ----- 相当于安装插件。即新功能源码与内核其它源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko。#将已被插入的内核模块从内核中移除 ----- 相当于卸载插件。

2024-02-22 20:59:35 251

原创 【linux内核调试及根文件系统】

linux内核分成两个部分一部分为逻辑代码放在uimage,另一部分硬件信息放在设备树。linux内核分成两个部分,一个是逻辑代码存于驱动代码,一个是硬件信息存于设备树。

2024-02-14 16:51:18 219

原创 【lv5-7】

首先将固化在IROM里面的BL0,对软硬件环境进行初始化,检测拨码开关状态,把SD卡的程序uboot搬到内存进行执行,uboot启动打印信息,倒计时结束进入到自启动模式执行bootcmd的命令,从服务器下载uimage,下载设备树文件,下载根文件系统,执行bootm,运行启动linux。在操作系统运行前的一小段代码,将软硬件环境初始化到一个合适的状态,为操作系统的加载和运行做好准备。bootload是启动程序的总称,嵌入式linux常用的bootloader就是uboot。->引导加载linux内核。

2024-02-08 21:32:53 166

转载 【LV12 DAY24 IIC】

IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。PS:这里要注意IIC是为了与低速设备通信而发明的,所以IIC的传输速率比不上SPI。

2024-01-23 16:50:15 27

原创 1.GPIO输出

开漏模式:P-MOS无效,只有N-MOS在工作,当数据寄存器为1时,下管断开,输出相当于断开,此时是高阻模式,数据寄存器位0时,下管导通,输出直接接到VSS,输出低电平,只有低电平有驱动能力,高电平是没有驱动能力的;上面的是PNP三极管驱动电路,三极管的左边是基极,带箭头的是发射极,剩下的是集电极,左边的基极给低电平三极管就会导通,此时蜂鸣器工作;下面的是NPN三极管驱动电路,三极管的左边是基极,带箭头的是发射极,剩下的是集电极,它的驱动逻辑跟上面的是相反的,基极给高电平导通,基极给低电平截止。

2024-01-21 16:22:43 355

原创 【LV12 DAY21 PWM实验】

通过对脉冲宽度的调制,来获得所需要的波形。PWM控制—脉冲宽度调制。

2024-01-16 15:56:21 355

原创 【LV12 DAY20 RTC实验】

电压在0mv~500mv时,LED2闪烁,且每隔一秒钟向终端打印一次当前的电压值及当前的时间。电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮。电压在1001mv~1500mv时,LED2、LED3、LED4点亮。编程实现通过LED状态显示当前电压范围,并打印产生低压警报时的时间。电压在501mv~1000mv时,LED2、LED3点亮。

2024-01-15 21:24:32 701

原创 【LV12 DAY9 ADC实验】

电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮。电压在1001mv~1500mv时,LED2、LED3、LED4点亮。电压在501mv~1000mv时,LED2、LED3点亮。电压在0mv~500mv时,LED2闪烁。

2024-01-15 19:36:45 328

原创 【LV12 DAY17-18 中断处理】

GPX1_1是外部中断9 EINT9。所以需要进行人为修正lr的地址。查询可知其中断ID是57。//iqr异常处理程序。

2024-01-14 17:43:58 447

原创 【LV13 DAY16 轮询与中断】

【代码】【LV13 DAY16 轮询与中断】

2024-01-13 10:46:54 372

原创 【LV12 DAY15 WDT】

看门狗定时器,其主要作用是发生软件故障时可产生复位信号使SOC复位,其本质上是一个计数器。时间计数一次所用的时间。1.可以产生中断信号。2.可以产生复位信号。

2024-01-12 10:30:58 359

原创 【LV12 DAY14 UART 串口通信】

通用异步收发器,是一种通用的串行,异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。一次只能发送一个字节,串口通信不能累计发送,避免累积误差(例如1s发送1,接收方看到的是0.9s,依次10s即有1位的偏差)。波特率用于描述UART通信时的通信速度,其单位bps是指每秒传输的bit的数量。在终端上输入‘2’,LED2点亮,再次输入‘2’,LED2熄灭…3.DMA模式,串口直接把数据放入缓冲区,不需要CPU访问。UART–(一种通信协议)

2024-01-11 15:40:50 408

原创 【LV12 DAY12-13 GPIO & C 语言与寄存器封装】

第28-32位控制GPX2_7是输入/输出模式,不能控制发出的是高电平还是低电平。芯片的引脚和外部设备相连从而实现与外部硬件的通讯,控制,信号采集的功能。控制CHG_COK引脚输出为高电平,LED亮,输出为低电平,LED熄灭。通用型输入输出,GPIO可以控制连接在其引脚实现信号的输入和输出。也就是说第7位设置为1,那么GPX2_7引脚输出即为1高电平。查找CHG_COK引脚由GPX2_7控制器控制。当配置为输出端口时,引脚状态应该与相应的位相同。接着查询怎么控制GPX2_7寄存器。使用C语言控制寄存器。

2024-01-10 17:09:08 435

原创 【LV12 DAY11 硬件控制原理】

CPU通过读写控制器的寄存器从而达到控制硬件的目的。

2024-01-08 11:50:43 330

原创 【LV12 DAY10 伪操作与混合编程】

.align 2 -----对齐的伪操作,告诉编译器后续的代码2的2次方对齐,如果没有该操作编译器会报错,因为每一条指令应该从4的倍数地址开始。声明symbol为全局变量,在其他.s文件中可以说直接使用。@BL FUNC_C --FUNC_C定义在.C文件中。声明symbo为局部变量,仅能在此.s文件中使用。不会生成代码,只是告诉编译器在编译阶段怎么编译。@在当前地址申请一个字节的空间并将其初始化。@在当前地址申请任意字节的空间并将其初始化。@在当前地址申请一个字的空间并将其初始化。

2024-01-06 10:58:44 318

原创 【LV12 Day9 专用指令】

{R1,R2,PC}^ @出栈,小三角实现SPSR的值复制给CPSR。软中断跳转到异常向量表后不能直接写中断程序,要写一条跳转指令跳转到处理程序。LDR R1,0X12345678 @可以将任意一个32位数据放入寄存器。MRC 将协处理器中寄存器的数据传送到ARM处理器中的寄存器。MCR 将ARM处理器中寄存器的数据传送到协处理器中的寄存器。LDC 将存储器中的数据读取到协处理器中。@将STOP的地址中的内容写入R1寄存器。STC 将协处理器中的数据存储到存储器。@将STOP的地址写入R1寄存器。

2024-01-04 21:16:34 315

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除