<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Linux系统开发]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/lyyaj</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; lyyaj]]></copyright><item><title><![CDATA[35、Firefly_rk3399 同步互斥]]></title><link>https://blog.csdn.net/lyyaj/article/details/144473286</link><guid>https://blog.csdn.net/lyyaj/article/details/144473286</guid><author>lyyaj</author><pubDate>Sat, 14 Dec 2024 17:19:07 +0800</pubDate><description><![CDATA[​	假设程序A要访问临界资源，可能会有中断也来访问临界资源，可能会有程序B也来访问临界资源，那么使用spin_lock_irq()来保护临界资源：先禁止中断防止中断来抢，再禁止preempt防止其他进程来抢。​	      ② 对于单CPU而言：自旋锁的“自旋”功能就去掉了：只剩下禁止抢占、禁止中断，用完锁再使能系统抢占(preempt_enable)，这样别人就可以来抢资源了。但是对于SMP系统，你只能关闭当前CPU核的中断，别的CPU核还可以运行程序，它们也可以来执行这个函数，同样导致问题。]]></description><category></category></item><item><title><![CDATA[34、Firefly_rk3399 mmap内存管理]]></title><link>https://blog.csdn.net/lyyaj/article/details/144295798</link><guid>https://blog.csdn.net/lyyaj/article/details/144295798</guid><author>lyyaj</author><pubDate>Fri, 06 Dec 2024 16:47:13 +0800</pubDate><description><![CDATA[​	一级页表中每一个表项用来设置 1M 的空间，对于 32 位的系统，虚拟地址空间有 4G，4G/1M=4096。所以一级页表要映射整个 4G 空间的话，需要 4096 个页表项。第 0 个页表项用来表示虚拟地址第 0 个 1M(虚拟地址为 0～0x0FFFFF)对应哪一块物理内存，并且有一些权限设置；第 1 个页表项用来表示虚拟地址第 1 个 1M(虚拟地址为 0x100000～0x1FFFFF)对应哪一块物理内存，并且有一些权限设置；]]></description><category></category></item><item><title><![CDATA[33、Firefly-rk3399中断线程化处理]]></title><link>https://blog.csdn.net/lyyaj/article/details/144089304</link><guid>https://blog.csdn.net/lyyaj/article/details/144089304</guid><author>lyyaj</author><pubDate>Wed, 27 Nov 2024 16:55:01 +0800</pubDate><description><![CDATA[2、如果上半部函数的返回值是：IRQ_WAKE_THREAD(重要)3、唤醒中断对应的内核线程。3、唤醒等待线程函数的线程。1、调用上半部处理函数。2、执行线程处理函数。]]></description><category></category></item><item><title><![CDATA[32、基于Firefly-rk3399 work queue处理中断底半部]]></title><link>https://blog.csdn.net/lyyaj/article/details/144088167</link><guid>https://blog.csdn.net/lyyaj/article/details/144088167</guid><author>lyyaj</author><pubDate>Wed, 27 Nov 2024 16:25:59 +0800</pubDate><description><![CDATA[工作队列是另外一种下半部执行方式，工作队列在进程上下文执行，工作队列将要推后的工作交给一个内核线程去执行，因为工作队列工作在进程上下文，因此工作队列允许睡眠或重新调度。，工作者线程处理自己工作队列中的所有工作。在实际的驱动开发中，我们只需要定义工作(work_struct)即可，关于工作队列和工作者线程我们基本不用去管。_work 表示要初始化的工作，_func 是工作对应的处理函数。n 表示定义的工作(work_struct)，f 表示工作对应的处理函数。：0 成功，其他值 失败。]]></description><category></category></item><item><title><![CDATA[31、基于Firefly-rk3399 tasklet处理中断底半部]]></title><link>https://blog.csdn.net/lyyaj/article/details/144088071</link><guid>https://blog.csdn.net/lyyaj/article/details/144088071</guid><author>lyyaj</author><pubDate>Wed, 27 Nov 2024 16:24:32 +0800</pubDate><description><![CDATA[其中 name 为要定义的 tasklet 名字，其实就是 tasklet_struct 类型的变量名，func 就是 tasklet的处理函数，data 是传递给 func 函数的参数。在上半部，也就是中断处理函数中调用 tasklet_schedule 函数就能使 tasklet 在合适的时间运行，tasklet_schedule 函数原型如下。：要初始化的tasklet，即struct tasklet_struct定义的值。： tasklet 的处理函数。**返回值：**没有返回值。]]></description><category></category></item><item><title><![CDATA[30、Firefly-rk3399定时器]]></title><link>https://blog.csdn.net/lyyaj/article/details/144011239</link><guid>https://blog.csdn.net/lyyaj/article/details/144011239</guid><author>lyyaj</author><pubDate>Sun, 24 Nov 2024 18:39:09 +0800</pubDate><description><![CDATA[​		定时器：顾名思义就是用来定时的，分为三个阶段：定时开始->定时中->定时结束。三个阶段依托于内核中的jiffies，它记录定时器计数个数，上电就开始计数依次递增，所以我们只需要知道一个定时器周期时间是多少HZ即可自由设置定时器。/* 记录定时器超时时间 *//* 记录定时器超时处理函数 *//* 上面函数的参数 */// 未使用// 未使用。]]></description><category></category></item><item><title><![CDATA[29、基于Firefly-rk3399阻塞和非阻塞用法]]></title><link>https://blog.csdn.net/lyyaj/article/details/144008994</link><guid>https://blog.csdn.net/lyyaj/article/details/144008994</guid><author>lyyaj</author><pubDate>Sun, 24 Nov 2024 16:05:32 +0800</pubDate><description><![CDATA[​	 和  是两种提供给用户空间程序与内核交互的系统调用，二者常用于对文件描述符或设备文件执行控制操作，但它们在设计目的和使用场景上存在显著区别。全称：Input/Output Control功能：提供一种通用的接口，通过设备专用的命令和参数控制设备的行为。适用场景：


