自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 18. FrameBuffer 应用编程

FrameBuffer 就是帧缓冲,也就是一块内存,里面保存着一帧图像。是 Linux 系统中的一种显示驱动接口,它将显示设备进行抽象,屏蔽了不同显示设备硬件的实现,对应用层抽象为一块显示内存,允许上层应用程序直接对显示缓冲区进行读写操作,用户不必关系物理显存的位置等具体细节,这些由 FrameBuffer 设备驱动完成。对应的设备文件为 /dev/fdX,Linux 最多有 32 个。

2024-01-31 11:52:14 1105

原创 17. 使用 tslib 库

tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库,并且是开源。tslib 为触摸屏驱动和应用层之间的适配层, 它把应用程序中读取触摸屏 struct input_event 类型数据(这是输入设备上报给应用层的原始数据)并进行解析的操作过程进行了封装,向使用者提供了封装好的 API 接口。tslib 从触摸屏中获得原始的坐标数据, 并通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的触摸屏坐标转换为相应的屏幕坐标。bin: 一些 tslib 提供的小工具,用于测试触摸屏。

2024-01-29 22:19:47 1252

原创 16. 输入设备应用编程

常见的输入设备有鼠标、键盘、触摸屏、遥控器等,用户通过输入设备与系统进行交互。

2024-01-29 21:18:25 1088

原创 15. GPIO 应用编程

调用 poll 监视文件描述符上的 IO 状态变化,POLLPRI 表示有高优先级数据可读取,中断就是一种高优先级事件。这个代码就是需要将引脚配置为输入模式,并且是非中断模式。GPIO 也是通过 sysfs 方式进行操控的,在。

2024-01-26 18:20:58 726

原创 14.点亮 LED 灯

dev/目录下的设备文件(设备节点)/sys/目录下的属性文件具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些设备只能通过 sysfs 方式进行操控;当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED、 GPIO 等。

2024-01-25 21:20:31 734

原创 13. 高级IO

对于这个问题的答案,我们首先需要了解到,对于 mmap()函数来说,当文件成功被映射到内存区域时,这段内存区域(映射区)的大小通常是页大小的整数倍,即使参数 length并不是页大小的整数倍。另外,文件映射的内存区域的大小必须是系统页大小的整数倍,譬如映射文件的大小为 96 字节,假定系统页大小为 4096 字节,那么剩余的 4000 字节全部填充为 0,虽然可以通过映射地址访问剩余的这些字节数据,但不能在映射文件中反应出来,由此可知,使用存储映射 I/O 在进行大数据量操作时比较有效;

2024-01-25 16:47:14 791

原创 12.线程同步

线程局部存储在定义全局或静态变量时,使用 __thread 修饰变量,此时,每个线程都会拥有一份对该变量的拷贝,线程局部存储中的变量将一直存在,直到线程终止,届时会自动释放这一存储。如果解锁时有一个以上的线程阻塞,那么这些被阻塞的线程就会被唤醒,都会尝试对互斥锁进行加锁,加锁成功后,其他线程进行阻塞等待。也称为线程私有数据,就是为每个调用线程分别维护一份变量的副本,每个线程通过特有数据键(key)访问时,这个特有数据键都会获取到本线程绑定的变量副本,这样就可以避免变量成为多个线程间的共享数据。

2024-01-20 22:36:30 988 1

原创 11. 线程

线程是参与系统调度的最小单位,它被包含在进程之中,是进程中的实际运行单位。一个线程指的是进程中的一个单一顺序的控制流,或者说是执行流,一个进程中可以创建多个线程,多个线程实现并发运行,每个线程执行不同的任务。

2024-01-05 21:34:45 939

原创 10. 进程间通信

