[U-BOOT][STM32F40xx]移植与编写
@[toc] https://github.com/wdfk-prog/u-boot/tree/f4debug 参考 参考uboot现有支持板子与芯片型号 1234567891011├── common├── stih410-b2260├── stm32f429-discovery├── stm32f429-evaluation├── stm32f469-discovery├── stm32f746-disco├── stm32h743-disco├── stm32h743-eval├── stm32h750-art-pi├── stm32mp1└── stm32mp2 使用stm32f429-discovery作为模板配置使用 编译与修改 编译 12export CROSS_COMPILE=arm-none-eabi- ARCH=arm;make configs/stm32f429-discovery_defconfigmake -j12 将编译后的.bin文件烧录到指定地址CONFIG_TEXT_BASE=0x08000000 这个时候是看不到任何现象的...
[uboot][stm32]配置LTDC屏幕
@[toc] https://github.com/wdfk-prog/u-boot 前提 手上刚好有块屏幕,尝试在uboot中点亮一下 使用前请使用其他手段点亮该屏幕确保屏幕的完好再进行操作.确保配置的参数及引脚是可用的. dts设备树修改 ltdc状态修改为重定向前绑定,另外进行GPIO的绑定.根据需要自行配置.注意我使用的是H7系列芯片.不同系列芯片AF的内容不一致,需要自行查看修改. 12345678910111213141516171819202122232425262728293031323334<dc { pinctrl-0 = <<dc_pins>; pinctrl-names = "default"; status = "okay"; bootph-all;};&pinctrl { ltdc_pins: ltdc@0 { pins { pinmux = <STM32_PI...
[Linux][ARM][decompress]decompress使用的malloc函数分析
@[toc] https://github.com/wdfk-prog/linux-study 前言 之所以写这个文章,是因为阅读linux源码时被坑了.直接F12跳转到了其他地方.分析了半天都看不明白.晕头转向的.跳回来在分析了一遍才发现有个坑的地方.特除记录说明. lib/decompress_inflate.c 这里的__gunzip函数需要进行malloc.如果直接用F12进行跳转到函数声明与定义的地方,大概率是跳转到include/linux/decompress/mm.h 123456/* Use defines rather than static inline in order to avoid spurious * warnings when not needed (indeed large_malloc / large_free are not * needed by inflate */#define malloc(a) kmalloc(a, GFP_KERNEL)#define free(a) kfree(a) 实际上这里还未进...
[Linux][ARM][asm bug]BUG宏的理解
@[toc] https://github.com/wdfk-prog/linux-studyhttps://github.com/wdfk-prog/other 编写原因 阅读linux源码时,看到了#define BUG()的定义,便尝试理解.发现自行理解较难,便去网上搜索.搜索了好久,才终于搞懂这一块干了什么.所以写这个文章,给后面的人减少点搜索工作量. 网上搜索的要么不够深入,要么根本不是arm架构的实现. BUG_INSTR 的指令理解 #define BUG()这块自行理解既可,这里着重说明BUG_INSTR为什么要这么写 1234567891011121314151617/* * Use a suitable undefined instruction to use for ARM/Thumb2 bug handling. * We need to be careful not to conflict with those used by other modules and * the register_undef_hook() system. */ ...
[linux][stm32]早期调试启用(DEBUG_LL)教程
@[toc] https://github.com/wdfk-prog/linux/tree/ART-PI_DEBUG DEBUG_LL的功能 开启早期的调试功能 12345678910111213# These options are only for real kernel hackers who want to get their hands dirty.config DEBUG_LL bool "Kernel low-level debugging functions (read help!)" depends on DEBUG_KERNEL help Say Y here to include definitions of printascii, printch, printhex in the kernel. This is helpful if you are debugging code that executes before the console is initialized. Note that select...
[Linux][PR]使用B4向linux内核提交补丁
@[toc] https://people.kernel.org/monsieuricon/sending-a-kernel-patch-with-b4-part-1 1. 使用pip安装1234$ pip install --user b4[...]$ b4 --version0.11.1 2. 使用b4切换分支1b4 prep -n [name-of-branch] -f [nearest-tag] 例如:b4 prep -n __reserved_mem_init_node v6.15-rc2,最好使用-f固定tag版本 3. b4 prep --edit-cover 将自己的补丁信息描述清楚并提交 可以参考修改的文件的其他pr的描述格式进行提交 例如 123456789101112131415of: reserved-mem: Warn for missing initfn in __reservedmem_of_tableFor the data in __reservedmem_of_table, its function pointer initfn ...
[Linux][STM32H7]深入解析:系统时钟源为何被无故修改
@[toc] 问题背景分析在Linux环境下开发STM32H7系列芯片时,发现系统时钟sys_ck的时钟源并非手册标明的默认HSI(High Speed Internal oscillator),而是被配置为PLL1。这种现象需要从系统启动流程的底层进行分析。 关键发现通过追踪系统启动流程,发现u-boot引导阶段已经对时钟进行了重新配置。在u-boot的时钟驱动代码中明确设置了PLL1作为系统时钟源: 1234/* 选择PLL1作为系统时钟源(sys_ck) */clrsetbits_le32(®s->cfgr, RCC_CFGR_SW_MASK, RCC_CFGR_SW_PLL1);while ((readl(®s->cfgr) & RCC_CFGR_SW_MASK) != RCC_CFGR_SW_PLL1) ; 这段代码位于drivers/clk/stm32/clk-stm32h7.c文件的configure_clocks函数中,执行以下操作: 清除RCC_CFGR寄存器中的时钟源选择位 设置PLL1作为新的系统...
内核“创世纪”:新任务的第一次呼吸是如何伪造的?
@[toc] 内核“创世纪”:新任务的第一次呼吸是如何伪造的? 在多任务操作系统中,我们想当然地认为任务切换就是“保存旧任务的状态,恢复新任务的状态”。但一个悖论随之而来:如果一个任务是全新创建的,它从未运行过,自然也就没有一个“旧状态”可供恢复。那么,当调度器第一次选中这个新任务时,CPU的PC指针该跳向何方?SP栈指针又该指向哪里? 答案是:伪造。 内核在创建新任务时,会扮演一名技艺高超的“现场伪造专家”,在任务的内核栈上,手动地、精确地构建一个假的上下文现场。这个假现场看起来就像是这个任务在某个神秘的、预设好的点被正常“切换”出去一样。 本文将带您深入Linux内核的fork过程,揭开新任务“第一次呼吸”背后那令人惊叹的伪造艺术。 创生之地:copy_thread函数当我们在用户空间调用fork()或在内核中创建新线程时,内核最终都会调用一个名为copy_process()的函数。在这个函数中,所有与进程相关的资源被复制。而最核心的、与CPU状态相关的初始化,则发生在copy_thread()这个特定于体系结构的函数中。 copy_thread的使命,就是在新任务(p...
深入内核:ARMv7-M上的Linux调度魔法与PendSV的“延迟艺术”
@[toc] 深入内核:ARMv7-M上的Linux调度魔法与PendSV的“延迟艺术” 当我们将强大的Linux内核移植到资源受限的微控制器(MCU)上,比如基于ARM Cortex-M7的STM32H7时,一个有趣的问题便产生了:这个为拥有MMU、多核心的复杂应用处理器设计的庞然大物,是如何“屈尊”适应一个没有MMU、单核心的MCU环境的? 答案隐藏在内核最底层的汇编代码中。通过探索其调度逻辑和PendSV的触发机制,我们不仅能理解Linux的惊人适应性,更能领略到不同操作系统在同一硬件架构下,因设计哲学的差异而产生的不同实现路径。 本文将基于对Linux内核ARMv7-M架构底层代码的分析,带你走过一场从中断发生到任务切换的完整旅程,并将其与经典的RTOS设计进行对比。 两种哲学:RTOS与Linux的调度模型在深入代码之前,我们必须先理解两种操作系统在调度上的核心差异。 1. 经典RTOS的调度模型:决策与执行的彻底分离在像RT-Thread这样的经典实时操作系统(RTOS)中,调度过程被清晰地分为两步: 决策(在调度器中):调度器(如rt_schedule())...
C++ `virtual` 关键字的沉思:为何“万物皆虚”是反模式?
@[toc] C++ virtual 关键字的沉思:为何“万物皆虚”是反模式? 引言在 C++ 的面向对象编程实践中,virtual 关键字是实现多态性的基石。它允许我们通过基类指针或引用调用派生类的重写函数,是构建灵活、可扩展系统的利器。然而,一个诱人的问题常常浮现在开发者,尤其是单元测试实践者的脑海中:既然虚函数如此强大,且能让依赖模拟(Mocking)变得简单,我们何不将所有成员函数都声明为 virtual 呢? 这是一个触及 C++ 设计哲学核心的问题。简单的回答是:不,绝对不要这样做。 将所有成员函数声明为 virtual 是一种典型的反模式(anti-pattern),它所带来的问题远比它试图解决的要多。本文将深入剖析其弊端,并阐述使用 virtual 的正确时机与设计原则。 一、 “万物皆虚”的沉重代价将所有函数设为虚函数,会从性能、设计意图和编译器优化三个维度对你的软件产生负面影响。 1.1 性能开销 (Performance Overhead)将函数声明为 virtual 并非没有成本。这种成本体现在内存和运行时两个方面。 内存开销: 每个包含至少一个虚函...
![[U-BOOT][STM32F40xx]移植与编写](/images/covers/06.jpg)
![[uboot][stm32]配置LTDC屏幕](/images/covers/02.jpg)
![[Linux][ARM][decompress]decompress使用的malloc函数分析](/images/covers/10.jpg)
![[Linux][ARM][asm bug]BUG宏的理解](/images/covers/07.jpg)
![[linux][stm32]早期调试启用(DEBUG_LL)教程](/images/covers/09.jpg)
![[Linux][PR]使用B4向linux内核提交补丁](/images/covers/01.jpg)
![[Linux][STM32H7]深入解析:系统时钟源为何被无故修改](/images/covers/08.jpg)

