Linux系统编程-串口通信
串口设备文件在Linux系统中,串口设备通常以文件形式存在于/dev/目录下:
/dev/ttyS0 - COM1 (传统串口)
/dev/ttyUSB0 - USB转串口设备
/dev/ttyAMA0 - Raspberry Pi等平台的串口
tcgetattr 和 tcsetattr 函数详解这两个函数是Linux系统编程中用于配置终端(包括串口)属性的核心函数,它们操作termios结构体来控制终端的各种行为。
函数原型12345#include <termios.h>#include <unistd.h>int tcgetattr(int fd, struct termios *termios_p);int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
tcgetattr 函数功能获取与文件描述符fd关联的终端的当前参数,并将其存储在termios_p指向的结构体中。
参数
fd: 打开终端设备的文件描述符
termios_p: 指向struct t ...
Linux系统编程-C语言常用字符串处理函数
strlen - 计算字符串长度功能:计算一个字符串的长度,即从起始地址开始到第一个空字符('\0')前的字符个数(不包括'\0'本身)。
原型:
1size_t strlen(const char *str);
参数:
str:要计算长度的字符串的指针。
返回值:
返回字符串的长度,类型为 size_t(通常是无符号整数)。
重要特点:
它只是遍历内存,直到遇到 '\0' 为止。如果传入的指针不是指向一个以 '\0' 结尾的字符串,函数会继续访问后面的内存,导致未定义行为(如崩溃)。
示例:
123456789#include <stdio.h>#include <string.h>int main() { char str[] = "Hello"; size_t len = strlen(str); // len = 5 printf("The length of '%s' is %zu.\n", ...
Linux系统编程-通过sys子系统控制gpio
重要提示:sysfs GPIO 接口自 Linux 4.8 起已被标记为已弃用,并在 Linux 5.3 之后开始逐步移除。
基本原理sysfs 是一个虚拟文件系统,它将内核中的设备、驱动等信息映射到用户空间,以文件和目录的形式呈现。
对于 GPIO,其控制接口位于 /sys/class/gpio/。
将 gpio 写入 /sys/class/gpio/export ,就可将此 gpio 从内核空间导出到用户空间。例如:
1echo 12 > /sys/class/gpio/export
导出后,在 /sys/class/gpio/ 目录下就会生成一个 gpio12 目录。其目录结构如下:
gpio12├── active_low├── device -> ../../../gpiochip0├── direction├── edge├── power│ ├── autosuspend_delay_ms│ ├── control│ ├── runtime_active_time│ ├── runtime_status│ └── runtime_su ...
Linux系统编程-通过sys子系统控制led
Linux sys 子系统在 Linux 系统中,“sys 子系统” 通常指以 sysfs 虚拟文件系统 为核心的一套内核子系统。
它是 Linux 设备模型的用户空间接口,主要用于 暴露内核对象(如设备、驱动、内核组件等)的信息、属性及层次关系,并提供用户空间与内核对象的交互通道。
sysfs 最早在 Linux 2.6 内核中引入,如今已成为 Linux 设备管理、内核状态监控的核心组件之一。
1.1 sys 子系统的核心:sysfs 虚拟文件系统sysfs 的本质是一个 内核态与用户态之间的 “桥梁”,它通过虚拟文件的形式将内核中的对象(如设备、驱动、总线等)及其属性映射到用户空间(挂载点通常为 /sys)。
用户可通过读写 /sys 下的文件,直接获取内核对象信息或修改其配置(需权限)。
与 proc 文件系统(/proc)不同,sysfs 更强调 “层次化结构” 和 “对象属性”:
proc 侧重进程状态、系统全局信息(如 /proc/cpuinfo);
sysfs 则聚焦于设备、驱动等内核对象的 “结构化信息”(如设备的厂商、状态、配置参数),且数据格式更规范(多为键值对 ...
Linux系统编程-文件IO操作
文件描述符(File Descriptor)在 Linux 中,所有打开的文件都通过文件描述符(非负整数)来标识。默认的三个文件描述符:
0:标准输入(STDIN)
1:标准输出(STDOUT)
2:标准错误(STDERR)
类型:int
范围:0 ~ 1023,每个进程最多允许打开 1024 个文件/资源。
打开文件:open()功能:打开或创建一个文件,并返回文件描述符。
函数原型:
123#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);
参数说明:
pathname:文件路径
flags:打开方式(必须包含且只能包含以下之一)
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
可选标志:O_CREAT(创建文件)、O_TRUNC(清空文件)、O_APPEND(追加模式)等
mode:当使用 O_CREAT 时,指定新文件的权限(如0644)
返回值:
成功: ...
基于立创泰山派的Linux驱动开发笔记
资料汇总硬件设计立创-泰山派开发板
文档资料【立创·泰山派RK3566】开发板
视频资料BiliBili-立创泰山派训练营
BiliBili-泰山派驱动开发
BiliBili-北京迅为-嵌入式学习之Linux驱动篇
开发环境搭建在虚拟机上安装 Ubuntu18虚拟机介绍虚拟机(Virtual Machine,简称VM)是一种计算机软件模拟的计算机系统。它模拟了足够多的硬件,以实现一个完整的、独立的计算环境,可以在一个物理机器(宿主机)上同时运行多个独立的操作系统(客户机操作系统)。虚拟机的关键特性包括:
隔离性:每个虚拟机都运行在自己的环境中,与其他虚拟机和宿主机操作系统隔离,这意味着一个虚拟机的崩溃或故障不会影响到其他虚拟机或宿主机。
封装性:虚拟机通常以文件形式存在,可以很容易地备份、复制、迁移或恢复。
硬件无关性:虚拟机可以在不同的物理硬件上运行,只要该硬件上安装了相应的虚拟化软件。
资源分配:虚拟机可以指定分配给它的CPU、内存、存储和网络资源,允许用户根据需要调整资源分配。虚拟机通常由以下几部分组成:
虚拟化层(Hypervisor):这是运行在物理硬件上的软件层,负责 ...
bit1个数计算算法
BK算法(Brian Kernighan’s算法)123456789101112unsigned char countBit1InByte(unsigned char byte){ unsigned char count = 0; while (byte) { byte &= (byte - 1); count++; } return count;}
此算法的思想是利用 n & (n-1) 可以将 n 的最右边的 1 置零的特性,通过迭代直到 n 变为 0,统计迭代次数即可。
它的运行时间与字节中bit1的位数成正比,而不是与字节的总位数成正比。因此计算效率不稳定,适用于bit1较少的场景。
位移法123456789101112131415161718192021222324252627282930313233#include <stdio.h> typedef unsigned char BYTE;typedef unsigned short WOR ...
bat脚本
🚲 🚗 ✈️ 🚀
🚀 桌面快捷方式箭头和盾牌去除123456789101112131415@REM 此脚本需要以管理员身份运行@REM 快捷方式小箭头和需要提权运行的提示图标均为透明图标reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,197" /t reg_sz /freg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 77 /d "%systemroot%\system32\imageres.dll,197" /t reg_sz /f@REM 关闭文件资源管理器taskkill /f /im explorer.exe@REM 清除原先的图标缓 ...
RaspberryPi-PICO新建工程
🚲 🚗 ✈️ 🚀
🚀 工程文件目录组成以创建一个 blink 工程为例
首先新建一个 blink 目录,该目录结构如下所示:
1234567.└── blink ├── build ├── CMakeLists.txt ├── main │ └── blink.c └── pico_sdk_import.cmake
build 和 main 是目录,build 用于存放编译后的文件,main 目录则用于存放工程相关的 .c 和 .h 文件。
pico_sdk_import.cmake 这个文件是从 pico-sdk 中拷贝过来的,拷贝命令如下:
1cp $PICO_SDK_PATH/external/pico_sdk_import.cmake .
CMakeLists.txt 是 CMake 的配置文件,内容如下:
123456789101112131415161718192021222324# 指定最低的cmake版本cmake_minimum_required(VERSION 3.12)# 指定依赖文件include(pico_sdk_im ...
LeetCode面试必刷75题
🚲 🚗 ✈️ 🚀
🚀 交替合并字符串 - 简单题目:
给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。
如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
示例 1:
输入:word1 = “abc”, word2 = “pqr” 输出:”apbqcr” 合并后: apbqcr
示例 2:
输入:word1 = “ab”, word2 = “pqrs” 输出:”apbqrs” 解释:注意,word2 比 word1 长,”rs” 需要追加到合并后字符串的末尾。 合并后:apbqrs
示例 3:
输入:word1 = “abcd”, word2 = “pq” 输出:”apbqcd” 解释:注意,word1 比 word2 长,”cd” 需要追加到合并后字符串的末尾。 合并后:apbqcd
题解 - 暴力求解定义一个数组或列表,依次读取word1和word2的字符并存储在该数组上,最后返回该数组。
12345678910111213141 ...