信号量是一个计数器,与其它进程间通信方式不太相同,它主要用于控制多个进程或一个进程内的多个线程间对共享资源的访问,相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志,除了用于共享资源的访问控制外,还可以用于进程同步。消息队列是 UNIX 下不同进程之间实现共享资源的一种机制,UNIX 允许不同进程将格式化的数据流以消息队列形式发送给任意进程,有足够权限的进程可以向队列种添加信息,被赋予读权限的进程则可以读走队列中的消息。

2024-01-02 17:49:09 825

原创 9. 进程

如果忽略这个信号,终端退出时,进程不会退出。而进程是一个动态的概念,它是程序的一次运行过程,当应用程序被加载到内存中运行后,就被称为了一个进程,程序运行结束后,进程就会终止,这就是一个进程的生命周期。也需要通过一个特定的文件来实现,当程序启动后,首先打开该文件,以 O_WRONLY|O_CREAT,当文件不存在就创建,然后尝试去获取文件锁,若是成功,则将程序的进程号写入到该文件中,写入后不要关闭或解锁,保证进程一直持有该文件锁,若是获取锁失败,代表程序已经被运行,则退出本次启动。

2023-12-30 18:08:20 844

原创 8. 信号基础

函数会将 mask 所指向的信号集来替换进程的信号掩码,也就是将进程的信号掩码设置为参数 mask 所指向的信号集,然后挂起进程,直到捕捉到信号被唤醒,如果捕捉的信号是 mask 中的,就不会被唤醒,继续等待。内核为每个进程都维护了一个信号掩码,其实就是一个信号集,即一组信号。如果进程当前正在执行信号处理函数,在处理信号期间接收到了新的信号,如果该信号是信号掩码中的成员,就会被阻塞,将该信号添加到等待信号集中,为了确定进程中处于等待状态的是哪些信号,可以使用sigpending()函数获取。

2023-12-07 16:01:31 864

原创 7. 系统信息与系统资源

是一个虚拟文件系统,它以文件系统的方式为应用层访问系统内核数据提供了接口,用户和应用程序可以通过 proc 文件系统得到系统信息和进程相关信息,对 proc 文件系统的读写作为与内核进行通信的一种手段。内核定义的一个全局变量,使用该变量来记录系统从启动以来的系统节拍数,所以这个变量用来记录以系统节拍时间为单位的时间长度,Linux 内核在编译配置时定义了一个节拍时间,使用节拍率(一秒钟多少个节拍数)来表示,譬如节拍率为 200Hz,就表示一秒钟 200 个节拍,节拍时间为 1s/200。

2023-12-04 22:35:17 112

原创 6. 字符串处理

dest 结尾的 \0 会被覆盖,src 末尾的 \0 会保留。将 c 对应的一个字符输出到标准输出设备中,可以是一个字符,也可以是 0 ~ 127 中的一个数字,会自动将其转换为对应的字符。在计算字符串长度时,结束字符不会计算在内,但是在计算字符串大小的时候,结束字符 ‘\0’ 会计算在内。拷贝函数会覆盖原有的内容,但是如果 dest 的字符个数大于 src 的话,多的内容会保留。两者的不同是,该函数是从字符串的末尾开始查找,返回从前往后的最后一次出现的位置。输出一个指定的字符,但是可以指定输出文件。

2023-12-02 15:52:07 57

原创 5. 文件属性和目录

rename()调用仅操作目录条目,而不移动文件数据(不改变文件 inode 编号、不移动文件数据块中存储的内容),重命名既不影响指向该文件的其它硬链接,也不影响已经打开该文件的进程(譬如,在重命名之前该文件已被其它进程打开了,而且还未被关闭)。只有超级用户进程才能更改文件的用户ID和组ID,普通用户可以将文件的组ID修改为其所从属的任意附属组ID,前提是该进程的有效用户ID 等于文件的用户ID。目录文件是一种特殊文件,不适合使用前面介绍的文件 IO 操作,Linux 中有专门的对目录文件操作的函数。

2023-11-30 18:21:59 96

原创 4. 标准 IO 库

