- 博客(39)
- 收藏
- 关注
原创 标签显示中文
LVGL内置有一个中文字库 CJK字库,这个字库在 i_conth中定义为:LV_FONT_SIMSUN_16_CIK。要在Ivgl中使用显示自己的中文字库,我们需要用到两个东西:字体文件和字体转换器字体文件我们可以使用开源的字体或者自己制作出来,准备好了字体文件之后使用字体转换器即可转换成可以在lgl上使用的字体格式。如果指针指向的内存区域在函数返回后被释放,那么标签上的文本可能会出现问题。在这个例子中,由于字符串是在 .rodata 段中,所以即使函数退出,指针仍然有效,因此标签上的文本仍然可见。
2024-08-12 11:11:29
585
原创 标签(label)组件的使用
标签主要用于显示静态或动态的文字信息,如提示、标题、状态等。:可以设置标签的位置和对齐方式,使其适应不同的屏幕布局需求。:支持动态更改标签中的文本内容,比如实时数据显示。:虽然标签本身通常不具备交互功能,但可以通过改变其内容或样式来响应用户的操作,提供视觉反馈。:可以结合多语言系统,在不同语言环境下显示相应的文字。
2024-08-12 10:14:17
1022
原创 lvgl的事件冒泡
当用户交互(如触摸屏点击)发生在一个对象上时,该对象会首先接收到事件。如果对象启用了事件冒泡标志,并且没有处理该事件,事件会被传递给它的父对象。如果父对象也启用了事件冒泡并且没有处理事件,事件将继续向上传递,直到找到处理该事件的对象或者达到顶层对象为止。:每个对象可以注册一个或多个事件处理器来处理特定类型的事件。事件处理器会在事件发生时被调用。:LVGL支持多种事件类型,包括但不限于 LV_EVENT_CLICKED, LV_EVENT_PRESSED, LV_EVENT_RELEASED 等。
2024-08-12 10:04:47
672
原创 Lvgl的对象
LVGL 中的对象(widgets)可以接收多种类型的事件,这些事件可以由用户的输入动作触发,也可以由 LVGL 自身触发。LVGL 还支持事件冒泡机制,即如果一个子对象接收到一个事件,而它的事件处理函数没有明确阻止冒泡,那么该事件将会传播给它的父对象,直到被某个对象的事件处理函数阻止。LVGL 的事件系统允许你为各种对象注册不同的事件处理程序,从而实现丰富的用户交互功能。在 LVGL 中,事件是指由用户操作(如触摸或按键)或系统操作(如对象状态的变化)引发的动作。:由输入设备触发的事件,如触摸屏或键盘。
2024-08-12 09:57:51
395
原创 SPI简介
并行通信------数据各位同时发送串行通信------数据一位一位发送 (SPI)SPI的四根线:1.MISO (主设备数据输入,从设备输出)2.MOSI(主设备输出,从设备输入)3.SCLK (时钟信号)4.CS/SS(片选信号)------选择哪一个从机。
2024-07-04 16:42:35
468
原创 蜂鸣器响+shell脚本
这三个API是在#include <wiringPi.h>头文件里面的,这个是第三方库;需要使用 -lwiringPi -lwiringPiDev -lpthread -lcrypt -lrt。//设置IO口输出低电频,蜂鸣器响。//设置IO口的输入/输出。//初始化wiringpi库。来进行编译,为了方便,所以使用了shell来进行简化;1.这里是使用了三个新的API;
2024-06-24 17:36:32
157
原创 OrangePi ZERO 2 外设应用程序开发之接口
OrangePi ZERO 2 开发板 26 Pin 接口引脚的顺序请参考下图:每个引脚的具体功能可以参考下表:26 Pin 接口中总共有 17 个 GPIO 口,所有 GPIO 口的电压都是 3.3v 的。
2024-06-24 16:09:10
310
原创 Linux网络编程2
设置能处理的最大连接数,listen并未开始接受连线,只是设置了socket的listen模式,listen函数只用于服务器端,服务器进程不知道要与谁进行连接,因此,它不会主动的要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接请求,并对它做出处理,一个服务进程可以同时处理多个客户进程的连接,主要就连个功能:将一个未连接的套接字转换为一个被动套接字(监听),规定内核为相应套接字排队的最大连接数。上述两者结构体长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。
2024-06-24 16:04:47
705
原创 linux的UDEV机制
SYSFS{filename}:设备的devpath路径下,设备的属性文件"filename"里的内容;一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出。UDEV守护进程,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管。件设备的状态动态更新设备文件,包括设备文件的创建,删除等。BUS:设备在devpath里的总线名称,例如:usb;
2024-06-24 15:54:11
391
原创 进场间通信2(共享内存)
共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。注意:size: 大于0的整数:新建的共享内存大小,以字节为单位 3,072k(3kb)删除系统中的共享存储段ipcrm -m [shmid]
2024-05-20 09:16:00
331
原创 进程间通信3(信号,信号量)
信号量与上面的IPC结构不同,上面的IPC是可以发数据的,而信号量是不能发数据,它是一个计数器,信号量用于实现进程间的互斥与同步,而不是用于储存进程间通信数据。Linux下的信号量函数都是在通用的信号量数组上进行操作,而不是 一个单一的二值信号量上进程操作 二值信号量:信号量只能取0或者1的变量。对于 Linux,实际信号是软中断,许多重要的程序也需要处理信号,信号能为 Linux 提供一种处理异常的方法,比如 Ctrl + C 中断 程序,会通过信号机制停止程序。siginfo_t有下列的内容。
2024-05-20 09:15:47
992
原创 Linux线程(创建--等待--退出)
线程与进程典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。线程:是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。进程:线程是操作系统能够进行运算调度的最小单位。
2024-05-20 09:15:29
985
原创 Linux线程2(互斥锁)
一、死锁的定义多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。二、死锁产生的原因系统资源的竞争通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在 运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。进程推进顺序非法。
2024-05-20 09:15:10
1163
原创 线程和信号量
在 Linux 中,线程(Thread)是进程内的一条执行路径,也被称为轻量级进程。线程与进程共享同一进程的资源,包括内存空间、文件描述符等,但拥有独立的执行路径。多个线程可以同时执行不同的任务,提高了程序的并发性和效率。信号量(Semaphore)是一种用于进程间通信和同步的机制。它是一个计数器,用于控制对共享资源的访问。信号量通常用于解决进程之间的互斥和同步问题,确保多个进程或线程之间的协调性和顺序性。总的来说,线程是进程内的执行路径,用于实现程序的并发执行;
2024-05-20 09:13:49
420
原创 进程间通信1(IPC)
pipe---无名管道mkfifo---有名管道msgget ----用于创建一个新的或打开一个已经存在的消息队列,此消息队列与key相对应。msgrcv 功能---从标识符为msqid的消息队列读取消息并存于msgp中,读取后把此消息从消息队列中删除。msgsnd 功能---将msgp消息写入到标识符为msqid的消息队列。
2024-05-19 18:20:34
310
原创 Linux进程3(system,popen,fork,守护进程)
system 函数作用system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。popen() 函数会创建一个进程来执行指定的 shell 命令,并返回一个指向用于读取或写入该进程的标准 I/O 流的文件指针。需要注意的是,使用 popen() 函数时要小心处理输入的命令,以避免潜在的安全风险,比如避免使用用户输入的命令直接作为参数传递给 popen()。直接借助damon()函数完成。
2024-05-19 18:16:14
267
原创 Linux进程2(exec族函数)
如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。就是如果进行fork的时候,子进程想去运行其他的文件,可是fork就是复制而已,没有办法做到,这个时候就进行exec族函数进行调用,如果调用成功,那么在原本要进行的代码就不进行了,如果调用不成功,就继续做原来的代码exec头文件及原型。
2024-05-19 18:09:19
346
原创 Linux进程1
ps(显示当前进程),ps -aux(显示进程占用的各种资源)ps -ajx(显示各种的有关ID号)top(显示系统资源使用情况)fork(创建线程),vfork(让子线程先运行)wait(柱塞线程,等待子线程的回应)waitpid(可以使用调用者不柱塞),getpid(获取当前的id),getppid(目前进程的父id)问1.什么是程序,什么是进程,有什么区别?
2024-05-19 18:05:29
889
原创 LINUX---文件类型
普通文件:目录文件---directory:字符设备文件/块设备文件---character/block:文件属性获取:文件权限管理:文件权限管理2:读取目录文件:
2024-05-19 17:57:14
111
原创 POSIX消息队列
在后面的项目中会用POSIX消息队列, 它原来学的System V消息队列(msgget、msgsnd, msgrcv) 类似,都是用以队列的形式传递消息。
2024-05-19 17:40:44
317
原创 linux消息队列
消息队列是消息的链接表,是存在内核中的,一个消息队列是由一个标识符(ID号)来标识。特点:key的使用:ftok 参数fname:指定的文件名(已经存在的文件名),一般使用当前目录,如:key_t key;这样就是将fname设为当前目录。id:子序号。虽然是int类型,但是只使用8bits(1-255)。ftok 返回值成功:返回key_t值(即IPC 键值)出错:-1,错误原因存于error中用于创建一个新的或打开一个已经存在的消息队列,此消息队列与key相对应。
2024-05-19 17:38:43
272
原创 linux动静态库
动态库是程序在运行的时候才去链接相应的动态库代码的,多个程序共享使用库的代码。实际上,所有库本质都是一堆目标文件(xxx.o)的集合,库的文件当中并不包含主函数而只是包含了大量的方法以供调用,所以说动静态库本质是可执行程序的“半成品”静态库是程序在编译链接的时候把库的代码复制到可执行文件当中的,生成的可执行程序在运行的时候将不再需要静态库,因此使用静态库生成的可执行程序的大小一般比较大。在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。库的本质就是.o文件的集合。
2024-05-19 17:32:33
848
原创 linux文件系统
Linux虚拟文件系统(Virtual File System, VFS)是Linux内核中的一个核心组件,它扮演着一个抽象层的角色,为用户空间的应用程序提供了一个统一的接口来访问不同的文件系统类型。VFS设计的核心理念在于隐藏底层文件系统的具体细节,使得上层应用可以以统一的方式与文件系统交互,而不必关心文件系统底层的实现差异。windows:随意(面向普通用户PC),目录即分区C(装系统的位置)也可以随意在C盘存放文件D盘(用户随意发挥)文件系统(文件管理系统的方法)的种类有哪些?根分区等文件系统结构。
2024-05-19 17:26:57
671
原创 Linux -- 工厂模式
工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。
2024-05-19 17:15:29
255
原创 C语言----链表
如果有一组数组,但是我要增加一个数或者删一个数,对于数组来说是好难的这个时候使用链表,就非常简单,因为数组是开辟了一个连续的空间,而链表就是使用指针来进行连接(就好比如连连看),在需要增加或者删除就可以用指针跳过要删的那个数,就可以了,增加也是同样的道理;什么是链表 ---->数据结构----->数据存放的思想。查找有没有这个数的时候,要有链表头,这样才可以查找。
2024-04-02 17:43:19
399
1
原创 联合体--共用体--枚举
共用体 的地址是取决于共用体里面元素中最大的那个确定的;1.c编译器会把枚举里面的数当常量来处理,所以叫枚举类型。3.值默认从0开始,枚举元素不能被赋值,虽然瞅着象变量名。2.列表里面的数可以自己来定义,不用像变量一样去申请。联合体 的地址是每一个元素都有自己的单独空间。5.可以直接忽略枚举类型名,直接定义枚举变量。4.可以指定列表中枚举数的值。enum 代表的是枚举类型。共用体要注意数据覆盖。
2024-04-02 17:40:22
122
1
原创 C语言------------指针
指针的类型:指针 : 在学习指针之前,要有一个认知,那就是指针 == 地址;这里要注意三点:1.*标识符—————只产生在指针变量定义或声明的时候;2.指针的类型要和被赋值的类型一致;在scanf中,不能使用指针进行;上面的是最基本的指针定义和使用;和第一个的一样;差别在于把一维数组名来传参,和下面的函数封装一样:3 . 指针和二维数组 :二维数组在指针里面,要明白的就只有两点 “是偏移了多少”“怎么表达”第一个问题:偏移了多少?
2024-04-02 17:38:02
1895
1
原创 C语言分文件
在C语言中,分文件编程是一种将程序代码分割成多个文件的技术,有助于提高代码的可维护性和可重用性。通常,一个C程序可以分为多个文件,比如头文件(.h文件)和源文件(.c文件),每个文件负责不同的功能或模块。总的来说,分文件编程是一种良好的编程实践,能够提高代码的可读性、可维护性和可重用性。在实际编程中,需要遵循一定的规范和注意事项,以确保程序结构清晰、逻辑合理。
2024-04-02 17:35:37
550
1
原创 c语言---- 结构体
比如有一个结构体,他的类型int型,char型,double型,他们分别是四个字节,一个字节,八个字节,那么在统计的时候是按八个字节为一个整体,其他的就补上,那么怎么要合理分配空间呢,那就要同类型的放在一起,作用就是让它的补上空间利用好。就是把函数名换成结构体类型的变量名然后通过二级指针指向之前的一级指针,使用二级指针来进行需要注意的是,在这里它使用了动态变量malloc字符串,所以要注意字符串的使用方式。如果一个结构体里面有不同类型的变量,那么它的内存分配空间是不一样的;使用指针的形式去间接访问是用 "
2024-04-02 17:34:40
405
1
原创 定时器和PWM
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通 过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的 时间占据整个信号周期的百分比,例如方波的占空比就是50%.区别在于,机器周期是指处理器执行一条指令所需的时间单位,是一个相对概念,而时钟周期是指处理器时钟发出一个脉冲所需的时间单位,是一个绝对概念。时钟周期是一个时间的量。
2024-03-23 14:30:58
1293
1
原创 C语言中if和switch的区别
在C语言中,`if` 和 `switch` 都是用来进行条件判断的语句,但它们在用法和适用场景上有一些显著的区别:
2023-12-09 15:54:58
2125
原创 C语言的变量-------if用法,占位符
在编程中,"占位符"通常指的是在字符串格式化时用于指定要插入值的位置的符号。例如,在C语言中,我们经常使用%d%s%f等占位符来格式化字符串。%dint%ffloatdouble%schar[]char*其中我们在调用占位符的时候,也是会出现各种各样的小问题,当我们出现了程序错误时,是可以把错的程序记录下来,当我们有时间或者出现同样的问题时,方便我们可以更加快速地解决问题,下面是一些经常出现的问题。
2023-12-08 11:46:21
509
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人