news 2026/7/2 23:31:59

RX系列MCU RIIC模块驱动EEPROM:从官方示例到生产级代码实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RX系列MCU RIIC模块驱动EEPROM:从官方示例到生产级代码实战

1. 项目概述

在嵌入式开发中,与外部存储设备通信是家常便饭,而I2C总线因其简洁的两线制(SCL和SDA)和灵活的多设备寻址能力,成为连接EEPROM这类小容量非易失性存储器的首选方案。瑞萨电子的RX系列微控制器内置了功能强大的RIIC模块,配合其官方提供的Firmware Integration Technology库,可以大大简化I2C通信的底层驱动开发。但官方手册里的示例代码往往点到为止,真要在自己的板子上跑起来,从引脚配置、地址计算到超时处理和错误恢复,每一步都可能藏着“坑”。

最近在做一个需要掉电保存配置参数的项目,选用了常见的24系列EEPROM,自然就用到了RX231的RIIC模块。翻看R01AN1692EJ0311这份应用笔记时,其6.6.1节的单通道连续访问示例给了我一个不错的起点,但实际移植和调试过程远不止复制粘贴那么简单。比如,那个看似简单的设备地址宏定义EEPROM_DEVICE_ADDRESS,如果硬件连接和EEPROM型号不同,该怎么算?acknowledge_polling函数里用FIT_NO_PTR是什么意思,为什么这样就能实现轮询?还有,官方代码里那些while(1)的死循环错误处理,在产品代码里真的能用吗?

这篇文章,我就结合这个官方示例,把自己从零搭建I2C通信、访问EEPROM的完整过程、关键参数的计算逻辑、常见问题的排查方法,以及如何将示例代码优化为更健壮的生产级代码的经验,详细拆解一遍。无论你是刚开始接触RX系列,还是正在调试I2C通信,希望这些踩过的“坑”和总结的思路能帮你少走弯路。

2. 核心原理与RIIC模块解析

2.1 I2C协议基础与EEPROM访问机制

I2C通信的本质是一种基于地址的、同步的、串行的主从式通信。两条线中,SCL由主机产生时钟,SDA则用于双向数据传输。一次完整的通信事务始于一个START条件(SDA在SCL高电平时拉低),接着是7位或10位的从机地址+1位读写方向位,从机回应ACK后,便开始传输数据字节,每个字节后都跟随一个ACK/NACK应答,最终由STOP条件(SDA在SCL高电平时拉高)结束。

对于像24LCxx这类I2C接口的EEPROM,其访问有特定格式。通常,一次写操作需要先发送设备地址(写模式),再发送要写入的内部存储单元地址(通常为1或2字节,取决于容量),最后才是要写入的数据。由于EEPROM内部写入需要时间(典型值5ms),在连续写入后,主机必须通过“应答查询”来等待EEPROM内部写周期结束,才能发起下一次通信。读操作则稍微复杂:通常先发起一个“哑写”来设置内部地址指针,然后发送重复起始条件(Repeated Start),接着发送设备地址(读模式),才能开始读取数据。官方示例中的eeprom_writeeeprom_read函数正是遵循了这一流程。

2.2 RX系列RIIC模块与FIT库的优势

RX微控制器的RIIC模块并非简单的I2C控制器,它是一款增强型模块,支持标准模式(100kbps)、快速模式(400kbps)和快速模式Plus(1Mbps),内置了噪声滤波器、时钟同步和仲裁丢失检测等高级功能,通信的可靠性和抗干扰能力比软件模拟I2C强得多。

而瑞萨的Firmware Integration Technology库,其价值在于将底层复杂的寄存器操作封装成一套标准、易用的API。例如,我们不需要直接操作RIICnICCR1、RIICnICMR3这些令人头疼的寄存器来控制时钟和模式,只需调用R_RIIC_Open进行初始化并配置波特率。数据收发也无需手动处理START、ACK、STOP等信号,R_RIIC_MasterSendR_RIIC_MasterReceive两个函数就涵盖了大部分主模式操作。FIT库还通过回调函数机制处理中断事件,让开发者能更专注于应用层逻辑,而非陷入底层时序的泥潭。这种硬件抽象层极大地提升了开发效率和代码的可移植性。

3. 示例代码深度拆解与实操要点

