<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[mmmm123CC的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/mmmm123CC</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; mmmm123CC]]></copyright><item><title><![CDATA[【实用】GDB调试保姆级教程|常用操作|附笔记]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/156159850</link><guid>https://blog.csdn.net/mmmm123CC/article/details/156159850</guid><author>mmmm123CC</author><pubDate>Mon, 22 Dec 2025 18:31:36 +0800</pubDate><description><![CDATA[*默认执行上条命令：**什么命令都不输入、直接敲回车、会默认执行上条命令。在第10行打一个断点，程序执行到第10行时。只有当条件满足，程序才会停下来。用于在不同的调用堆栈层级之间切换，查看对应层级的局部变量和代码上下文。设置之后，在每次程序暂停时，GDB会自动打印这个变量的值。栈是先进后出的，所以，此时的调用栈的意思是，先调用。会继续运行直到当前函数返回，并打印函数的返回值。向下执行一行代码、不会进入函数体；向下执行一行代码、会进入函数体；查看断点后会有断点的Num号。（切换到编号为1的栈帧）；]]></description><category></category></item><item><title><![CDATA[【源码分析】Uboot启动流程详细分析（三）]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/155281013</link><guid>https://blog.csdn.net/mmmm123CC/article/details/155281013</guid><author>mmmm123CC</author><pubDate>Wed, 26 Nov 2025 19:04:28 +0800</pubDate><description><![CDATA[笔者把Uboot启动流程分为了七个阶段：第一阶段：CPU的关键初始化（中断、权限、MMU等）第二阶段：初始化关键外设+打印信息+设置global_data信息第三阶段：内存分配（用于uboot重定位）第四阶段：重定位第五阶段：继续初始化其他外设第六阶段：开始主循环第七阶段：bootz启动流程。]]></description><category></category></item><item><title><![CDATA[【源码分析】Uboot启动流程详细分析（二）]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/155242023</link><guid>https://blog.csdn.net/mmmm123CC/article/details/155242023</guid><author>mmmm123CC</author><pubDate>Tue, 25 Nov 2025 18:46:05 +0800</pubDate><description><![CDATA[笔者把Uboot启动流程分为了七个阶段：第一阶段：CPU的关键初始化（中断、权限、MMU等）第二阶段：初始化关键外设+打印信息+设置global_data信息第三阶段：内存分配（用于uboot重定位）第四阶段：重定位第五阶段：继续初始化其他外设第六阶段：开始主循环第七阶段：bootz启动流程。]]></description><category></category></item><item><title><![CDATA[【源码分析】Uboot启动流程（一）]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/155202666</link><guid>https://blog.csdn.net/mmmm123CC/article/details/155202666</guid><author>mmmm123CC</author><pubDate>Mon, 24 Nov 2025 19:04:17 +0800</pubDate><description><![CDATA[笔者把Uboot启动流程分为了七个阶段：第一阶段：CPU的关键初始化（中断、权限、MMU等）第二阶段：初始化关键外设+打印信息+设置global_data信息第三阶段：内存分配（用于uboot重定位）第四阶段：重定位第五阶段：继续初始化其他外设第六阶段：开始主循环第七阶段：bootz启动流程。]]></description><category></category></item><item><title><![CDATA[【超级详细】正点原子RK3588安装和编译SDK]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/154131785</link><guid>https://blog.csdn.net/mmmm123CC/article/details/154131785</guid><author>mmmm123CC</author><pubDate>Thu, 30 Oct 2025 16:48:07 +0800</pubDate><description><![CDATA[如果 Ubuntu 磁盘空间比较紧张，可以对 SDK 进行瘦身，将 SDK 根目录下的.repo（隐藏文件夹，使用 ls-a 可看到）文件夹删除、可释放出一部分磁盘空间；注意，.repo 文件夹中保存了SDK 所有仓库的 git 提交记录，一旦删除，后续将无法查看到任何仓库的 git 提交信息，所以。在 SDK 根目录下执行如下命令，可以将output/firmware/目录下的各分立镜像打包成一个 update.img 固件。2、选择屏幕，进入SDK 根目录下，执行如下命令。]]></description><category></category></item><item><title><![CDATA[复盘|嵌入式Linux驱动开发之I2C子系统]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/153925785</link><guid>https://blog.csdn.net/mmmm123CC/article/details/153925785</guid><author>mmmm123CC</author><pubDate>Sun, 26 Oct 2025 16:42:59 +0800</pubDate><description><![CDATA[Platform 总线负责匹配DTS 节点) 和适配器驱动匹配成功后，执行。作为“接力”的中间人，它通过解析DTS 子节点at24@50) 来创建 i2c_client。i2c_client被注册到I2C 总线。I2C 总线负责匹配 i2c_clientat24@50) 和设备驱动匹配成功后，执行at24_probe。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux驱动开发之I2C子系统(4)--源码分析]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/153875248</link><guid>https://blog.csdn.net/mmmm123CC/article/details/153875248</guid><author>mmmm123CC</author><pubDate>Sat, 25 Oct 2025 15:05:16 +0800</pubDate><description><![CDATA[I2C 总线驱动，或者说 I2C 适配器驱动的主要工作就是初始化 i2c_adapter 结构体变量，然后设置 i2c_algorithm 中的 master_xfer 函数。完成以后通过 i2c_add_numbered_adapter或 i2c_add_adapter 这两个函数向系统注册设置好的 i2c_adapter。NXP 使用 imx_i2c_struct 结构体来表示 I.MX 系列 SOC 的 I2C 控制器，imx_i2c_struct 结构体中有个成员变量adapter。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux驱动开发之I2C子系统(3)--I2C子系统框架]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/153776725</link><guid>https://blog.csdn.net/mmmm123CC/article/details/153776725</guid><author>mmmm123CC</author><pubDate>Thu, 23 Oct 2025 11:32:03 +0800</pubDate><description><![CDATA[I2C子系统首先可以划分为三个层次用户空间：运行应用程序。内核空间：处理驱动逻辑，又细分为 I2C 设备驱动层、I2C 核心层、I2C 适配器驱动层。硬件层：具体的I2C外设和I2C控制器。每层具体做什么事在用户空间中，需要学会如何使用I2C编写应用程序在内核空间中，需要学会如何使用I2C编写驱动程序在硬件层中，对应的是具体的外设，需要能够找到这个外设连接到了哪个I2C上、所使用的I2C接口是哪一个I2C子系统中一共有两处对硬件的抽象。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux驱动开发之I2C子系统(2)--通信时序]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/153744415</link><guid>https://blog.csdn.net/mmmm123CC/article/details/153744415</guid><author>mmmm123CC</author><pubDate>Wed, 22 Oct 2025 19:54:34 +0800</pubDate><description><![CDATA[起始信号和终止信号所有的交互都是以START(S)信号开始,并以STOP§信号终止。START(S)信号和STOP§信号都是由线控制器生成的。起始信号(START)：SDA线从高电平到低电平的跳变,同时SCL线保持高电平。终止信号(STOP)：SDA线从低电平到高电平的跳变,同时SCL线保持高电平。注意：在START信号之后,总线被认为是忙碌状态,直到STOP信号出现后总线才被认为空闲。应答信号和非应答信号应答信号发生在每个字节传输之后。应答信号由数据接收方发出。在主设备写操作中，从设备。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux驱动开发之I2C子系统--基础知识]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/153691349</link><guid>https://blog.csdn.net/mmmm123CC/article/details/153691349</guid><author>mmmm123CC</author><pubDate>Tue, 21 Oct 2025 15:51:47 +0800</pubDate><description><![CDATA[​	I2C(Inter-Integrated Circuit)是由飞利浦公司发明的一种集成电路互连通信协议。仅利用两条线路就可以实现芯片之间的互连通信。]]></description><category></category></item><item><title><![CDATA[正点原子I.MX6ULL ALPHA开发板设置静态ip的详细步骤]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/152601170</link><guid>https://blog.csdn.net/mmmm123CC/article/details/152601170</guid><author>mmmm123CC</author><pubDate>Mon, 06 Oct 2025 11:58:31 +0800</pubDate><description><![CDATA[【代码】正点原子I.MX6ULL ALPHA开发板设置静态ip的详细步骤。]]></description><category></category></item><item><title><![CDATA[虚拟机安装|宋宝华《Linux设备驱动开发详解》|将 Baohua_Linux.vmdk 导入 VMware Workstation 17 Pro]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/152211718</link><guid>https://blog.csdn.net/mmmm123CC/article/details/152211718</guid><author>mmmm123CC</author><pubDate>Sun, 28 Sep 2025 11:44:01 +0800</pubDate><description><![CDATA[向导启动后，会询问选择“典型”还是“自定义”。这里选择“自定义(高级)©(Custom (advanced))”，然后点击“下一步”。]]></description><category></category></item><item><title><![CDATA[【Linux经验积累】sshd: no hostkeys available -- exiting.]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/149480413</link><guid>https://blog.csdn.net/mmmm123CC/article/details/149480413</guid><author>mmmm123CC</author><pubDate>Sun, 20 Jul 2025 11:33:56 +0800</pubDate><description><![CDATA[目录下找不到必需的主机密钥（host key）文件，导致启动失败。解决方案：在 Ubuntu 服务器上，为 NFS 根文件系统生成密钥。系统通过 NFS 挂载的根文件系统中后，sshd服务在。Ubuntu终端执行如下命令。]]></description><category></category></item><item><title><![CDATA[【详解】C语言中常用的位运算|嵌入式开发中常用的位操作]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/148994055</link><guid>https://blog.csdn.net/mmmm123CC/article/details/148994055</guid><author>mmmm123CC</author><pubDate>Sun, 29 Jun 2025 10:20:08 +0800</pubDate><description><![CDATA[运算 ，CCM->CCSR寄存器的bits 6-0 被清零，其他位保持不变，然后与88或运算后，即可在(bit 6-0)写。对CCM_CCSR寄存器的bit8和bit13进行操作，bit8写1，bit13写1。创建一个 "清零掩码"，即 bits 6-0 为 0，其他位全为 1。对CCM_CCSR寄存器的 (bit 6-0)写。如果想对CCM_CCSR寄存器的bit8写0。如果想对CCM_CCSR寄存器的bit8写1。在对32位寄存器的操作时，编译器会把。通过或运算实现两部分操作的组合。]]></description><category></category></item><item><title><![CDATA[I.MX6ULL设置内核主频为 528MHz的步骤]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/148977282</link><guid>https://blog.csdn.net/mmmm123CC/article/details/148977282</guid><author>mmmm123CC</author><pubDate>Sat, 28 Jun 2025 15:50:04 +0800</pubDate><description><![CDATA[要将ARM内核主频设为528MHz，需先将系统切换到24MHz的临时时钟，然后安全地将PLL1配置为1056MHz，并设置好2分频的分频器，最后再将系统时钟切回PLL1。由寄存器 CCM_CCSR 的 PLL1_SW_CLK_SEL 位决定 pll1_sw_clk 是选择 pll1_main_clk 还是 step_clk。（对应2分频），将ARM内核时钟的最终分频系数预设为2分频，以防止时钟切换瞬间发生超频。(1056MHz) 经过2分频器后，I.MX6ULL的内核主频成功设置为。]]></description><category></category></item><item><title><![CDATA[【一文讲清】什么是交叉编译？为什么需要交叉编译？交叉编译的流程是什么？]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/148115176</link><guid>https://blog.csdn.net/mmmm123CC/article/details/148115176</guid><author>mmmm123CC</author><pubDate>Wed, 21 May 2025 14:25:36 +0800</pubDate><description><![CDATA[目标平台和开发平台不同：在开发软件时，开发者可能需要将软件运行在一个与其开发机器不同的目标平台上，如编写针对嵌入式设备的应用程序时，开发者通常需要在 PC 上编译，然后将其部署到嵌入式设备中。通过交叉编译器（如gcc-arm-linux-gnueabi）识别目标平台的指令集、系统调用等，编译时链接目标平台库文件，生成匹配的可执行文件。例如，将 ARM 架构的应用程序编译为 x86 架构的应用程序。例如，在x86平台上，使用针对ARM平台的工具，开发针对ARM平台的可执行程序，这个编译过程称为交叉编译。]]></description><category></category></item><item><title><![CDATA[【一文解决】开发板无法上网、ping百度ping不通、ping网关ping不通]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/147271487</link><guid>https://blog.csdn.net/mmmm123CC/article/details/147271487</guid><author>mmmm123CC</author><pubDate>Wed, 16 Apr 2025 10:52:25 +0800</pubDate><description><![CDATA[我的网络拓扑结构：电脑使用手机热点上网，开发板通过网线和电脑直连。]]></description><category></category></item><item><title><![CDATA[正点原子 USB WIFI 模块设置]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/147153420</link><guid>https://blog.csdn.net/mmmm123CC/article/details/147153420</guid><author>mmmm123CC</author><pubDate>Sat, 12 Apr 2025 13:15:00 +0800</pubDate><description><![CDATA[参考文档：【正点原子】阿尔法Linux开发板（A盘）-基础资料\10、用户手册\10、用户手册\01【正点原子】I.MX6U用户快速体验V2.7.pdf\3.22 USB WIFI模块测试该模块为：USB WIFI RTL8188EUS/RTL8188CUS直接插到ALPHA 底板的任意一个USB 接口上，该模块支持热插拔，测试前请插上 12v 电源！]]></description><category></category></item><item><title><![CDATA[version magic ‘4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8 ‘ should be ‘4.1.15-g3dc0a4b SMP]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/147142477</link><guid>https://blog.csdn.net/mmmm123CC/article/details/147142477</guid><author>mmmm123CC</author><pubDate>Fri, 11 Apr 2025 14:03:03 +0800</pubDate><description><![CDATA[在找了很久解决方法但未果后。我决定重头开始，于是我重新拷贝了一份纯净的内核，更改设备树后，使用tftp重新烧写zImage和设备树，这次显示没有问题了，但是缺少根文件系统。因为我使用mfgtool工具重新烧录了正点原子的出厂固件，而设备树与驱动使用的内核是另外传进去的。于是我决定用编译出来的zImage和设备树替换正点原子mfgtool工具中的zImage和设备树，直接使用mfgtool固化系统。因此，首先尝试，对内核重新编译，然后使用tftp重新烧写zImage和设备树，但是遇到了内核恐慌。]]></description><category></category></item><item><title><![CDATA[为什么写是由驱动程序打印，而读的时候却是由应用程序打印呢]]></title><link>https://blog.csdn.net/mmmm123CC/article/details/146776810</link><guid>https://blog.csdn.net/mmmm123CC/article/details/146776810</guid><author>mmmm123CC</author><pubDate>Sun, 30 Mar 2025 21:11:16 +0800</pubDate><description><![CDATA[数据从用户传递到内核后，驱动需要确认数据已正确接收并处理（例如调试或日志记录）。数据已传递到用户空间，应用程序负责处理最终结果（例如显示数据）。在写操作中验证数据接收（如打印日志），但不关心用户如何显示数据。在读操作中提供数据，但不直接参与用户空间的逻辑（如显示数据）。在读操作中接收数据后，根据业务逻辑处理数据（如打印到终端）。在 Linux 驱动程序与应用程序的交互中，在写操作中提交数据，无需关心内核如何处理。） → 应用程序处理数据。示例代码中，应用程序通过。→ 数据从用户空间（→ 数据从内核空间（]]></description><category></category></item></channel></rss>