标准 IO 库指的式标准 C 库中用于文件 IO 操作相关的一系列库函数的集合,底层是用系统 IO 实现的。但是标准 IO 比系统 IO 具有更好的可移植性,因为不同的操作系统内核提供的系统调用都是不一样的;其次标准 IO 具有更高的效率,因为标准 IO 提供了自己的缓冲区,但是系统 IO 不具备缓冲区。

2023-11-26 21:42:00 152

原创 3. 深入探究文件 IO

当两个独立的进程对同一个文件进行操作时,因为此时文件是共享的,如果当一个进程的操作未完成时,另一个进程就对文件进行操作就会发生竞争冒险。该结构体中有一个指针指向了文件描述符表,而文件描述符表中的每一个元素对应文件表,文件表存放着文件的相关信息。在 Linux 系统中,open 得到的文件描述符可以进行复制,新的文件描述符也可以对旧文件描述符指向的文件进行操作,拥有相同的权限。不同的文件描述符就对应不同的文件表,而位置偏移量就保存在文件表中,但是文件表中的 inode 指针指向的都是同一个 inode。

2023-11-25 16:34:48 85

原创 2. 文件 IO 基础

对于每个打开的文件,系统都会记录它的续写位置偏移量,当调用 read 和 write 函数时,就会从当前偏移位置开始读写。(文件当前位置),offset 可以为正或负;返回值:成功返回当前位置,失败返回 -1。(文件头部),offset 只能为正;(文件末尾),offset 可为正或负。相对偏移的参考值,可以是。偏移量,以字节为单位。

2023-11-24 15:45:12 56

原创 1. 应用编程概念

没有操作系统支持的编程环境称为裸机编程,比如单片机,直接在硬件上运行的程序;驱动编程指的是基于内核驱动框架开发驱动程序,通过调用 Linux 内核提供的接口完成设备驱动的注册,驱动程序负责底层硬件操作相关逻辑;而应用编程在应用程序中通过系统调用接口完成应用程序的功能和逻辑。系统调用其实是 Linux 内核提供给应用层的应用编程接口,是 Linux 应用层进入内核的入口。用户通过系统调用来使用系统提供的各种服务,实现了与内核的交互。

2023-11-24 15:03:32 175

原创 14. UART串口通信

兼容 TIA/EIA-232F标准,速度最高可达 5Mbit/s支持串行 IR 接口,兼容 IrDA,最高可达115.2Kbit/s支持 9 位或者多节点模式1 或 2 位停止位可编程的奇偶检验自动波特率检查,最高支持 115.2 Kbit/s这里只用到最基本的串口功能。

2023-11-21 21:57:47 275

原创 13. 高精度延时

GPT 定时器是一个 32 位向上定时器,也就是从0x00000000 开始向上递增计数,GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的时候就会发生比较时间,产生比较中断。一个可选时钟源的 32 位向上计数,本次选择 ipg_clk = 66MHz两个输入捕获通道,可以设置触发方式三个输出比较通道,可以设置输出模式可以生成捕获中断、比较中断和溢出中断计数器可以运行在重新启动(restart)或自由运行(free-run) 模式。

2023-11-11 17:34:43 359

原创 12. 定时器按键消抖

使用延时函数消抖会浪费 CPU 性能,因为延时函数就是空跑。如果按键是使用中断的方式实现的,就更不能在中断服务函数中使用延时函数,因为中断服务函数最基本的要求就是快进快出。所以可以使用定时器设置好时间,就可以去跑其他的进程,当时间到了,就会触发中断,然后在中断函数中做相应的处理。需要在图中t1 ~ t3 这个时间段消抖。设置按键为下降沿触发,因此会在t1、t2和t3这3个时刻会触发按键中断,每次进入中断处理函数都会重新开启定时器中断。

2023-11-11 16:56:39 577

原创 11. EPIC定时器