参数说明：设置串口波特率：

2.  简介


全称：File Control功能：用于操作文件描述符的属性和行为。适用场景：


参数说明：设置文件为非阻塞模式：

3.  和  的主要区别




特性






操作对象
主要针对]]></description><category></category></item><item><title><![CDATA[29、基于Firefly-Rk3399信号signal异步通知]]></title><link>https://blog.csdn.net/lyyaj/article/details/144006950</link><guid>https://blog.csdn.net/lyyaj/article/details/144006950</guid><author>lyyaj</author><pubDate>Sun, 24 Nov 2024 14:00:16 +0800</pubDate><description><![CDATA[1、概述：应用层启用signal功能->将PID传递给驱动层->获取FASYNC状态并使能它   驱动层文件操作结构体创建fasync函数并通过fasync_helper监测FASYNC状态变化绑定到PID上，中断来临后kill_fasync将signal发送到绑定的PID上。​       （4）获取文件标记位，设置flag(FASYNC)，驱动调用 kill_fasync(PID, SIGIO)​	（6）按键按下–>调用了按键中断程序–>记录KEY值， 将信号发出。的指针，用于存储异步通知相关的信息。]]></description><category></category></item><item><title><![CDATA[28、基于Firefly-rk3399 poll使用]]></title><link>https://blog.csdn.net/lyyaj/article/details/143953520</link><guid>https://blog.csdn.net/lyyaj/article/details/143953520</guid><author>lyyaj</author><pubDate>Thu, 21 Nov 2024 19:58:26 +0800</pubDate><description><![CDATA[drv_poll 要把自己这个线程挂入等待队列 wq 中。]]></description><category></category></item><item><title><![CDATA[27、基于Firefly-rk3399中断休眠唤醒实验（按键中断）]]></title><link>https://blog.csdn.net/lyyaj/article/details/143905678</link><guid>https://blog.csdn.net/lyyaj/article/details/143905678</guid><author>lyyaj</author><pubDate>Wed, 20 Nov 2024 11:06:36 +0800</pubDate><description><![CDATA[等待队列（wait queue）是 Linux 内核中的一种同步机制，主要用于进程在某些条件未满足时进行睡眠，等待某种事件发生再被唤醒。④ 当有数据时，比如当按下按键时，驱动程序的中断服务程序被调用，它会记录数据、唤醒 APP。典型场景包括设备驱动中，当某些硬件事件尚未发生时，让进程进入睡眠，直到事件发生后将其唤醒。② APP 进入内核态，也就是调用驱动中的对应函数，发现有数据则复制到用户空间并马上返回。⑤ APP 继续运行它的内核态代码，也就是驱动程序中的函数，复制数据到用户空间并马上返回。]]></description><category></category></item><item><title><![CDATA[26、基于Firefly-rk3399,读取按键上升下降沿中断]]></title><link>https://blog.csdn.net/lyyaj/article/details/143858684</link><guid>https://blog.csdn.net/lyyaj/article/details/143858684</guid><author>lyyaj</author><pubDate>Mon, 18 Nov 2024 15:37:13 +0800</pubDate><description><![CDATA[softirq_action 结构体中的 action 成员变量就是软中断的服务函数，数组 softirq_vec 是个全局数组,全局数组softirq_vec 传入action ，因此所有的 CPU(对于 SMP 系统而言)都可以访问到，每个 CPU 都有自己的触发和控制机制，并且只执行自己所触发的软中断。其中 name 为要定义的 tasklet 名字，其实就是 tasklet_struct 类型的变量名，func 就是 tasklet的处理函数，data 是传递给 func 函数的参数。]]></description><category></category></item><item><title><![CDATA[25、基于firefly-rk3399使用pinctrl子系统进行led操作（无需寄存器配置）]]></title><link>https://blog.csdn.net/lyyaj/article/details/143618618</link><guid>https://blog.csdn.net/lyyaj/article/details/143618618</guid><author>lyyaj</author><pubDate>Fri, 08 Nov 2024 11:16:51 +0800</pubDate><description><![CDATA[开发人员：bsp工程师使用人员：驱动工程师目标：使用pinctrl子系统。]]></description><category></category></item><item><title><![CDATA[24、基于Firefly-rk3399 platform总线控制按键驱动]]></title><link>https://blog.csdn.net/lyyaj/article/details/143448583</link><guid>https://blog.csdn.net/lyyaj/article/details/143448583</guid><author>lyyaj</author><pubDate>Sat, 02 Nov 2024 11:48:51 +0800</pubDate><description><![CDATA[开发平台：Firefly-Rk3399 2+16按键引脚：GPIO0_B4电路设计：rk3399-firefly 要求输入电压为1.8v，所以我从开发板引出一个3.3V,之后搭建电压转换电路使其输出1.8V电压到GPIO。以下电路可以看出：开关打开电压为1.8V，开关闭合电压为0。]]></description><category></category></item><item><title><![CDATA[23、基于Firefly-rk3399 设备树加字符设备驱动驱动控制LED]]></title><link>https://blog.csdn.net/lyyaj/article/details/143348565</link><guid>https://blog.csdn.net/lyyaj/article/details/143348565</guid><author>lyyaj</author><pubDate>Tue, 29 Oct 2024 20:18:46 +0800</pubDate><description><![CDATA[在传统 Linux 内核中，ARM 架构的板极硬件细节过多地被硬编码在 arch/arm/plat-xxx 和arch/arm/mach-xxx，比如板上的 platform 设备、resource、i2c_board_info、spi_board_info 以及各种硬件的 platform_data，这些板级细节代码对内核来讲只不过是垃圾代码。而采用Device Tree 后，许多硬件的细节可以直接透过它传递给 Linux，而不再需要在 kernel 中进行大量的冗余编码。]]></description><category></category></item><item><title><![CDATA[22、基于Firefly-rk3399 总线设备驱动控制LED]]></title><link>https://blog.csdn.net/lyyaj/article/details/143234704</link><guid>https://blog.csdn.net/lyyaj/article/details/143234704</guid><author>lyyaj</author><pubDate>Fri, 25 Oct 2024 15:00:15 +0800</pubDate><description><![CDATA[​                platform是内核抽象出来的一个总线驱动，并没有真实的 硬件存在。platform总线遵从内核的device,bus,driver的 总线模型。platform的本质含义就是将设备信息和设备驱动分离。]]></description><category></category></item><item><title><![CDATA[21、基于Firefly-rk3399字符设备驱动寄存器控制LED]]></title><link>https://blog.csdn.net/lyyaj/article/details/142991950</link><guid>https://blog.csdn.net/lyyaj/article/details/142991950</guid><author>lyyaj</author><pubDate>Wed, 16 Oct 2024 21:33:51 +0800</pubDate><description><![CDATA[GPIO 共有5组，GPIO0-GPIO4，分组信息如上。每一组又分为八个一组A B C D。对于GPIO的描述如：GPIO0_A6是指第一组的第6个引脚data寄存器， 对于输出引脚有用， 共32位，对应一组里面的4组（ABCD）引脚。方向寄存器，控制输入输出，0输入， 1输出， 共32位，对应一组里面的4组引脚。外部寄存器， 输入模式时，读取寄存器对应位的值获取当前引脚的电平。共32位，对应一组里面的4组引脚。为了便于后续驱动编写，整理表格如下模块基地址寄存器偏移地址备注GPIO0。]]></description><category></category></item><item><title><![CDATA[20、字符设备驱动（模拟）]]></title><link>https://blog.csdn.net/lyyaj/article/details/142863518</link><guid>https://blog.csdn.net/lyyaj/article/details/142863518</guid><author>lyyaj</author><pubDate>Fri, 11 Oct 2024 21:16:41 +0800</pubDate><description><![CDATA[代表当前终端设备;：串行端口设备，常用于 RS-232 串口通信;：伪终端设备，用于终端模拟，例如远程登录的终端（SSH);​		应用程序：open()、read()、write()、close()等系统调用API​							||​		设备文件：   设备文件作为二者之间的桥梁​							||​		内核：  	       系统调用进入内核​							||​		驱动程序：	驱动程序中的open()close()read()release()等​							||]]></description><category></category></item><item><title><![CDATA[19、RK3399 内核移植]]></title><link>https://blog.csdn.net/lyyaj/article/details/142816598</link><guid>https://blog.csdn.net/lyyaj/article/details/142816598</guid><author>lyyaj</author><pubDate>Thu, 10 Oct 2024 11:24:03 +0800</pubDate><description><![CDATA[测试开发板：Firefly-RK3399 2+16。]]></description><category></category></item><item><title><![CDATA[18、ext3ext4对比]]></title><link>https://blog.csdn.net/lyyaj/article/details/142661636</link><guid>https://blog.csdn.net/lyyaj/article/details/142661636</guid><author>lyyaj</author><pubDate>Mon, 30 Sep 2024 17:45:43 +0800</pubDate><description><![CDATA[EXT3：稳定且适用于小型系统，主要优点是数据安全性高。EXT4：在 EXT3 的基础上引入了更多特性，特别是在性能和可扩展性方面有显著提升，适用于现代大规模存储设备。因此，EXT4 是更先进的选择，通常情况下推荐使用 EXT4。]]></description><category></category></item><item><title><![CDATA[17、交叉编译工具链安装]]></title><link>https://blog.csdn.net/lyyaj/article/details/142661616</link><guid>https://blog.csdn.net/lyyaj/article/details/142661616</guid><author>lyyaj</author><pubDate>Mon, 30 Sep 2024 17:44:47 +0800</pubDate><description><![CDATA[arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz，该文件名称意为：在x86平台的linux主机进行编译，生成的文件为aarch64平台可运行的文件，这里宿主机和目标平台都是64位机器。使用如下命令进行解压：tar -xvf arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /usr/local/arm。]]></description><category></category></item></channel></rss>