FreeRTOS 任务基础 任务状态 运行态(Running) 任务当前正在 CPU 上执行 在单核系统中,同时只有一个任务处于运行态 任务只有在调度器(Scheduler)选择它执行时,才会进入运行态 就绪态(Ready) 任务已经具备执行条件,但由于 CPU 资源被其他更高优先级任务占用,它暂时无法运行 任务处于就绪列表(Ready List),等待 FreeRTOS 调度它运行 当更高优先级任务阻塞或时间片 2025-04-02 嵌入式(RTOS开发)
Linux SPI驱动通用框架和编写细节 设备树 追加节点: 需要确保UART2节点为disabled,因IO占用 1234567891011121314/* Note: to enable ecspi3, uart2 node in imx6ul-14x14-evk.dtsi must be disabled */&ecspi3 { fsl,spi-num-chipselects = <1>; cs- 2025-04-02 嵌入式(Linux开发)
Linux I2C驱动通用框架和编写细节 I2C子系统架构 I2C子系统采用分层设计: I2C核心层 提供总线协议实现、设备注册/注销、总线通信接口(如i2c_transfer) struct i2c_adapter:抽象化的I2C控制器 struct i2c_client:连接到总线的I2C从机 管理适配器和设备,提供用户空间接口(/dev/i2c-*) I2C总线驱动 控制物理I2C控制器硬件,实现底层时序和寄存器控制 填 2025-04-01 嵌入式(Linux开发)
Linux Input设备通用驱动框架 Input子系统架构 1234567891011121314151617+-----------------------+| 用户空间 ||-----------------------|| /dev/input/eventX | <- 应用程序通过读取这些设备文件获取输入事件+-----------------------+ ↑+-- 2025-03-31 嵌入式(Linux开发)
Linux线程(一)基本概念 基本概念 进程:资源管理的最小单位 线程:程序执行的最小单位 每个进程拥有自己的数据段、代码段和堆栈段。 线程通常叫做轻型的进程,包含独立的栈和CPU寄存器状态。线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源。 线程和进程比起来很小,相对来说线程花费更少的CPU资源。 更形象一点: 进程是资源的管理单位 进程就像一个工厂,里面有自己的设备(CPU、内存、文件、网络连接等) 2025-03-31 Linux 线程
Linux Platform驱动通用框架 设备树 Platform驱动需要读取设备树中的compatible信息用于of_match_table进行匹配: 12345678910/* Custom LED pinctrl */gpioled { #address-cells = <1>; #size-cells = <1>; compatible = "custom-gpioled" 2025-03-28 嵌入式(Linux开发)
Linux文件描述符 文件描述符(file descriptor) 我们知道在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件的时候,我们每操作一次就找一次名字,这会耗费大量的时间和效率。所以Linux中规定每一个文件对应一个索引,这样要操作文件的时候,我们直接找到索引就可以对其进行操作了。 文件描述符(file descriptor)就是内核为了高效管 2025-03-26 嵌入式(Linux开发)
Linux阻塞、非阻塞与异步通知 阻塞IO 阻塞状态下应用程序从驱动读取函数时,若kernel回报设备不可用,应用程序对应的线程将会进入睡眠,等待设备可用后由设备通知应用程序并将其唤醒以继续执行。 Linux依靠等待队列(wait queue)来进行进程同步,其允许进程在某个条件满足前进入睡眠,并在条件满足时由驱动进行唤醒,避免CPU忙等。 等待队列 基本的等待队列包括: 事件(event):通常是 硬件中断、数据可用 或 2025-03-26 嵌入式(Linux开发)
Linux中断机制 设备树中断信息节点 IMX6ULL和IMX6UL的中断控制器呈兼容关系,即IMX6ULL继承IMX6UL的GIC节点信息。在imx6ul.dtsi中有: 12345678910111213141516171819intc: interrupt-controller@a01000 { compatible = "arm,gic-400", "arm,cort 2025-03-26 嵌入式(Linux开发)
Linux内核定时器 新版本Kernel下定时器API得到了比较好的优化,以正点原子阿尔法基于4.4版本kernel的旧版API为例做对比: 定时器回调函数: 旧版: 12345678void timer_function(unsigned long arg) { struct timer_dev *dev = (struct timer_dev *)arg; static int sta = 1; /* 2025-03-26 嵌入式(Linux开发)