EPIT定时器是增强的周期中断定时器,主要是完成周期性中断定时。EPIT是一个 32 位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能后EPIT就会开始运行。时钟源可选的 32 位向下计数器12 位的分频值当计数值和比较值相等的时候产生中断。

2023-11-11 16:29:11 404

原创 10. GPIO中断

主要工作:全局中断使能控制、控制每一个中断的使能或关闭、设置每个中断的优先级、设置每个中断的目标处理器列表、设置每个外部中断的触发模式(电平触发或边沿触发)、设置每个中断属于组0还是组1。某个中断 ID 的中断优先级是由寄存器 D_IPRIORITYR 来设置的,一共有512个,如果优先级个数为32,使用寄存器 bit7:4 来设置,也就是实际的优先级要左移 3 位。不同的中断源对应不同的中断处理函数,IMX6U有160个中断源,可以将这些中断处理函数放在一个数组中,对应的下标就是中断号。

2023-11-10 21:24:32 482

原创 08. 按键输入

对于32位SOC来说,一般是以4字节访问的,因此会从0x87800288开始清除bss段,但是该地址不属于bss段,所以会出问题,也就需要我们进行内存对齐,即__bss_start=0x8780028c。就是在__bss_start之前进行. = ALIGN(4);默认情况下,KEY0为高,当按下KEY0后,UART1_CTS为低电平。修改TARGET为key,INCDIRS和SRCDIRS中追加gpio和key的路径。makefile文件。

2023-10-29 16:23:10 264

原创 07. 蜂鸣器

此处为PNP型三极管,BEEP为低的时候三极管才会导通,也就是BEEP=0时,蜂鸣器会叫。BEEP是通过SNVS_TAMPER1这个IO控制的。将前面的bsp、imx6ul、obj和project拷贝过来。makefile文件中只需要添加。

2023-10-29 14:32:48 109

原创 06. BSP工程管理实验

bsp用来存放驱动文件,imx6ul用来存放和芯片有关的文件,obj用来存放编译生成的.o 文件,project 用来存放start.s 和 main.c 文件,也就是应用文件。新建 bsp_delay.h 和 bsp_delay.c 两个文件,将这两个文件存放到 bsp/delay 中。新建 bsp_clk.h 和 bsp_clk.c 两个文件,将这两个文件存放到 bsp/clk 中。新建bsp_led.h 和bsp_led.c 文件,放在bsp/led中。此文件放在imx6ul中。

2023-10-28 19:31:44 101

原创 09. 主频和时钟配置

左边的 CLOCK_SWITCHER 就是我们上一小节讲解的那 7 路 PLL 和8 路 PFD,右边的 SYSTEM CLOCKS 就是芯片外设,中间的 CLOCK ROOT GENERATOR 给左边和右边进行牵线搭桥。就负责从7路PLL和8路PFD中选择合适的时钟源给外设用,具体操作就是配置相关寄存器以ESAI为例,ESAI的时钟图第一部分是时钟源选择器,ESAI有4个可选时钟源:PLL4、PLL5、PLL_PFD2和PLL3_SW_CLK。

2023-10-26 22:59:28 248

原创 05. NXP官方SDK使用实验

【代码】05. NXP官方SDK使用实验。

2023-10-17 22:38:18 306

原创 04. 模仿stm32驱动开发

使用结构体将外设的所有寄存器都放到了一起,将这个结构体抽象为外设。头文件imx6u.h。

2023-10-17 22:28:57 351

原创 03. C语言编写LED

链接脚本就是编写一系列的命令,每个命令是一个带有参数的关键字或者对一个符号的赋值。我们一般编译出来的代码都包含在text、data、bss和rodata这四个段内。链接脚本主要用于链接,描述文件应该如何被链接在一起形成最终的可执行文件。用来描述输入文件中的段如何被映射到输出文件中,并且控制输出文件中的内存排布。然后将上述的makefile文件的链接脚本由。配置环境start.s。makefile文件。

2023-10-17 19:10:29 356

