镜像烧录+ssh远程登录
1.系统安装1.1启动设置选择SD卡启动,首先需要将启动拨码开关配置成SD卡启动模式,配置方法如下图: 1.2镜像下载**下载地址:**通过如下百度云盘链接或者联系销售获取到镜像,镜像链接:https://pan.baidu.com/s/1pStiyqohrB3SxHAFFk8R6Q 提取码:dzdv ==注意:==镜像需下载对应内存大小的版本,目前 4GB DDR使用长鑫存储( CXMT)的颗粒 ,2GB DDR使用兆易创新( GigaDevice)的颗粒,如果不清楚开发板是哪个容量的 DDR,可通过DDR颗粒的上丝印字样来判断。我们拿到的是最拉的板子4GB的V2.2版本的开发板。 4GB-V2.2可以选择的镜像:(按照更新的时间来排序的) xfce_v2.1_4GB_231116.tar.gz xfce_v2.1_4GB_240123.tar.gz 飞腾派v2.1_4GB_240517.tar.gz 本次项目选择的是xfce_v2.1_4GB_240123.tar.gz,不新不老。 1.3镜像烧录准备一张存储空间 32G以上的 SD卡...
常见问题
1.关机断电后无法进入桌面问题原因:烧录的镜像配置太拉跨 检查系统中实际安装的显示管理器,终端输入: 12# 列出所有显示管理器服务systemctl list-unit-files | grep -i display-manager 解决步骤1尝试修复原本的显示管理器当前默认的显示管理器是 sddmsddm(Simple Desktop Display Manager)。这表明系统使用的是 SDDM 1.1检查 SDDM 状态(如果 SDDM-pkg完整未损坏或丢失)终端中输入: 1sudo systemctl status sddm 如果 SDDM 没有运行尝试重新启动它: SDDM显示dead 1sudo systemctl start sddm 如果 SDDM 启动失败,查看具体的错误信息: 1journalctl -xe | grep sddm 问题: 如果该服务禁用了 服务禁用 启动 sddm 时失败 要取消对 sddm.service 的 mask,执行以下命令: 1sudo systemctl unmask sddm 1sudo system...
开发环境配置
环境配置本项目使用的是飞腾官方提供的镜像xfce_v2.1_4GB_240123.tar.gz,系统是ubuntu20.04,python3.9.5 建议使用Anaconda3配置一个虚拟环境,如果出错可以轻松从头再来,但本次为了懒得再安装一次系统本身自带的配置,于是没有采用该方法。但在最后讲了应该如何在飞腾派中安装anaconda3并配置虚拟环境,有兴趣的话可以试一下。 Python3.9安装飞腾派镜像默认下载了python3.8,但是本次项目拟采用python3.9,固需要升级 1.通过系统包管理器安装在 Ubuntu 20.04 上,可以通过以下步骤安装 Python 3.9: 更新包管理器索引: 1sudo apt update 安装 Python 3.9: 1sudo apt install python3.9 python3.9-distutils 验证安装: 1python3.9 --version 2.设置默认 Python 版本(可选)如果你想让 python3 命令默认指向 Python 3.9,可以创建一个符号链接: 123sudo update-a...
驱动开发-PWM
PWM(Pulse Width Modulation)基础概念与理论1.什么是 PWM?它的主要参数是什么? PWM (Pulse Width Modulation) 即脉冲宽度调制,是一种通过控制数字信号在一个周期内高电平时间(脉宽)与周期时间之比(占空比)来模拟连续电平的技术。 主要参数: 周期 (Period) / 频率 (Frequency): 一个完整 PWM 波形的持续时间 (T)。频率 f = 1 / T。 占空比 (Duty Cycle): 高电平时间 (Ton) 占整个周期 (T) 的百分比 (D = (Ton / T) * 100%)。 极性 (Polarity): PWM 信号有效电平(Active Level)是高电平有效 (Normal) 还是低电平有效 (Inversed)。 2.应用场景 电机控制: 调节速度和方向(如直流电机、步进电机)。 LED 调光: 控制亮度(通过改变平均电流)。 电源管理: DCDC 转换器输出电压调节(通过控制开关管导通时间)。 音频: 简单的 D 类放大器。 伺服控制: 控制舵机角度(特定脉宽范围对应特...
驱动开发-并发与竞争01原理
竞争的概念什么是竞争Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。 Linux 系统并发产生的原因有下面几个主要原因: ①多线程并发访问,Linux 是多任务(线程)的系统,所以多线程访问是最基本的原因。 ②抢占式并发访问,从 2.6 版本内核开始,Linux 内核支持抢占,也就是说调度程序可以在任意时刻抢占正在运行的线程,从而运行其他的线程。 ③中断程序并发访问 ④SMP(多核)核间并发访问,现在 ARM 架构的多核 SOC 很常见,多核 CPU 存在核间并发访问。 ==所谓的临界区就是共享数据段,对于临界区必须保证一次只有一个线程访问==,也就是要保证临界区是原子访问的 什么是共享资源共享资源是指在同一时间内可以被多个执行单元(如进程、线程、中断处理程序、内核任务等)访问(读取或修改) 的任何数据、数据结构、硬件设备或状态信息。 关键特性: 并发访问可能性: 多个执行单元(几乎)同时或在时间上重...
驱动开发-并发与竞争02原子操作
原子操作原子操作就是指不能再进一步分割的操作,一般原子操作用于变量或者位操作。 原子操作 API 函数Linux内核定义了叫做 atomic_t 的结构体来完成用于 32 位整数的原子操作。在使用中用原子变量来代替整形变量,此结构体定义在 include/linux/types.h 文件中,定义如下: 123typedef struct { int counter;} atomic_t; 用于 64 位整数的原子操作 (在支持 64 位原子操作的体系结构上)。 123typedef struct { long long counter;} atomic64_t; 初始化1234567//-------编译时初始化:-----ATOMIC_INIT(int i);// 静态初始化 atomic_t 变量为 iatomic_t v ATOMIC_INIT(0);// 示例atomic64_t v64 = ATOMIC64_INIT(0); // 64位初始化宏//------运行时初始化:-------atomic_t vatomic...
驱动开发-并发与竞争03自旋锁
自旋锁自旋锁的核心思想是 “忙等待” (Busy-Waiting)。当一个执行单元(CPU 核心、进程上下文线程、中断上下文等)尝试获取一个已经被其他执行单元持有的自旋锁时,它不会进入睡眠状态(阻塞),而是会在一个紧凑的循环中不断地检查锁的状态(”旋转”),直到锁被释放。 忙等待: 核心行为: 获取锁失败的执行单元在 CPU 上循环检查锁的状态 (while (lock_is_held);)。它持续占用着 CPU 核心,不做其他有用工作。 目的: 避免了进程上下文切换的开销(保存/恢复寄存器、更新数据结构、调度等)。在锁被持有时间非常短的情况下,忙等待的总开销可能小于睡眠唤醒的开销。 代价: 如果锁被持有时间较长,忙等待会浪费大量 CPU 周期,显著降低系统性能。因此,自旋锁只适用于临界区执行时间非常短的场景。 互斥性: 自旋锁保证在任意时刻,最多只有一个执行单元持有锁,从而确保对共享资源的互斥访问。 不可睡眠: 最重要规则: 在持有自旋锁期间,执行单元绝对不能睡眠(阻塞)或主动放弃 CPU(如调用 schedule(), kmalloc(GFP_KER...
驱动开发-并发与竞争04信号量
信号量信号量是 Linux 内核中一种允许进程进入睡眠状态等待资源的同步机制。它与自旋锁的“忙等待”形成鲜明对比,适用于**临界区执行时间可能较长、或者执行过程中可能发生阻塞(睡眠)**的场景。Linux 内核也提供了信号量机制,信号量常常用于控制对共享资源的访问。 其核心原理基于一个计数器和一个等待队列: 计数器 (count): 表示可用资源的数量。 当 count > 0 时,表示有资源可用,进程可以立即获取资源(减少计数器)并继续执行。 当 count = 0 时,表示资源已被占用完,后续试图获取资源的进程需要睡眠等待。 计数器初始值决定了信号量的类型: 初始值 = 1: 称为互斥信号量 (Mutex Semaphore) 或二进制信号量 (Binary Semaphore)。这是最常用的类型,用于实现互斥访问,保证同一时刻只有一个进程可以进入临界区。它本质上可以当作一个允许睡眠的锁来用。 初始值 = N (N > 1): 称为计数信号量 (Counting Semaphore)。用于控制对一类有多个实例的资源(如 N 个空闲缓冲区、N ...
驱动开发-并发与竞争05互斥锁
互斥锁提供比自旋锁更安全的互斥机制,支持睡眠等待,适用于可能阻塞的长临界区场景。 关键特性 强所有者模型: 仅持有者线程可解锁 严格禁止递归锁定 状态跟踪: owner 字段存储持有者的 task_struct 指针 + 状态标志位 12345[ 持有者地址 | flags ]// flags 位含义:// bit0: 锁是否被持有 (MUTEX_FLAG_HOLD)// bit1: 是否有等待者 (MUTEX_FLAG_WAITERS)// bit2: 是否启用乐观自旋 (MUTEX_FLAG_HANDOFF) 乐观自旋优化: 当 CONFIG_MUTEX_SPIN_ON_OWNER 启用时 若持有者正在运行,新竞争者短暂自旋而非立即睡眠 等待队列: 竞争失败线程加入 wait_list 并进入 TASK_UNINTERRUPTIBLE 状态 上下文限制严格 1234// 禁止在中断上下文使用void interrupt_handler() { mutex_lock(&lock); // 触发 BUG()} ...
文件系统-01初识文件系统
文件系统磁盘的格式化与挂载简化的Linux文件系统磁盘布局结构图如下: 虚拟机操作实验 首先我们通过添加一个磁盘文件 选择添加硬盘 选择SCSI(S)类型的磁盘 选择创建新的虚拟磁盘 设定磁盘大小为4MB,并且将虚拟磁盘存储为单个文件 点击完成 我们打开虚拟机终端,切换到管理员模式 1su 查看系统有哪些磁盘 1fdisk -l 我们可以看到我们添加的新磁盘为 /dev/sdb,接下来我们开始格式化添加的磁盘,我们将磁盘格式化为minix格式 1mkfs.minix /dev/sdb 根据上图我们可以看出格式化之后文件系统创建了 创建了 1376 个 inode(索引节点) 创建了 1376 个 inode(索引节点)。 inode数量 ≈ 磁盘大小 / 预期平均文件大小此处 4MB / 1376 ≈ 3KB/文件,适合存储大量小文件。 文件系统被划分为 4096 个数据块 块大小:根据后续参数计算为 1024 字节(1KB)(见下方推导)。 总磁盘空间:4096 块 × 1024 字节/块 = 4,194,304 字节 = 4MB,符合设...