- 博客(49)
- 收藏
- 关注
原创 【应用开发】解决正点原子I.MX6ull应用编程zlib移植问题
在正点原子应用开发移植zlib库的时候,文档中有这样一段描述,先删除开发板中的zlib库,然后再拷贝zlib库这就会导致在使用scp命令拷贝编译好的zlib库的时候报错没有zlib.so.1。
2024-08-27 22:20:13
199
原创 rust 终端显示综合例程
这个包装器库提供了一个安全的接口,使用User和Group类型和函数,如get_user_by_uid,而不是低级指针和字符串。由于users表更改的频率非常低,因此对于短时间运行的程序来说,通常会缓存结果,而不是每次都获取最新的条目。在Unix中,每个用户都有一个单独的用户ID,每个进程都有一个有效的用户ID,表明它正在使用哪个用户的权限。此外,用户可以是组的成员,组也有名称和id。标准中,这些码通常用于控制终端的文本输出。跨平台终端操作库,纯rust库,可以编写跨平台的基于文本的界面。
2024-07-03 17:58:46
812
3
原创 【应用开发二】GPIO操控(输出、输入、中断)
GPIO 引脚在使用之前,需要将其导出,导出成功之后才能使用。注:并不是所有的文件夹都可以导出成功,如果引脚在内核中被使用了,就会导出失败。当引脚被设置为中断后,使用poll()函数监听引脚的电平状态变化。使用完GPIO引脚之后,需要将导出的引脚删除,同样该文件为。删除成功之后,之前生成的GPIO文件就会消失!功能:用于将指定编号的GPIO引脚导出。文件中,即可将对应GPIO引脚导出。的文件夹用于管理、控制GPIO引脚。:配置gpio引脚输入输出模式。功能:删除导出的GPIO引脚。
2024-06-28 22:54:55
705
原创 【应用开发一】LED开发
进入到目录下,该目录中存放着所有的LED设备,目录如下图所示:可以看到该目录中有一个sys-led的文件夹,这个就是底板上LED的设备文件,该目录下文件如下图所示:这里主要关注brightness、max_brightness以及trigger三个文件,这三个都是LED的属性文件。brightness:亮度可读可写,设置led的亮度等级,0:灭正整数:pwm控制的led:值越大,led越亮GPIO控制的led:亮:最大亮度等级只读文件trigger:触发模式。
2024-06-25 20:18:22
940
原创 【gdb使用】
当程序在某一出停止后,用该指令继续执行,直到遇到断点或者程序结束。若要使用gdb调试代码,在代码编译时需要添加。:遇到循环体时,可以使用改命令跳出循环体。:如果有函数,进入函数内部执行,否则和。:n为行号,该命令使程序运行直第n行。有时候断点需要再运行程序之前打。:命令一行一行的执行。gdb bin文件名。
2024-06-17 17:18:43
169
原创 【rust 第三方库】serde 序列化反序列化框架
Serde是主流的rust序列化、反序列化框架。设计上,基于rust的静态类型系统和元编程(宏)的能力,使Serde序列化的执行速度与手写序列化器的速度相同。使用上及其简单用户为自己的类型实现Serialize和特质即可(大多数使用derive宏实现)序列化提供商,提供Serializer和特征的实现即可。若要数据类型支持序列化和反序列化,则该类型需要实现Serialize和trait。Serde提供了rust基础类型和标准库类型的Serialize和实现。对于自定义类型,可以自行实现。
2024-06-11 16:53:20
1120
7
原创 rust clap库(命令行解析)
CLI(Commang Line Interface,命令行界面)始终允许用户通过文本命令与计算机程序活操作系统进行交互的接口。与图形用户界面(GUI,Graphical User Interface)相比,CLI不提供图形元素,用户通过键盘输入特定的命令指令,命令行界面解释这些指令并执行响应操作。直观易用简洁的命令语法:命令和参数的设计应直观易懂,方便用户记忆使用自动补全:支持命令和参数自动补全功能,提高用户输入效率命令别名:提供常用命令的简短别名,减少输入工作量强大的帮助系统。
2024-06-11 09:46:00
967
原创 根文件系统简介
根文件系统也叫做rootfs,Linux的根文件系统更像是一个文件夹或者目录,在这个文件夹中有很多子目录。跟目录下和子目录中会有很多文件,这些文件时linux运行所必须的,比如库、常用软件和命令、设备文件、配置文件等。根文件系统首先是内核启动时所mount(挂在)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导程序会在根文件系统挂在之后把一些基本的初始化脚本和服务等加载到内存中去运行在嵌入式linux中,内核代码并没有保存在根文件系统中,而是保存在了其他地方,例如NAND Flash。
2024-05-20 21:51:14
410
原创 【系统移植二】内核移植
1)源码路径:1、例程源码->4、NXP 官方原版Uboot和Linux->linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz22)解压,重命名。
2024-05-19 11:38:59
989
原创 【系统移植一】uboot移植
开发板类型:emmc、7寸屏1)源码路径:1、例程源码->4、NXP 官方原版 Uboot 和 Linux -> uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。2)将源码拷贝到ubuntu中的目录下,解压。解压后入下图所示:1 配置在编译之前首先要配置uboot,uboot的配置文件在configs目录下,因为开发是使用的是14x14mm尺寸的芯片,emmc版本,所以关注官方的配置文件。2 编译编写脚本,内如如下给脚本可执行权限,执行脚本3 烧写验证1)
2024-04-18 22:10:27
731
原创 【系统移植二】正点原子linux内核移植
脚本要有可执行权限,在编译过程中会弹出linux的图形界面配置,如下图所示,这里不需要做任何配置,按两次。厂源码-> linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2。开发板光盘->1、例程源码-> 3、正点原子 Uboot 和 Linux 出。②、设备数文件:imx6ull-alientek-emmc.dtb。①、linux镜像文件:zImage。linux内核在编译完成之后会在。这个压缩包拷贝到前面新建的。退出即可,等待编译完成。在编译内核之前需要安装。
2024-04-08 21:57:19
385
原创 【NFS 和 TFTP服务器搭建】
1)原因:因为ubuntu的nfs版本为version4,而板子的nfs版本为version2,所以直接挂载上去无法识别。就是创建的tftp文件夹目录,可以将需要使用TFTP传输的文件放在这个文件夹中,并且。一定要给文件夹权限,否则uboot无法从tftpboot文件夹下载文件。exports配置常用参数。使用如下命令重启nfs服务。打开nfs的配置文件。
2024-04-07 22:30:42
317
原创 【bash自动补全原理】
路径下的自动补全脚本。补齐功能可以通过脚本指定命令参数如何补齐。的脚本,这个脚本会在bash初始化的时候加载,获取脚本的位置可以通过。包来更好的进行补全效果。不同版本安装位置不同,原理类似。文件查看,补全功能的配置也是通过这个脚本导入的。(1)第3行:检查三个条件是否同时满足。1)自动补全依赖于bash的内置命令。2)一般系统中会安装。
2024-04-07 17:05:37
446
原创 【系统移植 一】 正点原子U-boot移植
Linux的启动需要一段bootloader程序,也就是芯片上电以后运行一段bootloader程序。这段程序会先初始化DDR等外设,然后将linux内核从flash(NAND、NOR FLASH、 SD、MMC等)拷贝到DDR中,最后启动linux内核。bootloader最主要的作用是启动Linux内核。uboot是bootloader的一种。
2024-03-30 16:26:37
423
原创 【rust项目】c与rust相互调用及目录间文件相互引用
本文选择在src目录下的方式,于src同级的没研究明白。使用inclued宏的时候引用那个文件中的哪些函数是不需要写的。一个creat只可以生成一个lib文件(lib的类型可以是多种);文件,该文件的作用是在编译代码的时候可以链接到库,相当于给rustc 添加编译参数。8)主体代码和builtins目录下文件重名(把其中一个文件名称换掉)在生成c动态库时需要调用rust中实现的函数,只需要在c文件中使用。 文件相互引用的时候,需要再在src目录下添加。1)rust需要调用c生成的库(静态库和动态库)
2024-01-16 21:24:01
1666
原创 【基本定时器】一
STM32的基本定时器时TIM6和TIM7,这两个定时器个包含一个16位的自动装载计数器,有各自的可编程预分频器驱动。作用1) 提供时间基准2)为数模转换器(DAC)提供时钟。
2023-11-25 14:27:14
128
原创 【MQTT 学习三】Qos、保留消息、心跳机制、遗嘱、用户密码认证
Qos:Quality of Service,服务质量。设置不同的等级可以确保某些重要信息准确传输到接收端。
2023-07-08 18:43:26
1793
原创 【MQTT学习 一】基本概念
客户端可定时向服务端发送一个心跳包用于告知服务端,当前客户端依然在线,服务端在收到客户端的心跳请求后,会回复一条消息,这条消息被称作心跳相应。MQTT的服务端通常是一台服务器(broker),它是MQTT信息传输的枢纽,负责将客户端的信息发送给客户端;当 MQTT 报文的接收方没有及时向报文发送发回复确认收到报文时,发送方会以为对方没有收到信息,会再次重复发送 MQTT 报文。MQTT 消息的服务质量等级。有保留标志的主题,服务器会保留消息,当有客户端订阅该主题后,服务端会立即想客户端发送改主题信息。
2023-07-08 16:02:24
1385
原创 【进程 一】何为进程
可执行程序是一个文件,文件是一个静态的概念,放在磁盘中,如果它没有被执行,则不会产生任何作用,当它被运行之后,将会对系统环境产生影响,所以执行程序的实例就是可执行文件被执行。Linux系统下,每一个进成都有一个进程号(process ID,简称PID),是一个正数,进程与进程号是一一对应关系。进程是一个动态过程,是程序的一次运行过程,当应用程序被加载到内存中运行之后,它就成为一个进程,当程序也运行结束后,也就意味着进程终止。进程:就是一个可执行程序的实例。进程就是可执行文件被执行的过程。
2023-07-04 18:05:18
42
原创 【linux 信号学习】信号有关函数
sigsuspend函数会将mask信号集替换进程的信号掩码,然后挂起进程,直到捕获到信号被唤醒(如果捕获的是mask中的信号,则不会被唤醒,继续挂起)、并从信号处理函数返回,一旦从信号处理函数返回,sigsuspend()会将进程的信号掩码恢复成调用前的值。如果进程在执行信号处理函数期间接收到了处在信号掩码中的成员,内核会将其阻塞,将该信号添加到进程等待信号集(等待被处理,处于等待状态的信号)中,可以使用sigpending函数获取正在等待的信号集。并且还允许调用着添加一下输出信息,有参数s指定,
2023-06-15 09:40:11
151
原创 【linux 信号学习十一】异常退出
函数 abort()通常产生 SIGABRT 信号来终止调用该函数的进程,SIGABRT 信号的系统默认操作是终止进程运行、并生成核心转储文件;当调用 abort()函数之后,内核会向进程发送 SIGABRT 信号。使用abort()函数终止进程,会生成核心转储文件,可用于判断程序调用abort()时的程序状态。
2023-06-14 23:15:26
264
原创 【linux 信号学习十】实时信号
等待信号集只是一个掩码,仅表明一个信号是否发生,而不能表示其发生的次数。换言之,如果一个同一个信号在阻塞状态下产生了多次,那么会将该信号记录在等待信号集中,并在之后仅传递一次(仅当做发生了一次),这是标准信号的缺点之一。函数,也可以使用sa_handler函数,但是这个函数没有办法传递参数。
2023-06-14 23:13:54
115
原创 【linux 信号学习九】阻塞和等待信号
sigsuspend函数会将mask信号集替换进程的信号掩码,然后挂起进程,直到捕获到信号被唤醒(如果捕获的是mask中的信号,则不会被唤醒,继续挂起)、并从信号处理函数返回,一旦从信号处理函数返回,sigsuspend()会将进程的信号掩码恢复成调用前的值。如果进程在执行信号处理函数期间接收到了处在信号掩码中的成员,内核会将其阻塞,将该信号添加到进程等待信号集(等待被处理,处于等待状态的信号)中,可以使用sigpending函数获取正在等待的信号集。:获取正在等待处理的信号的集合。
2023-06-14 23:09:25
308
原创 【linux 信号学习八】信号掩码
内核为每一个进程维护了一组信号掩码(其实就是一组信号集合)。当进程接收到一个属于信号掩码中的信号时,该信号将会被阻塞,无法传递进程进行处理。内核会将该信号阻塞,直到该信号从信号掩码中删除内核才会把信号传递给进程,从而得到处理。应用程序调用signal()函数或sigaction()函数为某一信号设置处理方式时,会自动将改信号添加到信号掩码中。对于sigaction函数是否会添加和SA_NODEFER标志有关。当信号处理函数结束返回后,信号自动从信号掩码中移除。
2023-06-14 23:08:09
216
原创 【linux 信号学习七】获取信号描述信息
linux系统中的每一个信号都有一串与之相对应的字符串描述信息,用于对该信号进行相应的描述。这些字符串位于sys_siglist数组中。sys_siglist数组是一个char * 类型的数组,数组中的每一个元素存放的是一个字符串指针,指向一个信号的描述信息。
2023-06-14 23:06:03
66
原创 【linux 信号学习六】信号集
信号集:一个能表示多个信号的数据类型(signal set),很多系统调用都用到了这中数据类型做为参数传递,例如sigaction(),sigprocmask(),sigpending()。:初始化一个自定义信号集,与sigemptyset不同的是,该函数将所有标志位都设置为1,用于快速创建一个包含所有信号的的信号集,然后在根据需求删除不需要的信号。:初始化一个自定义的信号集,也就是将信号集中的所有标志位都置0,使得这个信号集不包含任何信号,不阻塞任何信号。:测试某一个信号是否在信号集中。
2023-06-14 22:59:56
230
原创 【linux 信号学习五】 alarm()和pause()函数
2、alarm闹钟并不能循环触发,只能触发一次,若要实现循环触发,可以在SIGALARM信号处理函数中再次调用alarm()函数设置定时器。:可以使得进程暂停运行、进入休眠状态,直到进程捕获一个信号为止,只有执行了信号处理函数并返回时,pause才返回。:设置一个定时器,当定时时间到,内核会向进程发送SIGALRM信号。返回值:-1,并且将errno设置为EINTR。1、每个进程只能设置一个alarm闹钟;
2023-06-14 22:55:09
241
原创 【linux 信号学习四】发送信号
在进程中将信号发送给另一个信号是需要权限的,信号的发送者和接收者的实际用户ID或有效用户ID必须相等。raise()相当于kill(getpid(), sig);:将信号发送给指定进程或进程组中的每一个进程。
2023-06-14 22:54:43
85
原创 【linux 信号学习三】注册信号
设置信号处理方式,推荐使用,与signal相比,sigaction更具有灵活性和可移植性。给结构体在可以使用man手册查看sigaction()函数帮助信息时,在下面会有介绍。:修改指定信号的行为,也可以用来忽略和恢复默认行为。
2023-06-14 22:52:46
174
原创 【linux信号学习二】信号量
终止进程,SIGTERM是一种由操作系统发送给进程的信号,通常用于请求该进程优雅地终止。这个信号的处理方式可以由进程自行定义,但一般来说,进程应该在收到SIGTERM信号后立即停止其正在进行的工作,并释放所有已经占用的资源,如打开的文件、分配的内存等等。SIGTERM信号可以由系统管理员或其他进程发送,例如使用kill命令将信号发送给目标进程。:在一个进程终止或停止时,将SIGCHLD信号发送给其父进程,安系统默认将忽略此信号,如果父进程希望被告知其子系统的状态,则应捕捉词信号。
2023-06-14 22:45:56
55
原创 【linux 信号学习一】信号基础
实时信号都支持排队,都是可靠信号,保证了发送多个信号都能被接收,可用于进程。进程,信号通常是发送给对应的进程的,当信号到达后,该进程做出相应的处理。不同系统信号的实际编号可能不同,所以在程序中一般使用信号的名字。新的信号发送函数:sigqueue()、sigaction():有可能会丢失的信号,信号值小于34的信号都是不可靠信号,非实时信号都不支持排队,都是不可靠信号,一般称为标准信号,
2023-06-04 16:07:04
39
原创 【sqlite3学习二】C语言操作
一般只执行一次的sql语句使用sqlite3_exec(),需要多次执行的使用sqlite3_prepare_v2,可以提高速率,例如插入和读取数据库数据。读取数据与插入数据差不多,只不过读取数据使用的是sqlite3_column_xx系列函数,该系列函数是从执行完sqlite3_step的结果的当前行中读取一列值(即某一行的某一列值)这篇主要是sqlit3的库函数使用,sql语句在上篇中,但是c的sql语句是可以使用占位符的,占位符为“?第二个参数:序号,从1开始,代表第几列。
2023-05-20 14:00:10
287
原创 【sqlite3学习一】sqlite3基本语句
主键是唯一的 ID。执行完该语句后,成功创建数据库文件后,会提供一个sqlite>提示符,此时还需要执行下面命令,如果不执行在退出sqlite后,用 ls 查看是没有数据库文件的。上面提到的where可以用来筛选数据,所以where不仅可以与select联合使用,也可以与updata、delete语句联合使用。创建数据库表需要使用CREATE关键字,还需要定义表中的列,以及列的数据类型 可以选择是否需要约束。例如:创建一个名为人员信息的表,存储姓名、年龄、性别、住址和联系方式,可以使用如下方式创建。
2023-05-20 11:01:00
984
原创 【Mongoose学习笔记一】简单使用
Mongoose是一个C/C++的网络库,它为TCP、UDP、HTTP、WebSocket、MQTT实现了事件驱动的、非阻塞的API。事件管理结构体事件管理结构,包含活动连接列表以及一些管理信息。连接结构体初始化事件管理结构体将活动连接列表设置为NULL设置IPv4和IPv6的默认DNS服务器设置默认DNS查找超时时间mgr:指向需要初始化的mg_mgr结构的指针无返回值执行单个轮询1. 查看是否有传入数据。
2023-05-07 22:53:57
1622
rust代码与c代码相互调用,rust调用c动态库静态库,以及rust代码之间的相互引用
2024-01-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人