3.1 工程环境搭建与FIT模块添加

在动手写代码之前,正确的工程配置是成功的一半。我使用的是e² studio IDE和RX231的目标板。首先,通过FIT模块管理器将“r_riic_rx”模块添加到你的项目中。这一步至关重要,因为它会自动关联必要的底层驱动文件和头文件路径。

添加完成后,你需要重点关注项目中的r_riic_rx_config.h文件。这个头文件通过一系列宏定义来配置RIIC模块的行为。对于我们的单通道EEPROM访问示例,至少需要配置以下参数:

/* 在 r_riic_rx_config.h 中或项目预编译选项中定义 */ #define RIIC_CFG_CH0_ENABLE (1) /* 使能通道0 */ #define RIIC_CFG_CH0_BITRATE_BPS (100000) /* 设置I2C波特率为100kbps */ #define RIIC_CFG_CH0_SCL0_PORT (0) /* SCL引脚端口号,根据原理图修改 */ #define RIIC_CFG_CH0_SCL0_PIN (5) /* SCL引脚位号 */ #define RIIC_CFG_CH0_SDA0_PORT (0) /* SDA引脚端口号 */ #define RIIC_CFG_CH0_SDA0_PIN (6) /* SDA引脚位号 */ #define RIIC_CFG_CH0_RXI_INT_PRIORITY (3) /* 接收中断优先级 */ #define RIIC_CFG_CH0_TXI_INT_PRIORITY (3) /* 发送中断优先级 */

注意:引脚端口和位号(PORTPIN)必须根据你的实际硬件连接原理图来填写。错误的引脚配置是导致“通信无响应”的最常见原因之一。RX系列的引脚功能复用通常需要通过端口控制寄存器来设置,幸运的是,FIT库的R_RIIC_Open函数内部通常会处理这部分初始化,前提是你的配置宏正确定义了物理引脚。

3.2 关键宏定义与设备地址计算解析

官方示例代码的开头部分有几个关键的宏定义,理解它们是如何计算出来的,是成功通信的第一步。

