- 博客(31)
- 收藏
- 关注
原创 Verilog中的编译指令
(1)用来定义参数,功能和parameter类似(2)定义一个名为name的变量,编译的时候将statements的内容包含进来,与条件生成语句类似若使用“或门”,则。
2024-09-03 20:32:17
293
原创 FreeRTOS(二)
假如使用全局变量,在任务1中,当执行到第二步时,目前r0的数据还没写入a中,被更高优先级的任务2打断,任务2执行了全部过程,此时a=1,再切换为执行任务一,然后r0=1赋给a,这样会造成数据的浪费。在任务A写队列的时候,关中断了,首先中断函数不能打断,其他任务也没办法执行,没办法进行任务调度,因为任务调度是由PendSV引起的,PendSV中断优先级是最低的,在这里中断关掉了,PendSV不可能触发,所以任务A在写的时候,任务B是没办法打断的,在队列中可以存储数量有限、大小固定的数据。
2024-08-30 10:43:27
927
原创 FreeRTOS(一)
/初始化列表//初始化列表项//列表末尾插入列表项//列表插入列表项//列表移除列表项参考文档:《FreeRTOS开发指南》第七章–“FreeRTOS列表和列表项”。列表项的插入:将列表项插入列表中,按照升序的方式。函数vListInsertEnd();是将待插入的列表项插入到列表pxIndex指针指向的列表项前面;无序的插入方法!
2024-08-30 10:43:01
1054
原创 I.MX6U嵌入式Linux Platform设备驱动开发(6)I2C驱动
裸机驱动AP3216C:需要写2部分的驱动:(1)I2C主机驱动:bsp_i2c.c 和 bsp_i2c.h -------> I.MX6U的接口驱动(2)I2C设备驱动:bsp_ap3216c.c 和 bsp_ap3216c.h-------> AP3216C 这个 I2C 设备驱动文件。这个正好符合 Linux 的驱动分离与分层的思想,因此 Linux内核也将 I2C 驱动分为两部分:(1)I2C总线驱动:就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动;
2024-08-30 10:34:30
456
原创 I.MX6U嵌入式Linux Platform设备驱动开发(5)RTC驱动
RTC 设备驱动是一个标准的,应用程序通过 open、release、read、write 和 ioctl等函数完成对 RTC 设备的操作。Linux 内核将 RTC 设备抽象为 rtc_device 结构体,因此 RTC 设备驱动就是申请并初始化rtc_device,最后将 rtc_device 注册到 Linux 内核里面。用一个操作集合(结构体:rtc_device)来表示RTC 设备的操作,此结构体定义在 include/linux/rtc.h 文件中。
2024-08-30 10:33:35
925
原创 I.MX6U嵌入式Linux Platform设备驱动开发(3)INPUT子系统
和 pinctrl、gpio 子系统一样,都是 Linux 内核针对某一类设备而创建的框架。input核心层会帮我们注册input字符设备驱动。既然内核已经帮我们写好了input驱动,那我们要干啥呢?需要我们去完善具体的输入设备,完善输入设备的时候就要按照input子系统驱动框架的要求来。input 核心层会向 Linux 内核注册一个字符设备,大家找到 drivers/input/input.c 这个文件,input.c 就是 input 输入子系统的核心层。
2024-08-30 10:30:54
349
原创 I.MX6U嵌入式Linux Platform设备驱动开发(2)自带LED和杂项驱动
所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建。需要向 Linux 注册一个 miscdevice 设备,miscdevice是一个结构体,定义在文件 include/linux/miscdevice.h 中。在miscdevice这个结构体中,定义一个 MISC 设备,以后我们需要设置 minor、name 和 fops 这三个成员变量。
2024-08-30 10:25:35
1120
原创 I.MX6U嵌入式Linux Platform设备驱动开发(1)初识驱动
需要写两部分:platform_driver, platform_device.打开leddevice.c文件,保留头文件,剩余的全删了。
2024-08-30 10:23:43
815
原创 I.MX6U嵌入式Linux驱动开发(13)异步通知实验
Linux 提供了异步通知这个机制来完成:驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序在从驱动程序中读取或写入数据。阻塞非阻塞与异步通知的区别:阻塞/非阻塞:需要应用程序主动的去查询设备的使用情况。通过阻塞方式访问的话应用程序会处于休眠态,等待驱动设备可以使用,非阻塞方式的话会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。异步通知:通过主动向应用程序发送信号的方式来报告自己可以访问了,应用程序获取到信号以后就可以从驱动设备中读取或者写入数据了。
2024-07-24 22:30:22
763
原创 I.MX6U嵌入式Linux驱动开发(12)阻塞与非阻塞IO
阻塞:当资源不可用的时候,应用程序就会挂起。当资源可用的时候,唤醒任务。应用程序使用open打开驱动文件,默认是阻塞方式打开。非阻塞:当资源不可用的时候,应用程序轮询查看,或放弃。会有超时处理机制。应用程序在使用open打开驱动文件的时候,使用O_NONBLOCK。在Ubuntu中输入:man 2 open 可以查询open的用法。
2024-07-24 22:29:01
1033
原创 I.MX6U嵌入式Linux驱动开发(11)Linux中断实验
(1)先知道你要使用的中断对应的中断号。(2)再申请request_irq,此函数会激活中断。(3)如果不用中断了,那就释放掉,使用free_irq。(4)中断处理函数irqreturn_t (*irq_handler_t) (int, void *)。(5)使能和禁止中断。
2024-07-24 22:28:28
572
原创 I.MX6U嵌入式Linux驱动开发(10)内核定时器
HZ表示系统节拍率。采用 100Hz 的节拍率,时间精度就是 10ms,采用1000Hz 的话时间精度就是 1ms,精度提高了 10 倍。高节拍率会导致中断的产生更加频繁,频繁的中断会加剧系统的负担,1000Hz 和 100Hz的系统节拍率相比,系统要花费 10 倍的“精力”去处理中断。Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数。
2024-07-24 22:26:57
774
原创 I.MX6U嵌入式Linux驱动开发(9)按键输入
先找到节点,再获取GPIO(of_get_named_gpio),GPIO的属性是:key-gpios,参数里面的索引是0,这个0是指第一条,1是指第2条,2是指第3条。请求这个GPIO,请求成功的话,设置为输入。应用程序读,最终体现到内核里面就是key_read()这个函数,,读的话,得有一个按键存放它的值,按键值是全局的,我们在key_dev结构体里面添加。在调用key_read()函数的时候,肯定读取按键值,看原理图,没有按下去的时候,key0是高电平,如果读取的为0,说明读取到了,按下去了。
2024-07-24 22:24:41
384
原创 I.MX6U嵌入式Linux驱动开发(5)pintcl和gpio子系统实验
打开芯片参考手册,找到iomux,Linux内核源码,打开imxull.dtsi,搜索iomux有3个寄存器地址:IOMUXC SNVS寄存器、IOMUXC控制器、gpr控制器。打开板子对应的设备树文件,imx6ull-alientek-emmc.dts,搜索iomux。
2024-07-24 22:20:39
915
原创 I.MX6U嵌入式Linux驱动开发(4)设备树下led驱动实验
属性#address-cells 和#size-cells 都为 1,表示 reg 属性中起始地址占用一个字长(cell),地址长度也占用一个字长(cell)。获取设备树属性内容,使用函数of_find_node_by_path(),返回值保存到nd中。打开灯、关灯,这两种操作在dtsled字符设备操作集合中实现,在open、release中设置一下私有数据,重点是write函数中,实现对灯的控制。使用vscode打开5_dtsled,修改Makefile文件,将其修改为:dtsled.o。
2024-07-24 22:18:34
434
原创 I.MX6U嵌入式Linux驱动开发(4)设备树
在裸机驱动程序里,比如W25QXX、SPI,速度都是在.c文件中写死的,板级信息都写到.c文件中,导致linux内核臃肿。因此 将板子信息做成独立的格式,文件扩展名为.dts。一个平台或者机器对应一个.dts。一般.dts 描述板级信息(也就是开发板上有哪些 IIC 设备、SPI 设备等),.dtsi 描述 SOC 级信息(也就是 SOC 有几个 CPU、主频是多少、各个外设控制器信息等)。
2024-07-24 22:15:18
1766
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人