- 博客(203)
- 收藏
- 关注
原创 嵌入式Linux驱动--并发与竞争
原子操作中的“原子”指的是化学反应中最小的微粒。CPU在工作时间内会依次开始执行任务一和任务二,但由于CPU的处理速度很快,它可以交替地执行这两个任务,使得它们看起来像是同时进行的。在实际的操作中,CPU可能会因为各种原因而暂停当前任务的执行,转而去执行其他任务,这被称为“上下文切换”。在操作系统中,自旋锁通过“原地等待”的方式来处理资源竞争,但这种方式可能会浪费CPU资源,尤其是在需要长时间等待的情况下。这种机制提高了系统的效率,因为它减少了不必要的资源消耗,并在多个任务间提供了更好的协作方式。
2025-01-22 14:39:30
1012
原创 嵌入式Linux驱动--字符设备驱动基础
在Linux系统中,每个字符设备和块设备都通过设备号进行管理,该设备号由和成。主设备号用于标识设备所属的驱动类别,例如USB驱动下的鼠标和键盘;而次设备号则具体标识该类别下的某个设备实例,如特定编号的鼠标或键盘。在开发字符驱动程序的过程中,首先需要申请设备号,因为只有成功申请到设备号后,才能进一步注册相应的设备。在Linux系统中,设备号使用名为的数据类型表示,该类型在include/linux/types.h文件中定义。dev_t被定义为u32类型,即无符号32位整数。
2025-01-21 14:29:57
747
原创 嵌入式Linux驱动--驱动基础篇
什么是驱动?驱动程序扮演着底层硬件与上层软件之间的桥梁角色,它负责将操作系统的通用指令转换成硬件能够理解的特定命令,确保硬件设备能够正确响应并执行相应的操作,从而实现软件与硬件之间的顺畅沟通和协同工作。驱动可以简单分为两种,一种是无操作系统的驱动,一种是有操作系统的驱动。比如用单片机进行简单的通断控制,从编程角度来说,直接控制寄存器就可以了,也就是直接和硬件打交道,这种属于无操作系统的驱动。有了操作系统以后,编写驱动就变的比较复杂,要基于Lnux的各种驱动框架进行编程。但是当驱动都按照系统
2025-01-07 13:39:07
946
原创 TSN:工业通信的未来
AVB(Audio Video Bridging,音视频桥接)技术是一种基于以太网的标准,旨在提高音视频数据在局域网中的传输质量和可靠性。这项技术主要应用于实时音视频传输,特别是在汽车多媒体系统和专业音频视频领域,属于TSN协议的前身,AVB协议和TSN都属于数据链路层的协议族。时间敏感网络(TSN)是一组旨在提高以太网性能的标准集合,特别是在需要高确定性的应用场景中。TSN的核心目标包括实现精确的时间同步、减少延迟以及提高网络的可用性和可靠性。
2024-12-31 17:17:37
691
1
原创 多任务互斥及队列
一.互斥的引入在FreeRTOS中,互斥(Mutex)是一种用于保护共享资源的机制。互斥锁可以确保同一时间只有一个任务能够访问共享资源,从而避免了竞态条件和数据不一致的问题。需要注意的是,获取互斥锁是一种阻塞操作,即如果互斥锁当前不可用,任务将被阻塞,直到互斥锁可用。互斥锁的获取和释放应该成对出现,确保正确的同步和保护共享资源。互斥锁的应用可确保共享资源的访问是原子性的,避免了多个任务同时访问共享资源导致的数据不一致和竞争问题。
2024-02-21 22:23:06
1673
2
原创 单片机和RTOS
一段代码+运行位置+运行环境在计算机科学中,任务(Task)指的是一个需要计算机系统执行的工作单元或操作。任务可以是一个指令序列、函数、进程、线程或任何需要计算机执行的可定义的工作。任务是计算机系统中的基本单位,通过将大型任务分解为更小的子任务,可以简化系统的设计和管理。每个任务通常有特定的输入、处理逻辑和输出。任务可以并行执行(在多个处理器或核心上同时执行)或顺序执行(按照特定的顺序依次执行)。在操作系统中,任务通常是指进程或线程,它们是并发执行的实体。每个任务都有自己的代码、数据和运行环境。
2024-02-19 19:31:58
3937
1
原创 STM32的SDIO
SDIO,全称Secure Digital Input/Output,是一种用于在移动设备和嵌入式系统中实现输入/输出功能的接口标准。它结合了SD卡的存储功能和I/O功能,允许设备通过SD卡槽进行数据输入输出和外围设备连接。SDIO接口通常被用于连接各种外部设备,例如无线网卡、蓝牙模块、GPS接收器、摄像头、声卡等,以扩展移动设备和嵌入式系统的功能。通过SDIO接口,这些外部设备可以直接与主设备进行数据交换和通信。
2024-02-19 18:51:01
1686
原创 FATFA文件系统
文件系统提供了一种结构化的方式来组织文件和目录,使用户可以根据自己的需求创建、修改、复制、移动和删除文件。总体而言,FATFS在嵌入式系统和移动设备中得到广泛应用,因其简单性、兼容性和轻量级的特点,适用于一些对文件系统需求相对简单的场景。不同的操作系统或文件系统可能具有不同的实现方式和特性,但它们都提供了类似的概念和功能,用于管理和操作计算机上的文件和目录。路径:路径是用于指定文件或目录位置的字符串。轻量级:FATFS占用较少的内存和存储空间,适用于资源有限的设备和系统,如嵌入式系统和存储器较小的设备。
2024-02-08 22:50:47
734
原创 STM32内存管理
内存管理是计算机系统中的一个重要组成部分,它负责管理计算机的内存资源。内存管理的主要目标是有效地分配、使用和释放内存,以满足程序的运行需求。内存是计算机用于存储程序和数据的地方,它由一系列内存单元组成,每个内存单元都有唯一的地址。内存管理器负责跟踪内存的分配情况,以便将空闲的内存分配给程序使用,并在程序不再使用内存时将其释放。内存管理的主要功能包括:内存分配:内存管理器跟踪内存的可用和已使用区域,并将适当大小的内存块分配给程序。
2024-02-08 22:48:39
1225
原创 Linux命令·
debian linux: deb 软件包deb软件包分为两种,.deb二进制软件包,.dsc源码包软件包的两种管理工具软件包软件的安装包必须存在不能从镜像点获得安装包不能检测软件之间的依赖关系 共享文件夹在 /mnt/hgfs 目录下sudo apt-get install 软件名sudo agt-get remove 软件名sudo agt-get --pugre remove 软件名sudo agt-get update 软件名sudo agt-get upgradesudo agt-get c
2024-02-04 20:15:53
843
原创 LVGL部件8
在 LVGL(LittlevGL)中,函数用于设置按钮矩阵(Button Matrix)中单个按钮的控制选项。该函数可以用来定制按钮矩阵中按钮的行为、样式和其他属性。以下是btnmatrixbtn_idstatectrl通过调用这个函数,可以针对特定的按钮矩阵中的按钮设置不同的控制选项。这样可以实现诸如隐藏、禁用、重复等特殊行为。注意,在使用这个函数之前,需要先创建一个按钮矩阵对象,并确保按钮矩阵中按钮的数量和索引是正确的。在这个示例中,我们使用函数创建了一个按钮矩阵对象,并进行了基本的设置。
2024-02-03 22:24:57
1701
原创 Linux底层基础知识
汇编,C语言,C++可以通过不同的编译器,编译成机器码。而java只能由Java虚拟机识别。Java虚拟机可以看成一个操作系统,Java虚拟机是由汇编,C,Linux等编写而成的一个操作系统(面向os)不同的芯片,底层的CISC指令集不同,所以其机器码有区别,因此汇编不能跨平台。特定的CPU下只能执行特定的机器码。Java生成字节码,只有Java虚拟机识别,Java虚拟机跨平台,因此Java跨平台。
2024-02-03 20:46:43
6270
2
原创 LVGL部件7
在LVGL(LittlevGL)中,要设置图像对象的旋转中心点,可以使用函数。xy以下是一个示例代码,展示如何使用在这个示例中,我们创建了一个图像对象img,然后使用函数将该图像对象的旋转中心点设置为图像的中心点。在LVGL(LittlevGL)中,可以使用函数来设置图像对象的旋转角度。angle以下是一个示例代码,展示如何使用在这个示例中,我们创建了一个图像对象img,然后使用函数将该图像对象的旋转角度设置为 90 度,表示将图像按顺时针方向旋转 90 度。在LVGL(LittlevGL)中,可以使用。
2024-02-02 22:55:13
3722
原创 LVGL部件6
函数。obj是指向要设置线条样式的对象的指针。part是指定要设置样式的对象部分。可以使用预定义的常量,如表示主要部分,或者使用表示自定义部分。is_rounded是一个布尔值,用于指定是否将线条样式设置为圆角。true表示应用圆角样式,false表示使用直角样式。以下是一个示例代码,展示如何使用// 创建一个对象// 将对象的线条样式设置为圆角在这个示例中,我们创建了一个对象obj,然后使用函数将该对象的线条样式设置为圆角。在LVGL(LittlevGL)中,可以使用。
2024-02-02 22:53:57
2328
原创 LVGL部件5
在 LVGL(LittlevGL)中,函数用于设置滑块(Slider)组件的值。slider是指向滑块对象的指针。value是要设置的滑块的值。anim是布尔值,用于指定是否使用动画效果进行滑块值的更改。以下是一个示例代码,展示如何使用// 创建一个滑块// 设置滑块的取值范围和初始值在这个示例中,我们创建了一个滑块对象slider,使用函数设置了滑块的取值范围为 0 到 100,并使用函数将滑块的初始值设置为 50。在 LVGL(LittlevGL)中,
2024-02-01 20:29:24
1782
原创 LVGL部件4
是LittlevGL(LVGL)图形库中的一个函数,用于向列表(list)对象中添加一个按钮(button)。。这个函数用于在列表对象中添加一个按钮,可以包含一个图像和一个文本。list参数是指向列表对象的指针,即要将按钮添加到的列表。img_src参数是一个指向图像数据的指针,用于指定按钮上显示的图像。如果不需显示图像,可以将此参数设置为NULL。txt参数是一个表示按钮上显示的文本的字符串。函数会在列表对象中创建一个新的按钮,并将其添加到列表的末尾。按钮的图像和文本将根据提供的参数进行显示。
2024-02-01 20:27:51
1865
原创 IMX6LL|打造自己的驱动总线
软件与硬件代码分离,提高程序的复用性。添加设备,关联硬件相关代码。添加驱动,关联软件相关代码。设备驱动模型体现分离思想。
2024-01-31 21:24:40
459
原创 Linux
vim ~/.bashrc 行尾添加或修改 export PATH=$PATH:/home/hq/demo。tar czf test.tar.gz test //gz格式压缩文件。tar xzf test.tar.gz -C 目录名 //解压到某个目录下。ta cvf test.tar.gz test //只归档不压缩。修改etc/environment,在后面添加:/home/hq/demo。find ./ -name hello.c //查找文件名字。
2024-01-31 21:21:15
414
1
原创 LVGL部件3
是 LittlevGL(LVGL)图形库中的一个函数,用于设置对象的圆弧颜色样式。。这个函数的作用是设置指定对象(lv_obj_t类型)的圆弧(arc)颜色样式。圆弧颜色样式是指对象中绘制的圆形或弧线的颜色。通过使用函数,可以更改对象中圆弧的颜色。参数color是一个lv_color_t类型的参数,用于指定要设置的圆弧颜色。可以使用 LVGL提供的颜色宏或自定义颜色来设置圆弧颜色。通过调整圆弧颜色,可以使对象的外观与应用程序的需求和风格相匹配。
2024-01-30 22:19:26
1151
原创 LVGL部件2
是 LittlevGL(LVGL)图形库中的一个函数,用于检查指定对象的状态。状态通过使用位掩码进行表示,其中每个位代表一个具体的状态。使用位操作可以将多个状态进行组合,以便同时检查多个状态。如果对象处于给定的状态,则函数会返回true,否则返回false。此函数的目的是为了在 LVGL 应用程序中检查对象的状态。例如,可以使用它来检查按钮是否处于按下状态,或者检查复选框是否被选中。是 LittlevGL(LVGL)图形库中的一个函数,用于设置复选框控件的文本。。
2024-01-30 21:21:52
2086
原创 LVGL组件
LVGL (Light and Versatile Graphics Library) 采用了面向对象的编程思想。LVGL 是一个开源的图形库,旨在为嵌入式系统提供高性能的图形显示和用户界面功能。LVGL 的设计思路是基于对象的,它利用抽象的类来实例化不同的对象。LVGL 提供了一系列的类和对象,如窗口、按钮、标签、容器等,开发者可以通过实例化这些类来创建具体的图形界面组件。通过面向对象的编程,开发者可以轻松地创建和管理图形界面的组件。每个对象都有自己的属性和方法,可以根据需要对其进行配置和操作。
2024-01-28 23:10:32
745
原创 LVGL移植准备
显示驱动:实现与目标平台兼容的显示驱动程序,包括初始化显示设备、绘制像素和设置显示区域等功能。确保与LVGL库进行交互的正确性和有效性。输入设备驱动:适配目标平台的输入设备驱动程序,包括触摸屏、按键和鼠标等。实现输入事件的捕获和传递给LVGL库进行处理。系统适配:根据目标平台的特点,适配相关的系统组件,如任务调度、时钟和定时器等。确保在目标平台上正常运行LVGL所需的系统资源。内存管理:实现适配目标平台的内存管理函数,包括内存分配、释放和对齐功能。
2024-01-27 21:28:06
852
原创 LVGL入门
LVGL(Light and Versatile Graphics Library)是一款开源的嵌入式图形库,专门为嵌入式系统设计。它提供了丰富的绘图组件和用户界面控件,可以用于构建直观、美观和交互式的图形用户界面。跨平台支持:LVGL可以在多个硬件平台和操作系统上运行,包括ARM Cortex-M、ARM Cortex-A、ESP32、Raspberry Pi等嵌入式平台。硬件友好:LVGL开发时考虑了嵌入式系统资源受限的情况,因此具有较小的内存占用和较低的处理器要求。
2024-01-27 21:25:49
824
原创 打开文件:内核做了什么
每一个进程或者说线程都由一个结构体维护,结构体有众多成员,其中有一个成员叫做files;files是类型。中含有fdt成员,它是指向文件描述符表数组的指针。文件描述符表数组中仅仅是一个索引,而文件描述符就是文件描述符表的下标。通过索引可以找到文件表项。文件表项是一个数据结构,记录了打开文件的详细信息,包括文件偏移、文件指针、访问权限等。当程序调用open函数时,系统会根据文件地址,通过虚拟文件系统找到inode中的,复制到程序中的文件表项中。这样就不用通过虚拟文件系统操作要打开的文件。同时返回文件描述的符。
2024-01-26 20:06:59
1321
原创 Linux抽象文件系统
Linux采用了抽象文件系统的概念来统一管理不同类型的文件和文件系统。抽象文件系统是对不同文件系统的封装,使得用户和应用程序可以以相同的方式访问和操作不同类型的文件系统。Linux的抽象文件系统通过以下几个组件来实现:VFS(Virtual File System):VFS是一个抽象层,位于内核与各种具体文件系统之间。它定义了一组标准的文件操作接口,并提供了一套通用的数据结构和函数来管理文件和文件系统。
2024-01-26 20:05:44
1036
原创 IMX6ULL|libgpiod控制IO
在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐渐放弃。
2024-01-24 20:02:52
812
原创 Modbus协议
Modbus由Modicon公司于1979年开发,是一种工业现场总线协议标准。Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是Modbus RTU和Modbus TCP三种。其中Modbus TCP是在施耐德收购Modicon后1997年发布的。
2024-01-24 20:01:36
1475
原创 嵌入式面试题
1.交换机与路由器交换机:用于局域网内的转发路由器:用于连接局域网和外网,也能进行数据转发2.IP地址基本概念1.IP地址是Internet中主机的标识2.Internet中的主机要和其它机器通信,必须要有一个IP地址3.IP地址分为32IPv4和128位IPv64.IP地址的表示方式是点分制。IP地址=网络号+主机号网络号:用来表示是否在一个网段内主机号:标识在本网段内的ID(不能重复,同一网段内)a三只划分:重新划分网络号和主机号,重新组网,从而提高资源利用率。
2024-01-23 21:09:48
661
原创 IMX6ULL|input子系统(按键实验)
input子系统是Linux对输入设备提供的统一驱动框架。如按键、键盘、触摸屏和鼠标等输入设备的驱动方式是类似的,当出现按键、触摸等操作时,硬件产生中断,然后CPU直接读取引脚电平,或通过SPI、I2C等通讯方式从设备的寄存器读取具体的按键值或触摸坐标,然后把这些信息提交给内核。使用input子系统驱动的输入设备可以通过统一的数据结构提交给内核,该数据结构包括输入的时间、类型、代号以及具体的键值或坐标,而内则通过/dev/input目录下的文件接口传递给用户空间。在Linux内核源码的。
2024-01-23 21:08:52
1235
原创 IMX6ULL|GPIO子系统
GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚,这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定,如作为串口、I2C、网络、电压检测的通讯引脚。与LED子系统类似,Linux提供了GPIO子系统驱动框架,使用该驱动框架可以把CPU的GPIO引脚导出到用户空间,用户通过访问/sys文件系统进行控制,GPIO子系统支持把引脚用于基本的输入输出功能,其中输入功能还支持中断检测。
2024-01-22 08:57:33
1105
原创 IMX6ULL|LED子系统
在Linux系统中,绝大多数硬件设备都有非常成熟的驱动框架,驱动工程师使用这些框架添加与板子相关的硬件支持,建立硬件与Linux内核的联系,内核再通过统一文件系统接口呈现给用户,用户通过对应的设备文件控制硬件。对于LED设备,Linux提供了LED子系统驱动框架,在Linux内核源码中的“Documentation/leds/leds-class.txt”有相关的描述,它实现了一个leds类,用户层通过sysfs文件系统对LED进行控制。
2024-01-22 08:55:14
1105
原创 IMX6LL|class:设备的大管家
parent:新kobject对象的上一层节点,一般为NULL。kobject对象可以通过uevent机制往用户空间发送信息。fmt:变参参数,一般用来设置kobject对象的名字。udev/mdev:用户空间守护进程,监听广播信息。kobject_uevent:内核消息发送接口。NETLINK:特殊的网络通信,本地主机使用。drvdata:私有数据,一般为NULL。dev_t:属性文件记录该设备号。class:新构建的class。
2024-01-21 22:56:39
412
原创 IMX6LL|linux设备驱动模型
linux系统通过sysfs体现出设备驱动模型sysfs是一个虚拟文件系统(类似proc文件系统)目录对应的inode节点会记录基本驱动对象(kobject),从而将系统中的设备组成层次结构用户可以读写目录下的不同文件来配置驱动对象(kobject)的不同属性。
2024-01-21 22:54:54
946
原创 IMX6LL|内核模块
make modules:执行Linux顶层Makefile的伪目标,它实现内核模块的源码读取并编译为.ko文件。printk:内核模块无法使用glibc库函数,内核自身实现的一个类printf函数,但是需要指定打印等级。选项”-C”:让make工具跳转到linux内核目录下读取顶层Makefile。$(MAKE):Makefile的默认变量,值为make。微内核:内核空间只提供关键功能,服务功能在用户空间提供。内核模块的功能需要依赖内核提供的各种底层接口。宏内核:关键功能和服务功能均在内核空间提供。
2024-01-19 18:57:49
679
原创 IMX6LL|串口通信
UART1_UFCR:时钟分频、发送与接收的 fifo大小。官方sdk的设置波特率函数使用了除法,需要提供gcc除法库。UART1_UBIR、UART1_UBMR:波特率。UART1_UCR1:使能uart1、自动波特率。UART1_UCR3:bit2置1,官方要求设置。-lgcc 表示会链接“libgcc.a”库。UART1_UCR2:设置串口的发送帧格式。-static -L 表示静态库所在路径。发送完成标志、数据接受标志。奇偶校验位、软件复位。
2024-01-18 19:08:01
859
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人