#define EEPROM_DEVICE_CODE (0xA0) #define EEPROM_DEVICE_ADDRESS_CODE (0x06) #define EEPROM_DEVICE_ADDRESS ((EEPROM_DEVICE_CODE | EEPROM_DEVICE_ADDRESS_CODE) >> 1)
  • EEPROM_DEVICE_CODE (0xA0):这是24系列EEPROM的“固定设备类型码”。对于大多数遵循“24xx”标准的EEPROM,其7位设备地址的高4位是固定的1010(二进制)。在代码中,0xA0的二进制是1010 0000,这里的1010就是高4位类型码,而最低位(bit 0)是I2C协议中的读写方向位(R/W#)。注意0xA0本身是一个8位数,其bit0(值为0)代表“写”操作。所以,这个宏更准确的理解是“用于写操作的8位从机地址”。

  • EEPROM_DEVICE_ADDRESS_CODE (0x06):这个代码代表了硬件地址引脚(A2, A1, A0)的电平状态。示例中注释说明A2接Vss(0),A1接Vcc(1),A0接Vcc(1),所以二进制是0110x06的二进制是0110,这里取低3位110(注意顺序和注释略有差异,需以实际硬件为准)。你需要根据你的EEPROM芯片(如24LC256)的地址引脚实际连接(上拉还是下拉)来计算这个值。例如,如果A2/A1/A0全部接地,那么这个值就是0x00

  • EEPROM_DEVICE_ADDRESS的计算(0xA0 | 0x06) >> 1。首先,0xA0 | 0x06 = 0xA6(二进制1010 0110)。然后右移一位得到0x53(二进制0101 0011)。这里的右移操作是关键:FIT库的R_RIIC_MasterSend/Receive函数期望的从机地址参数是7位地址,不包含读写位。而0xA6是包含了读写位(0)的8位地址。右移一位正是为了去掉这个最低位的读写位,得到纯7位地址0x53,供FIT库内部使用。库函数会在发起通信时,自动将这个7位地址左移一位,并根据当前是发送还是接收操作,补上相应的读写位(0或1)构成完整的8位地址帧。

实操心得:我强烈建议将地址计算过程用注释清晰地写在代码旁边,并实际测量或确认硬件连接。我曾经因为原理图标注不清,将A1脚误认为接地,导致地址计算错误,调试了半天才发现是硬件连接问题。一个快速验证地址的方法是,用逻辑分析仪抓取I2C总线波形,看主机发出的第一个地址字节(8位)是否符合预期。

3.3 主函数流程与核心API调用分析

示例的main函数清晰地勾勒出了单次“写入-等待-读取-验证”的流程,是理解FIT库使用方式的绝佳模板。

void main (void) { // ... 初始化缓冲区 // 1. 打开RIIC通道 ret = R_RIIC_Open(&iic_info_m); // 错误处理... // 2. 写入数据到EEPROM eeprom_write(); // 3. 应答查询,等待EEPROM内部写完成 acknowledge_polling(); // 4. 从EEPROM读取数据 eeprom_read(); // 5. 比较数据 for (i = 0; i < 16; i++) { ... } // 6. 关闭RIIC通道 ret = R_RIIC_Close(&iic_info_m); // 错误处理... }

R_RIIC_Open:这个函数负责初始化指定的RIIC硬件通道。它内部会配置引脚功能、设置I2C时钟频率(基于我们之前定义的RIIC_CFG_CH0_BITRATE_BPS)、初始化相关寄存器,并将通道状态设置为就绪。传入的riic_info_t结构体中的ch_nodev_sts会被使用和更新。

eeprom_write函数详解:这个函数展示了如何使用R_RIIC_MasterSend进行复合格式的发送。关键点在于对riic_info_t结构体成员的设置:

  • p_slv_adr: 指向7位从机地址(0x53)。
  • p_data1stcnt1st: 指向EEPROM的内部存储单元地址(本例中为1字节的0x00)及其长度。对于24LCxx,这通常是你要读写的起始地址。
  • p_data2ndcnt2nd: 指向实际要写入的用户数据缓冲区及其长度。 这种“地址+数据”的两段式发送,正是I2C访问EEPROM的标准操作。函数调用后,RIIC模块会自动处理START、发送地址(写)、发送地址字节、发送数据字节、产生STOP等全部时序。

acknowledge_polling函数精要:这是确保数据写入可靠性的核心。在eeprom_write的STOP信号后,EEPROM进入内部写周期(t~WR~),此时它不会应答I2C总线上的寻址。acknowledge_polling函数的策略是:不断尝试向EEPROM发送一个仅包含起始条件、从机地址(写)和停止条件的“空”事务。关键代码是:

iic_info_m.p_data1st = (uint8_t*) FIT_NO_PTR; iic_info_m.cnt1st = 0; iic_info_m.p_data2nd = (uint8_t*) FIT_NO_PTR; iic_info_m.cnt2nd = 0;

将数据指针设置为FIT_NO_PTR并将计数器设为0,意味着本次传输没有数据阶段。当EEPROM忙时,它会回NACK,dev_sts状态会变为RIIC_NACK,代码中检测到后延时约100us再重试。当EEPROM就绪,它会回ACK,状态变为RIIC_FINISH,循环退出。这个FIT_NO_PTR是一个特殊的空指针定义,用于告知API本次传输无数据。

eeprom_read函数流程:读操作利用R_RIIC_MasterReceive实现,但其配置同样包含p_data1stcnt1st。这里有一个精妙之处:对于EEPROM的随机读操作,FIT库在底层实际上执行了一个“写地址+重复起始+读数据”的复合操作。API会先以主发送模式发送从机地址(写)和存储单元地址(p_data1st),然后自动产生一个重复起始条件(Repeated Start),再发送从机地址(读),最后切换为接收模式,将数据读入p_data2nd指向的缓冲区。这一切对用户都是透明的,我们只需正确配置结构体即可。

R_RIIC_Close:用于释放RIIC硬件资源,关闭中断等。在单次任务完成后调用,是一个良好的编程习惯。

4. 从示例到实战:关键配置与调试技巧

4.1 硬件连接检查与上拉电阻选择

I2C总线是开漏输出,这意味着SCL和SDA线必须通过上拉电阻连接到正电源(Vcc)。电阻值的选择是一个平衡:阻值太小,电流大,功耗高;阻值太大,上升沿变缓,在高速模式下可能导致时序违规。

对于100kHz的标准模式,通常选择4.7kΩ到10kΩ的上拉电阻。如果你的总线较长或负载电容较大(例如连接了多个设备),可能需要减小电阻值,比如2.2kΩ,以提供更强的上拉能力,保证信号边沿速度。我个人的经验是,在3.3V系统、总线长度小于20cm、连接2-3个设备的情况下,使用4.7kΩ电阻非常稳定。务必使用示波器或逻辑分析仪检查SCL和SDA线上的信号质量,确保上升沿干净、无过冲或振铃。

4.2 中断优先级与超时处理优化

示例代码中的callback_master函数是一个中断回调函数,当传输完成、出错(如NACK、仲裁丢失、超时)时会被调用。示例中它只是获取了状态,实际项目中,你需要在这里添加更复杂的错误处理逻辑,比如重试机制、错误日志记录等。

中断优先级(RIIC_CFG_CH0_RXI_INT_PRIORITY等)的配置需要谨慎。如果系统中存在其他高优先级、长时间执行的中断,可能会阻塞I2C中断,导致通信超时或数据丢失。通常,将通信外设的中断优先级设置为中等或稍高水平是比较安全的做法。另外,FIT库支持超时检测功能,需要在配置中使能并设置超时时间。这对于检测总线死锁(例如从机故障拉低SDA)非常有用,可以防止系统卡死。

4.3 将示例代码重构为健壮的生产代码

官方示例为了简洁,在错误处理上大量使用了while(1)死循环。这在产品中是绝对不允许的。我们需要将其改造为更健壮的形式。

  1. 错误处理增强:将错误返回值ret和状态iic_info_m.dev_sts传递给上层,或触发系统错误恢复流程(如看门狗复位、故障指示灯)。

    ret = R_RIIC_MasterSend(&iic_info_m); if (RIIC_SUCCESS != ret) { // 记录错误日志:ret值、行号等 LOG_ERROR("I2C MasterSend failed: %d at line %d", ret, __LINE__); // 尝试恢复:关闭再打开通道 R_RIIC_Close(&iic_info_m); vTaskDelay(pdMS_TO_TICKS(10)); ret = R_RIIC_Open(&iic_info_m); if (RIIC_SUCCESS != ret) { // 恢复失败,执行严重错误处理 System_HardFault_Handler(); } return I2C_ERR_SEND_FAILED; // 返回错误码给调用者 }
  2. 超时机制:示例中的while (RIIC_COMMUNICATION == iic_info_m.dev_sts)是忙等待,会阻塞CPU。可以将其改为带超时的等待。

    uint32_t timeout_ms = 100; // 100ms超时 uint32_t start_tick = get_system_tick(); while ((RIIC_COMMUNICATION == iic_info_m.dev_sts) && ((get_system_tick() - start_tick) < timeout_ms)) { // 可以在这里执行其他低优先级任务或触发任务调度 vTaskDelay(1); // 如果使用RTOS,让出CPU } if (RIIC_COMMUNICATION == iic_info_m.dev_sts) { // 超时处理 LOG_ERROR("I2C communication timeout"); return I2C_ERR_TIMEOUT; }
  3. acknowledge_polling优化:示例中的轮询间隔是固定的100us,且使用R_BSP_SoftwareDelay进行忙等待。在实际应用中,可以增加最大重试次数限制,并将延时改为非阻塞方式(如RTOS的vTaskDelay或定时器),避免独占CPU。

    #define ACK_POLL_MAX_RETRY (500) // 最大重试500次,约50ms uint16_t retry_count = 0; do { // ... 发送空事务 if (RIIC_NACK == iic_info_m.dev_sts) { retry_count++; if (retry_count > ACK_POLL_MAX_RETRY) { return I2C_ERR_EEPROM_BUSY_TIMEOUT; } // 使用RTOS延时,释放CPU vTaskDelay(pdMS_TO_TICKS(1)); // 延时1ms } } while (RIIC_FINISH != iic_info_m.dev_sts);

5. 常见问题排查与实战记录

5.1 问题速查表

在实际调试中,我遇到了各种各样的问题,下面这个表格总结了一些典型现象和排查思路:

现象可能原因排查步骤与解决方案
通信完全无响应
(逻辑分析仪看不到起始条件)
1. RIIC模块未正确初始化或使能。
2. SCL/SDA引脚配置错误(非I2C功能)。
3. 上拉电阻未连接或虚焊。
4. 从机设备地址错误或设备损坏。
1. 确认R_RIIC_Open返回值,检查r_riic_rx_config.h配置。
2. 用万用表测量SCL/SDA引脚电压,应为Vcc(因上拉)。用示波器或逻辑分析仪抓取引脚波形,确认是否有输出。
3. 检查原理图和PCB,确认上拉电阻焊接良好。
4. 核对EEPROM型号与地址引脚连接,重新计算7位地址。尝试用其他I2C设备(如传感器)测试。
主机收到NACK(无应答)1. 从机地址错误。
2. 从机设备忙(如EEPROM正在内部写入)。
3. 从机设备电源或复位不正常。
4. 总线电平不匹配(如主机3.3V,从机5V且无电平转换)。
1. 用逻辑分析仪解码第一个地址字节,与计算出的8位地址对比。
2. 检查acknowledge_polling逻辑,确保在写操作后等待了足够时间。
3. 测量从机设备的Vcc和GND电压,检查复位引脚状态。
4. 确保主机和从机使用相同的电压,或使用双向电平转换器。
能写入但读回数据错误1. 读操作时序错误,未正确发送存储单元地址或未使用重复起始条件。
2. 数据缓冲区指针或长度设置错误。
3. 通信速率过快,从机来不及响应。
4. 电源噪声导致数据位翻转。
1. 用逻辑分析仪对比写和读操作的波形。确认读操作是否先发送了地址字节(哑写)。
2. 检查eeprom_read函数中p_data1stp_data2nd的设置。
3. 尝试降低I2C波特率(如从400k降到100k)。
4. 在Vcc和GND之间靠近芯片处增加去耦电容(如100nF)。检查PCB布线,SCL/SDA线是否远离噪声源。
通信间歇性失败1. 总线电容过大,信号边沿太慢。
2. 中断处理时间过长,导致I2C时序被破坏。
3. 软件中未正确处理总线冲突(多主系统)。
4. 电磁干扰(EMI)。
1. 测量SCL/SDA信号的上升时间。减小上拉电阻值(如从10k换为2.2k)。
2. 优化中断服务程序(ISR),确保其执行时间尽可能短。检查I2C中断优先级是否被更高优先级中断抢占。
3. 确保在多主系统中实现了总线仲裁和重试逻辑(虽然示例是单主)。
4. 使用双绞线或屏蔽线连接I2C设备,确保GND连接良好。

5.2 逻辑分析仪:调试I2C的利器

对于I2C这类有时序要求的通信,逻辑分析仪是比串口打印强大得多的调试工具。我使用的是Saleae Logic系列,配合其强大的解码软件,可以直观地看到:

  • 起始(S)和停止(P)条件是否产生。
  • 地址字节和数据字节的具体数值,以及ACK/NACK位。
  • 重复起始条件(Sr)是否在读操作中正确产生。
  • 信号质量,如上升/下降时间、过冲、毛刺等。

在调试示例代码时,我正是通过逻辑分析仪发现,第一次读操作失败是因为我的EEPROM(24LC256)需要2字节的内部地址,而示例代码只发送了1字节。通过将access_addr1数组改为2字节并正确赋值,问题立刻得到解决。没有逻辑分析仪,仅靠猜测和修改代码,这个问题可能要耗费数小时。

5.3 关于多字节读写与页边界处理

示例代码读写的是连续的16字节,起始地址为0x00。对于大多数EEPROM,连续读写不能跨越“页”边界。页的大小取决于具体型号,常见的有16字节、32字节、64字节等。如果尝试写入的连续数据跨越了页边界,超出部分会从当前页的页首开始“回卷”写入,导致数据覆盖错误。

解决方案:在封装更通用的EEPROM读写函数时,必须加入页边界检查。例如,对于页大小为32字节的EEPROM,如果要写入40字节数据,起始地址为10,那么你需要分两次写入:第一次写22字节(地址10-31),第二次写18字节(地址32-49)。读操作通常不受页限制,但为了代码一致性,也可以按页大小分段读取。

6. 项目集成与性能考量

6.1 将RIIC操作封装为驱动层

在实际项目中,我们不会像示例那样把所有的代码都放在main.c里。更好的做法是创建一个独立的I2C或EEPROM驱动层。例如,可以创建eeprom24lcxx.c/h文件,提供如下接口:

eeprom_status_t EEPROM_Init(void); eeprom_status_t EEPROM_Write(uint16_t addr, uint8_t *data, uint16_t len); eeprom_status_t EEPROM_Read(uint16_t addr, uint8_t *buffer, uint16_t len); eeprom_status_t EEPROM_IsBusy(void); // 封装acknowledge_polling

这样,上层应用只需关心“往哪个地址写什么数据”,底层复杂的RIIC初始化、地址计算、页处理、错误重试都被隐藏起来,代码的复用性和可维护性大大提升。

6.2 通信速率与系统负载权衡

RIIC模块支持最高1Mbps的速率,但实际能达到多高,取决于多个因素:

  1. 从机设备支持的最高速率:查阅EEPROM数据手册,确认其支持的标准模式、快速模式还是快速模式Plus。
  2. 总线电容和布线:长导线、多个设备并联会增加总线电容,降低信号边沿速度,从而限制最高可靠速率。
  3. CPU负载与中断延迟:在高波特率下,每个字节的传输时间很短。如果CPU忙于处理其他高优先级任务,可能导致I2C中断得不到及时响应,造成数据丢失或超时。在RTOS系统中,需要合理设置I2C相关任务的优先级。

一个实用的建议是:从较低的速率(如100kbps)开始调试,待通信稳定后,再逐步提高速率并测试可靠性。同时,在r_riic_rx_config.h中,可以尝试调整SCL上升/下降时间的相关配置宏(如果提供),以更好地匹配你的硬件环境。

6.3 低功耗设计中的考量

如果项目对功耗敏感,需要注意RIIC模块在R_RIIC_Open后,即使不通信,模块和引脚也可能处于活动状态,消耗一定电流。在长时间不使用时,应调用R_RIIC_Close关闭模块。此外,SCL和SDA线上的上拉电阻也会产生持续的静态电流(I = Vcc / R_pullup)。在电池供电的深度睡眠模式下,可以考虑通过MOSFET开关来断开上拉电阻的电源,进一步降低功耗,但这会增加电路复杂性。

经过以上从原理到实践、从示例到产品的层层剖析,相信你已经对如何在RX系列MCU上使用RIIC模块稳健地操作EEPROM有了深入的理解。嵌入式开发就是这样,手册上的几行示例代码,背后是硬件特性、协议规范、软件抽象和调试经验的综合体现。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 23:30:45

AI 入门教程:从零基础到工程实战

AI 入门教程:从零基础到工程实战 适用人群:AI 初学者、转行开发者、产品经理、技术管理者 前置知识:Python 基础编程 + 中学数学(线性代数/概率论入门即可) 实验环境:Ubuntu 24.04 + Python 3.12 + OpenAI API 最后更新:2026-06-26 目录 第一部分:基础认知 1 AI 简介 2…

作者头像 李华
网站建设 2026/7/2 23:30:45

3步掌握QMC音频解密:彻底释放加密音乐文件的完整指南

3步掌握QMC音频解密&#xff1a;彻底释放加密音乐文件的完整指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为QQ音乐加密的QMC音频文件无法在常用设备上播放而烦恼…

作者头像 李华
网站建设 2026/7/2 23:30:18

如何让小爱音箱摆脱会员限制:开源音乐播放方案深度解析

如何让小爱音箱摆脱会员限制&#xff1a;开源音乐播放方案深度解析 【免费下载链接】xiaomusic 使用小爱音箱播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 你是否曾对着小爱音箱说出想听的歌曲&#xff0c…

作者头像 李华
网站建设 2026/6/27 12:16:35

Kernel 6.6学习V1版本

好&#xff0c;这次我们从“从零到能看懂并改内核源码 做实验”的角度&#xff0c;重新给你做一套系统化 Linux 内核学习路线&#xff08;带书 视频 实践&#xff09;。 我会按“阶段 目标 资料 实验”来组织&#xff0c;这样你可以直接照着做。 &#x1f9ed; Linux 内…

作者头像 李华