原创 02. IMX启动方式

内部boot ROM为了加快执行速度会打开MMU和cache,下载镜像时 L1 ICache 会打开,验证镜像的时候 L1 DCache、 L2 Cache 和 MMU 都会打开。首先,将CCGR0~CCGR6全部写为0xFFFFFFFF,表示打开所有外设时钟,然后就是DDR初始化参数,设置DDR控制器,也就是初始化DDR。10时,表示芯片会执行内部的boot ROM代码,这段代码会进行硬件初始化,然后从boot设备(就是存放代码的设备,如SD)中将代码拷贝到指定的RAM中,一般是DDR。

2023-10-17 18:46:21 132

原创 01. 汇编LED驱动实验

I.MX6UL中的寄存器就是RAM类型的,我们用汇编来配置时许哟啊借助寄存器访问指令,一般先要将要配置的值写入到Rx(x=0~12)寄存器中,然后借助存储器访问指令将Rx中的数据写入到I.MX6UL寄存器中,读取也是一样的。** bit16:** 使能迟滞比较器,当IO作为输入功能的时候有效,如果需要对输入波形进行整形就可以使能该位,0表示禁止,1表示使能。所以,当处理完中断后,应该清除中断标志位。此寄存器是边沿选择寄存器,用来设置边沿中断,会覆盖ICR1和ICR2的设置,如果被设置为1,就是双边沿中断。

2023-10-16 21:34:42 732

原创 十五、红外遥控器

空闲状态:红外LED不亮,接收头输出高电平发送低电平:红外LED以38KHz闪烁,接收头输出低电平发送高电平:红外LED不亮,接收头输出高电平。

2023-09-23 17:45:59 301

原创 十四、AD&DA数模转换

AD:模数转换,将模拟信号转换为计算机可操作的数字信号DA:数模转换,将数字信号转换为模拟信号时序。

2023-09-23 17:07:43 156

原创 十三、直流电机驱动

PWMPWM是脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,等效的获取需要的模拟参量,常应用于电机控速、开关电源等领域。通过改变一个周期信号的占空比,来控制输出电平的平均值。越高的占空比提供的功率越大。占空比=高电平和低电平所占时间之比产生PWM方法。

2023-09-23 15:06:15 111

原创 十二、LCD1602

引脚和应用电路时许结构。

2023-09-21 13:44:36 64

原创 十一、DS18B20温度传感器

单总线时序结构初始化:主机将总线拉低至少480us,然后释放总线,等待15~ 60us后,存在的从机会拉低总线60~240us以相应主机,之后从机将释放总线发送一位:主机将总线拉低60~ 120us,然后释放总线,表示发送0;主机将总线拉低1~ 15us,然后释放总线,表示发送1。从机将在总线拉低30us后,读取电平,整个时间片应大于60us。

2023-09-20 21:03:27 65

原创 十、AT24C02

AT24C02是一种可以实现掉电不丢失的存储器,可以保存单片机运行时想要永久保存的数据信息,是通过I2C总线,容量是256字节有SCL和SDA两根通信线,是同步、半双工、带数据应答的,通过该总线,可以使各种设备的通信标准统一电路规范所有的I2C设备的SCL连在一起,SDA连在一起 ,设备的SCL和SDA要配置为开漏输出模式,并且要各添加一个上拉电阻,阻值一般为4.7k,这样做可以解决多机通信互相干扰的问题时序结构。

2023-09-20 18:58:04 98

原创 九、蜂鸣器

音符频率对照表。

2023-09-19 13:33:16 202

原创 八、实时时钟

引脚定义和应用电路我们的开发板没有备用电池寄存器定义时序定义在时钟的上升沿,IO口的数据被写入到芯片中,在下降沿,芯片就会将数据输出。如果是写入,那么在整个过程中,都是向芯片写入数据。

2023-09-18 21:01:55 449

空空如也

空空如也

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

TA关注的人

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