- 博客(49)
- 收藏
- 关注
原创 SQLite3学习笔记6:UPDATE(改)+ DELETE(删)数据(C API)
【代码】SQLite3学习笔记6:UPDATE(改)+ DELETE(删)数据(C API)
2026-01-28 09:25:27
47
原创 SQLite3学习笔记5:INSERT(写)+ SELECT(读)数据(C API)
【代码】SQLite3学习笔记5:INSERT(写)+ SELECT(读)数据(C API)
2026-01-27 14:10:20
82
原创 SQLite3学习笔记3:UTC和CST 时区偏差问题
原始数据存 UTC(国际标准,便于跨时区设备溯源),查询时转换为 CST(UTC+8)。直接存储 CST 时间 —— 适合仅在国内使用、无需跨时区的嵌入式设备。,所以数据库中记录的时间会比本地时间少 8 小时。:插入 / 更新时显式指定时区偏移,让。,而 Ubuntu 系统显示的是。
2026-01-27 14:06:32
103
原创 SQLite3学习笔记2:SQL 基础语法
SELECT 是嵌入式中读取数据的核心,支持 “全量查(调试)”、“指定字段查(省内存)”、“条件查(精准读)”,完全适配嵌入式设备内存有限的特点。数据表是存储数据的核心载体,嵌入式场景中常用 “设备参数 / 传感器数据 / 日志” 等表,以下是贴合嵌入式的表结构设计。命令后紧跟文件名即可实现 “不存在则创建、存在则打开”,这是嵌入式场景的核心特性(无需配置服务,直接操作文件)。嵌入式场景中,INSERT 用于将传感器数据、设备电压 / 电流等参数写入数据库,以下是适配嵌入式的语法和操作。
2026-01-27 14:04:45
643
原创 网络编程:UDP Socket
UDP 没有连接,不知道数据从哪来,所以接收时必须同时拿“信的数据”和“发信人的地址”。UDP 使用与 TCP 完全相同的地址结构体,没有区别。UDP 没有连接,发送时必须每次都指定“发给谁”。负责接收数据,打印发送者 IP,并原样回传。负责发送数据到指定 IP,并等待回复。
2025-12-17 10:30:32
984
原创 外设与接口:基于内核 gpio-keys 子系统的按键处理
是一个平台驱动(Platform Driver),它充当了物理 GPIO 硬件与 Linux 标准输入子系统(Input Subsystem)之间的“翻译官”。以下是基于 RK3566 Armbian 环境的标准操作流程。为了简化软件配置,优先选择硬件默认电平与电路逻辑相符的引脚。应用层不需要包含任何 GPIO 相关的头文件,只需要标准的 Input 子系统头文件。文件放入系统指定的 Overlay 目录,并修改启动配置。,该文件描述了按键的物理属性和逻辑键值。下生成一个新的节点(例如。
2025-12-14 17:00:47
552
原创 网络编程:TCP Socket
传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过“三次握手”建立连接,通过“确认应答”机制保证数据不丢失。
2025-12-10 16:54:51
758
原创 多线程编程:信号量
协调多个线程的执行顺序,使它们按照预定的逻辑次序运行。例如,线程 A 必须等待线程 B 完成某个任务后才能继续执行。信号量初始值设为 0,A 调用。POSIX 信号量分为无名信号量 和有名信号量。在多线程编程中,主要使用无名信号量。阻塞,B 完成后调用。
2025-12-10 13:25:22
832
原创 多线程编程:数据传递与结果返回
在 C 语言中,线程函数的参数和返回值必须都是void *,这意味着任何数据类型(整数、浮点数、结构体)在传递时,都必须包装成指针。是void *;返回值也是void *。void *就像一个通用包裹,可以在里面装任何东西(一个数字、一个结构体、一个字符串),但必须确保包裹(指针)本身是有效的。有4种常见的方法来在线程间传递数据。
2025-12-09 14:56:33
402
原创 多线程编程:初识线程
一般情况下,进程中各个线程的运行是相互独立的,线程的终止并不会相互通知,也不会影响其他的线程, 终止的线程所占用的资源不会随着线程的终止而归还系统,而是仍为线程所在的进程持有, 这是因为一个进程中的多个线程是共享数据段的。在线程创建后,系统就开始运行相关的线程函数,在该函数运行完之后,该线程也就退出了, 这是线程的一种隐式退出的方法。函数是用于创建一个线程的,创建线程实际上就是确定调用该线程函数的入口点, 在线程创建后,就开始运行相关的线程函数。函数,让线程显式退出,这是线程的主动行为。
2025-12-09 14:52:56
1019
原创 外设与接口:input子系统
如按键、键盘、触摸屏和鼠标等输入设备的驱动方式是类似的,当出现按键、触摸等操作时,硬件产生中断,然后 CPU 直接读取引脚电平,或通过 SPI、I2C 等通讯方式从设备的寄存器读取具体的按键值或触摸坐标,然后把这些信息提交给内核。使用 input 子系统 驱动的输入设备可以通过统一的数据结构提交给内核,该数据结构包括输入的时间、类型、代号以及具体的键值或坐标,而内核则通过 /dev/input 目录下的文件接口传递给用户空间。字段,找到想要控制的设备,记下设备对应的。),编写程序需要用到。
2025-12-09 14:51:13
199
原创 外设与接口:IIO的使用
IIO(Industrial I/O)子系统是 Linux 内核中的一个重要组成部分,专门用于处理各种工业和嵌入式应用中的模拟输入和输出设备。IIO 子系统的主要目标是提供一个通用的、统一的框架,以便在 Linux 中支持各种不同类型的模拟设备。IIO 子系统通过 sysfs 文件系统和用户空间提供了统一的接口,允许用户轻松地访问和配置模拟设备。目录中,包含了与系统中检测到的 IIO 设备相关的子目录。每个设备子目录中包含了一组属性文件,这些文件用于获取和配置 IIO 设备的各种参数和状态。
2025-12-09 14:46:16
571
原创 外设与接口:UART的使用
随着时间的推移,TTY 的概念也扩展到串口设备,如ttyn、ttySACn等。在 Linux 系统中,终端设备的支持非常强大,它们通常通过特殊的设备文件进行访问和控制,从而实现串口通信。两个宏定义的宏值都为1,表示支持c_ispeed和c_ospeed表示方式, 部分标准中不支持使用这两个结构体成员表示波特率,而只使用c_cflag来表示。目录中,每个 UART 设备都有其自己的目录,这些目录的名称是 ttyS 加上串口号,:这是较新的标准引入的成员,用于支持更高的或分离的波特率。
2025-12-09 14:41:29
634
原创 外设与接口:SPI的使用
在 Linux 操作系统中,SPI 子系统是一个关键的驱动框架,用于管理和控制通过 SPI 总线连接的各种外部设备,有关 SPI 子系统的更多详细信息可以在。SPI 是全双工的,发送一个字节的同时,必然会接收一个字节。可以利用这个特性进行自测,用一根杜邦线,将SPI3 的 MOSI 和 MISO 引脚短接。在编写应用程序时需要使用ioctl函数设置spi相关配置,其函数原型如下。用户GPIO中引出了一组SPI接口(SPI3)。代表 SPI 总线号(Bus 3),查看设备节点,应该看到类似。
2025-12-08 09:09:44
803
原创 外设与接口:I2C的使用
在 Linux 操作系统中,I2C 子系统是一个关键的驱动框架,用于管理和控制通过 I2C 总线连接的各种外部设备,有关 I2C 子系统的更多详细信息可以在。Linux 提供了一套 I2C 调试工具 i2c-tools。用户GPIO中引出了两组I2C,分别是I2C2与I2C3。通过以下程序,可以实现 i2c-2 总线上的设备扫描。
2025-12-08 09:07:03
814
原创 外设与接口:使用libgpiod操作GPIO
libgpiod是 Linux 官方提供的用于与 GPIO 字符设备()交互的 C 语言库。自 Linux 内核 4.8 起,它替代了旧的 sysfs 接口(),提供了更安全、高效、线程安全的 API,支持事件驱动、多引脚操作等高级特性。
2025-12-08 09:05:03
820
原创 外设与接口:PWM的使用
在成功导出 PWM 的一个通道后,会在该 PWM 的设备目录下生成单个通道的目录,其中有这个通道对应的属性文件,用户可以通过修改这些文件的内容来配置和控制特定 PWM 通道的各个参数,以实现对 PWM 信号的精确控制。PWM,全称为脉冲宽度调制(Pulse Width Modulation),是一种通过控制信号的脉冲宽度来实现模拟信号输出的技术。的形式命名,其中 X 是 PWM 设备的编号。其中,pwmchip1对应PWM8_M0,pwmchip2对应PWM9_M0,pwmchip3对应PWM14_M0。
2025-12-08 09:00:33
576
原创 外设与接口:GPIO的使用
当导出一个 GPIO 引脚时,内核会动态创建相应的目录和文件,以便用户空间程序可以访问和控制该引脚。,每次对文件执行写入操作时,会触发驱动代码,使用这次写入的内容作为参数来修改 gpio101 的引脚电平;在将 GPIO 引脚导出到用户空间时,通常需要用到引脚编号,可以通过接口图进行确定,如 18 号引脚的引脚名称为 GPIO3_A5,引脚编号为 101。导出到用户空间是指将内核空间中的资源(如 GPIO 引脚、设备状态等)通过某种机制暴露给用户空间程序,使得用户程序可以访问和控制这些资源。
2025-12-05 09:16:15
787
原创 泰山派解决pip安装报错:is not a supported wheel on this platform
其中有一个(‘cp37’, ‘cp37m’, ‘linux_aarch64’)对应要安装的python3.7版本的whl,那么whl文件中应该是linux_aarch64而不是manylinux_2_17_aarch64.manylinux2014_aarch64,所以将文件名改成rknn_toolkit_lite2-2.3.2-cp37-cp37m-linux_aarch64.whl,然后再进行安装,结果安装成功。下载的包不符合所在的平台的安装whl的名称规范,所以出错。
2025-12-05 08:57:43
296
原创 容器内调用QEMU运行程序找不到运行时库
交叉编译工具链在安装时,其实已经准备好了目标平台(ARM64)的所有库和链接器。它们被打包在一个叫做 sysroot。为了让每次启动的容器都自动配置好这个环境,可以把它写进 Dockerfile。可以通过设置环境变量,让 QEMU 自动去这个路径找库。(系统根目录)的地方。只需要告诉 QEMU 去哪里找它就行。) 是 x86_64 架构的 Ubuntu。这个环境变量在当前容器会话中一直有效。修改 Dockerfile,在。这次,程序应该就能成功运行了。对于 Ubuntu 上通过。容器,其根文件系统 (
2025-12-05 08:46:53
411
原创 为宿主机注册QEMU解释器
编译出了一个 ARM64 架构的程序,但运行它的环境试图让宿主机的 x86_64 CPU 直接执行它,这当然会失败。的设置,设置好后,所有的容器都能受益。这是最简单、最可靠的方法,不依赖宿主机是什么 Linux 发行版。当内核看到一个它不认识的二进制文件(比如 ARM64 的)时,它会自动调用。当这个容器执行完配置并退出后,这些规则已经被写入了宿主机的内核。如果宿主机是 Ubuntu 或 Debian,也可以直接安装。来“翻译”并执行这个程序。包,它通常会自动完成注册。),就说明注册成功了。
2025-12-05 08:43:51
409
原创 使用Docker配置适配泰山派的交叉编译环境
基于一个干净的 Ubuntu 镜像,手动安装所需的工具链。在项目目录下,创建一个Dockerfile文件。输出应该类似这样,明确指出是。
2025-12-04 12:14:32
275
原创 Docker基础使用
在开发阶段,不需要每次都 Build,可以创建一个 GCC 环境作为开发环境,并把宿主机的文件夹映射到容器里。实现在本地改代码,Docker 里编译程序,而且这个程序直接出现当前目录下。指令不仅仅是引入一个基础镜像,它实际上是开启了一个全新的构建阶段。第一阶段用大体积的编译镜像生成可执行文件,第二阶段只把最终的可执行文件复制到一个干净、小巧的运行镜像中。在使用非root用户输docker命令需要sudo,在 Linux 中,可以把当前用户加入。因为官方下架了dockerhub的镜像,更换一个阿里的镜像源。
2025-12-04 12:11:59
534
原创 在Ubuntu中配置适配泰山派的交叉编译环境
上述命令编译得到的可执行程序 hello 可以在 Ubuntu 中运行,但是如果把它放到泰山派上去,它是无法执行的。因为它是使用 gcc 编译的,是给 PC 机编译的,里面的机器指令是 x86 的。从官网下载软件包后(以gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu为例),要将交叉编译工具的路径添加到系统的。环境变量中,以便可以在任何地方使用交叉编译工具,可以在shell配置文件中添加以下行(通常是。,具体取决于使用的shell),注意。
2025-12-04 12:10:27
342
原创 Linux常用指令“ls -al”及其输出拆解
含义:文件内容最后一次被修改的时间。注意:对于目录,这个时间指的是目录内容(即文件列表)发生变化的时间,比如在其中创建、删除、重命名了文件。Linux实际上有三种时间戳,ls -l默认显示的是mtime。可以使用命令查看所有三个时间戳。mtime(modification time): 内容修改时间。atime(access time): 最后访问时间(读取文件内容会更新)。ctime(change time): 元数据修改时间(比如修改权限、所有者、文件名等)。
2025-12-04 12:07:43
579
原创 泰山派连接WiFi和安装SSH
ifconfig 查看网络状态,ping baidu.com, 测试OK。会列出所有已保存的连接,包括WiFi名称(NAME列)。ps:手机热点要将频段设为2.4GHz。直接nnmcli命令连接WIFI。使用SSH工具进行连接(
2025-12-04 12:03:04
360
原创 STM32学习笔记16:USART串口数据包
数据包的作用是把一个个单独的数据打包起来,方便进行多字节的数据通信。数据包的任务就是把属于同一批的数据进行打包和分割,方便接收方进行识别。数据包有多种分割方式,比如在数据的高位添加标志位、额外添加包头包尾等,串口数据包通常使用的是额外添加包头包尾的方式。以下列举了两种数据包格式,第一种是固定包长,含包头包尾,也就是每个数据包的长度都固定不变,数据包前面是包头,后面是包尾;第二种是可变包长,含包头包尾,也就是每个数据包的长度可以是不一样的,前面是包头,后面是包尾。
2024-02-11 15:42:48
1972
1
原创 STM32学习笔记14:USART基本介绍
简单双向串口通信有两根通信线(发送端 TX 和接收端 RX)TX 与 RX 要交叉连接当只需单向的数据传输时,可以只接一根通信线当电平标准不一致时,需要加电平转换芯片USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器。
2024-02-09 23:14:29
2017
原创 STM32学习笔记12:DMA 的学习和使用
DMA(Direct Memory Access)直接存储器存取DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道),DMA2 只存在于大容量的单片机中每个通道都支持软件触发和特定的硬件触发。
2024-01-02 17:20:06
2727
原创 STM32学习笔记10:ADC基本介绍
ADC(Analog-Digital Converter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁12位逐次逼近型ADC,1us转换时间输入电压范围:0~3.3V,转换结果范围:0~409518个输入通道,可测量 16 个外部和 2 个内部信号源规则组和注入组两个转换单元模拟看门狗自动监测输入电压范围。
2023-12-30 22:59:14
1592
1
原创 STM32学习笔记9:TIM输入捕获
IC(Input Capture)输入捕获输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前 CNT 的值将被锁存到 CCR 中,可用于测量 PWM 波形的频率、占空比、脉冲间隔、电平持续时间等参数每个高级定时器和通用定时器都拥有 4 个输入捕获通道可配置为 PWMI 模式,同时测量频率和占空比可配合主从触发模式,实现硬件全自动测量从引脚进来,有一个三输入的异或门连接在通道 1、2、3 端口。异或门的执行逻辑是当三个输入引脚中的任何一个电平翻转时,输出引脚就发生一次电平翻转。
2023-12-27 19:40:02
4676
1
原创 STM32学习笔记8:TIM输出比较
OC(Output Compare)输出⽐较输出⽐较可以通过⽐较 CNT 和 CCR 寄存器值的关系,来对输出电平进⾏置1、置0或翻转的操作,⽤于输出⼀定频率和占空⽐的 PWM 波形每个⾼级定时器和通⽤定时器都拥有4个输出⽐较通道⾼级定时器的前3个通道额外拥有死区⽣成和互补输出的功能CCR 是捕获/比较寄存器,是输入捕获和输出比较共用的。当使用输入捕获时,它就是捕获寄存器;当使用输出比较时,它就是比较寄存器。通用定时器和高级定时器都有四个输出比较的通道,可以同时输出四路 PWM 波形。
2023-12-25 20:50:22
3162
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