[Linux]学习笔记系列 -- [arm][debug]

文章目录

  • arch/arm/include/debug/stm32.S
    • [addruart 添加debug串口地址](#addruart 添加debug串口地址)
      • [CONFIG_DEBUG_UART_PHYS 和 CONFIG_DEBUG_UART_VIRT](#CONFIG_DEBUG_UART_PHYS 和 CONFIG_DEBUG_UART_VIRT)
    • [waituarttxrdy 等待串口发送准备](#waituarttxrdy 等待串口发送准备)
    • senduart
    • [busyuart 等待串口发送完成](#busyuart 等待串口发送完成)
  • [compressed/debug.S 通过串口打印信息](#compressed/debug.S 通过串口打印信息)
  • arch/arm/kernel/debug.S
    • [addruart_current 添加当前debug串口地址](#addruart_current 添加当前debug串口地址)
    • printascii

https://github.com/wdfk-prog/linux-study

arch/arm/include/debug/stm32.S

addruart 添加debug串口地址

asm 复制代码
.macro	addruart, rp, rv, tmp
	ldr	\rp, =CONFIG_DEBUG_UART_PHYS @ physical base
	ldr	\rv, =CONFIG_DEBUG_UART_VIRT @ virt base
.endm

CONFIG_DEBUG_UART_PHYS 和 CONFIG_DEBUG_UART_VIRT

c 复制代码
//arch/arm/Kconfig.debug
config DEBUG_UART_VIRT
	default DEBUG_UART_PHYS if !MMU
config DEBUG_UART_PHYS
	default 0x40011000 if STM32F4_DEBUG_UART || STM32F7_DEBUG_UART || \
			STM32H7_DEBUG_UART


config STM32H7_DEBUG_UART
	bool "Use STM32H7 UART for low-level debug"
	depends on MACH_STM32H743
	select DEBUG_STM32_UART
	help
		如果需要内核低级调试支持,请在此处说 Y
		在基于 STM32H7 的平台上,默认 UART 连接
		USART1 的 UART 实例,但可以通过修改
		CONFIG_DEBUG_UART_PHYS。

waituarttxrdy 等待串口发送准备

asm 复制代码
// while(TXE ==1);
.macro  waituarttxrdy,rd,rx
1001:	ldr	\rd, [\rx, #(STM32_USART_SR_OFF)]	@ Read Status Register
	tst	\rd, #STM32_USART_TXE			@ TXE = 1 = tx empty
	beq	1001b
.endm

senduart

asm 复制代码
.macro  senduart,rd,rx
	strb    \rd, [\rx, #STM32_USART_TDR_OFF]
.endm

busyuart 等待串口发送完成

asm 复制代码
// while(TC == 1);
.macro  busyuart,rd,rx
1001:	ldr	\rd, [\rx, #(STM32_USART_SR_OFF)]	@ Read Status Register
	tst	\rd, #STM32_USART_TC			@ TC = 1 = tx complete
	beq	1001b
.endm

compressed/debug.S 通过串口打印信息

asm 复制代码
//使用仿真器调试
#ifndef CONFIG_DEBUG_SEMIHOSTING

#include CONFIG_DEBUG_LL_INCLUDE

ENTRY(putc)
	addruart r1, r2, r3
#ifdef CONFIG_DEBUG_UART_FLOW_CONTROL
	waituartcts r3, r1
#endif
	waituarttxrdy r3, r1
	senduart r0, r1
	busyuart r3, r1
	mov	 pc, lr
ENDPROC(putc)

#else
#endif

arch/arm/kernel/debug.S

addruart_current 添加当前debug串口地址

asm 复制代码
		.macro	addruart_current, rx, tmp1, tmp2
		addruart	\rx, \tmp1, \tmp2
		.endm

printascii

asm 复制代码
ENTRY(printascii)
        //添加debug串口寄存器地址
		addruart_current r3, r1, r2
        //检查寄存器 r0 是否为 0,r0 通常存储字符串的起始地址。如果为 0,表示字符串为空
1:		teq	r0, #0
        // r0 不为 0 的情况下,从地址 r0 加载一个字节到寄存器 r1,并将 r0 自增 1
		ldrbne	r1, [r0], #1
        //检查加载的字节是否为字符串的结束符(\0)
		teqne	r1, #0
        //如果当前字符是结束符,返回到调用者
		reteq	lr
//处理换行符
2:		teq     r1, #'\n'   //检查当前字符是否是换行符(\n)
		bne	3f              //如果不是换行符,跳转到标签 3
		mov	r1, #'\r'       //如果是换行符,将其替换为回车符(\r),并通过 UART 发送。
#ifdef CONFIG_DEBUG_UART_FLOW_CONTROL
		waituartcts r2, r3
#endif
		waituarttxrdy r2, r3
		senduart r1, r3
		busyuart r2, r3
		mov	r1, #'\n'       //将换行符(\n)加载到 r1,准备发送
//发送其他字符
3:
#ifdef CONFIG_DEBUG_UART_FLOW_CONTROL
		waituartcts r2, r3
#endif
		waituarttxrdy r2, r3
		senduart r1, r3
		busyuart r2, r3
		b	1b
ENDPROC(printascii)
相关推荐
云运维笔记9 小时前
IP地址从入门到精通:网络通信的核心基石
运维·网络·计算机网络
bosins10 小时前
WSL2 启动即崩溃?调整超时参数解决 Docker 阻塞问题
linux·docker·wsl
智者知已应修善业10 小时前
【4060BD_5V应用电路图】2022-12-24
驱动开发·经验分享·笔记·硬件架构·硬件工程
小弥儿10 小时前
GitHub今日热榜 | 2026-09-18:腾讯双项目上榜
学习·开源
web守墓人10 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
码农学院10 小时前
企业官网改版后 AI 引用归零的复盘:301 重定向断层让爬虫索引掉线,修复方案与恢复数据
运维·geo优化·ai优化aio
kuroomi10 小时前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes
当下新鲜事10 小时前
空调机房冷冻泵与冷却泵技术分析:赛莱默B&G背包式智能变频管道泵的工程应用
运维·物联网·业界资讯
daemon.qiang11 小时前
国内虚拟机对接 Freedesktop:Fork xserver、自建 Runner 与提交 MR 实战
linux·ubuntu·centos·gitlab·开源软件
知识分享小能手12 小时前
深度学习学习教程,从入门到精通,深度生成模型 —— 知识点详解与代码实现(20)
人工智能·深度学习·学习