当前位置: 首页 > news >正文

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

文章目录

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

https://github.com/wdfk-prog/linux-study
在这里插入图片描述

arch/arm/include/debug/stm32.S

addruart 添加debug串口地址

.macro	addruart, rp, rv, tmpldr	\rp, =CONFIG_DEBUG_UART_PHYS @ physical baseldr	\rv, =CONFIG_DEBUG_UART_VIRT @ virt base
.endm

CONFIG_DEBUG_UART_PHYS 和 CONFIG_DEBUG_UART_VIRT

//arch/arm/Kconfig.debug
config DEBUG_UART_VIRTdefault DEBUG_UART_PHYS if !MMU
config DEBUG_UART_PHYSdefault 0x40011000 if STM32F4_DEBUG_UART || STM32F7_DEBUG_UART || \STM32H7_DEBUG_UARTconfig STM32H7_DEBUG_UARTbool "Use STM32H7 UART for low-level debug"depends on MACH_STM32H743select DEBUG_STM32_UARThelp如果需要内核低级调试支持,请在此处说 Y在基于 STM32H7 的平台上,默认 UART 连接USART1 的 UART 实例,但可以通过修改CONFIG_DEBUG_UART_PHYS。

waituarttxrdy 等待串口发送准备

// while(TXE ==1);
.macro  waituarttxrdy,rd,rx
1001:	ldr	\rd, [\rx, #(STM32_USART_SR_OFF)]	@ Read Status Registertst	\rd, #STM32_USART_TXE			@ TXE = 1 = tx emptybeq	1001b
.endm

senduart

.macro  senduart,rd,rxstrb    \rd, [\rx, #STM32_USART_TDR_OFF]
.endm

busyuart 等待串口发送完成

// while(TC == 1);
.macro  busyuart,rd,rx
1001:	ldr	\rd, [\rx, #(STM32_USART_SR_OFF)]	@ Read Status Registertst	\rd, #STM32_USART_TC			@ TC = 1 = tx completebeq	1001b
.endm

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

//使用仿真器调试
#ifndef CONFIG_DEBUG_SEMIHOSTING#include CONFIG_DEBUG_LL_INCLUDEENTRY(putc)addruart r1, r2, r3
#ifdef CONFIG_DEBUG_UART_FLOW_CONTROLwaituartcts r3, r1
#endifwaituarttxrdy r3, r1senduart r0, r1busyuart r3, r1mov	 pc, lr
ENDPROC(putc)#else
#endif

arch/arm/kernel/debug.S

addruart_current 添加当前debug串口地址

		.macro	addruart_current, rx, tmp1, tmp2addruart	\rx, \tmp1, \tmp2.endm

printascii

ENTRY(printascii)//添加debug串口寄存器地址addruart_current r3, r1, r2//检查寄存器 r0 是否为 0,r0 通常存储字符串的起始地址。如果为 0,表示字符串为空
1:		teq	r0, #0// r0 不为 0 的情况下,从地址 r0 加载一个字节到寄存器 r1,并将 r0 自增 1ldrbne	r1, [r0], #1//检查加载的字节是否为字符串的结束符(\0)teqne	r1, #0//如果当前字符是结束符,返回到调用者reteq	lr
//处理换行符
2:		teq     r1, #'\n'   //检查当前字符是否是换行符(\n)bne	3f              //如果不是换行符,跳转到标签 3mov	r1, #'\r'       //如果是换行符,将其替换为回车符(\r),并通过 UART 发送。
#ifdef CONFIG_DEBUG_UART_FLOW_CONTROLwaituartcts r2, r3
#endifwaituarttxrdy r2, r3senduart r1, r3busyuart r2, r3mov	r1, #'\n'       //将换行符(\n)加载到 r1,准备发送
//发送其他字符
3:
#ifdef CONFIG_DEBUG_UART_FLOW_CONTROLwaituartcts r2, r3
#endifwaituarttxrdy r2, r3senduart r1, r3busyuart r2, r3b	1b
ENDPROC(printascii)
http://www.dtcms.com/a/317621.html

相关文章:

  • QtMqtt库的编译以及安装
  • 导入Excel打印
  • Excel将整列值转换为字符串
  • 面向流程和产品的安全档案论证方法
  • C语言access函数详解:文件访问权限检查的利器
  • 在WPS或Word中,实现换行不换段落
  • 浙大高飞团队新作:提出层级式探索框架,让「地空双模」机器人自主决策“飞”或“走”
  • 深入理解 C++ 中的stdpriority_queue:从原理到实战的高效优先级管理
  • 并发编程常见问题排查与解决:从死锁到线程竞争的实战指南
  • #3:Maven进阶与私服搭建
  • 自然语言处理基础—(1)
  • MyBatis核心配置深度解析:从XML到映射的完整技术指南
  • UI测试平台TestComplete的AI视觉引擎技术解析
  • 脑洞大开——AI流程图如何改变思维?
  • dify之智能旅游系统应用
  • 旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)
  • Spring Boot + Tesseract异步处理框架深度解析,OCR发票识别流水线
  • 插槽的使用
  • 【AI智能编程】Trae-IDE工具学习
  • nginx代理出https,request.getRequestURL()得到http问题解决
  • SQL120 贷款情况
  • OpenCV校准双目相机并测量距离
  • AsyncAppende异步 + 有界队列 + 线程池实现高性能日志系统
  • 【Axure高保真原型】批量添加和删除图片
  • 目录遍历漏洞学习
  • 概率/期望 DP Jon and Orbs
  • 低代码系统的技术深度:超越“可视化操作”的架构与实现挑战
  • 基于51单片机的温控风扇Protues仿真设计
  • 【FAQ】Script导出SharePoint 目录文件列表并统计大小
  • SQL167 SQL类别高难度试卷得分的截断平均值