(rt-thread gdb)cm系列的GDB移植
cm版本已经更新,关于项目的更多说明
见https://code.csdn.net/wzyy2/gdbstub4rtt/tree/master/readme-zh.txt
移植主要分三个主要的实现和debug模式
ps : CM0的断点设置有所不同,不能运行
Debug Monitor(调试监控器)
CM系列可以脱离JTAG调试的主要基础就是debugmon模式
关于debugmon和halt的区别,见以下图
简单的说debugmon可以按照一般的异常处理,而halt是直接停机内核
关于debugmon和halt debug的办法,见以下两张图
使用 debug monitor的办法就是置位DEMCR寄存器的MON_EN
软件唤起debug monitor的办法是置位DEMCR寄存器的MON_PENDING
base = (unsigned long*)(GDB_DEBUG_REG_BASE + GDB_DEBUG_REG_DEMCR);/* * Enable the debug monitor. When enabled, the System handler priority* register controls its priority level.* If disabled, then all debug events go* to Hard fault*/*base |= GDB_DEBUG_REG_DEMCR_MON_EN;//Fall into debug monitor*base |= GDB_DEBUG_REG_DEMCR_MON_PEND;
1.断点(breakpoint)
CM断点的主要实现是使用Flashpatch and Breakpoint(FPB):
.A set of address matching tags, that reroute accesses into flash to a special part of SRAM. This permits patching flash locations for breakpointing and quick fixes orchanges.
FPB可以被编程用来实现断点功能,他有一个比较器,当地址,有两个选择,一是将该地址指向指定的ram地址,二是在该地址设置BKPT指令,因为我们要用的是断点功能,自然是设置断点了
FPB的使用有两个使能位,一个是总开关
// Enable the FPB-FLASH PATCH BREAKPOINT base = (unsigned long*)(GDB_FPB_REG_BASE + GDB_FPB_REG_CTRL);*base |= GDB_FPB_REG_CTRL_KEY | GDB_FPB_REG_CTRL_ENABLE ;
一个是每个比较器的开关
base = (unsigned long*)(GDB_FPB_REG_BASE + GDB_FPB_REG_COMP + i * 4);*base = GDB_FPB_REG_COMP_ADDR & ((unsigned long)(breakinfo[i].addr));if (breakinfo[i].addr & 2)*base |= (1UL << 31); //set BKPT on upper halfwordelse *base |= (1UL << 30); //set BKPT on lower halfword,*base |= GDB_FPB_REG_COMP_ENABLE ;
设置断点的办法如上,把要设置地址的28-2位写入FPB_COMP的28-2位,要在高半字设置断点需要置位BIT31,低半字则置位BIT30
更多功能及寄存器说明见Cortex-M3 Technical Reference Manual 11.4 FPB
2.观察点(watchpoint)
CM观察点的主要实现是使用Data Watchpoint and Trace(DWT)
待更
/*** gdb_breakpoint - generate a breadk* It is used to sync up with a debugger and stop progarm*/
void gdb_breakpoint()
{volatile unsigned long *base;// Enable the FPB-FLASH PATCH BREAKPOINT base = (unsigned long*)(GDB_FPB_REG_BASE + GDB_FPB_REG_CTRL);*base |= GDB_FPB_REG_CTRL_KEY | GDB_FPB_REG_CTRL_ENABLE ;base = (unsigned long*)(GDB_DEBUG_REG_BASE + GDB_DEBUG_REG_DEMCR);/* * Enable the debug monitor. When enabled, the System handler priority* register controls its priority level.* If disabled, then all debug events go* to Hard fault*/*base |= GDB_DEBUG_REG_DEMCR_MON_EN;// Enable DWT*base |= GDB_DEBUG_REG_DEMCR_TRCENA ;//Fall into debug monitor*base |= GDB_DEBUG_REG_DEMCR_MON_PEND;}
// Install the watchpointfor (i = 0; i < HWP_NUM; i++) {if (watchinfo[i].enabled) {base = (unsigned long*)(GDB_DWT_REG_BASE + GDB_DWT_REG_COMP + i * 12);*base = watchinfo[i].addr;base = (unsigned long*)(GDB_DWT_REG_BASE + GDB_DWT_REG_MASK + i * 12);while (watchinfo[i].len >> num) {num++;}*base = num - 1; //DWT matching is performed as:(ADDR & (~0 << MASK)) == COMPbase = (unsigned long*)(GDB_DWT_REG_BASE + GDB_DWT_REG_FUNCTION + i * 12);if (watchinfo[i].type == BP_WRITE_WATCHPOINT) *base = (*base & ~GDB_DWT_REG_FUNCTION_FUC) + 0x05; else if (watchinfo[i].type == BP_READ_WATCHPOINT) *base = (*base & ~GDB_DWT_REG_FUNCTION_FUC) + 0x06; else if (watchinfo[i].type == BP_ACCESS_WATCHPOINT) *base = (*base & ~GDB_DWT_REG_FUNCTION_FUC) + 0x07;} }
更多功能及寄存器说明见Cortex-M3 Technical Reference Manual 11.5 DWT
3.单步(singlestep)
单步主要实现是DEMCR寄存器的MON_STEP位
.When MON_EN= 1, this steps the core. When MON_EN= 0, this bitis ignored. This is the equivalent to C_STEP. Interrupts are only stepped according to the priority of the monitor and settings of PRIMASK, FAULTMASK, or BASEPRI
/*we need to block all pending interrupts by swtting basepri* before doing the steo*/
void gdb_single_step()
{volatile unsigned long *base;//mask all interruptssingle_step_basepri = regs->basepri;regs->basepri = GDB_CORTEXM_PRIORITY_MAX;//When MON_EN = 1, this steps the core base = (unsigned long*)(GDB_DEBUG_REG_BASE + GDB_DEBUG_REG_DEMCR);*base |= GDB_DEBUG_REG_DEMCR_MON_STEP;/* Clear any bits set in DFSR*/base = (unsigned long*)(GDB_NVIC_REG_BASE + GDB_NVIC_REG_DFSR);*base = 0xffffffff;}void gdb_clear_single_step()
{volatile unsigned long *base;regs->basepri = single_step_basepri;/*clear single step*/base = (unsigned long*)(GDB_DEBUG_REG_BASE + GDB_DEBUG_REG_DEMCR);*base &= ~GDB_DEBUG_REG_DEMCR_MON_STEP;// Clear any bits set in DFSRbase = (unsigned long*)(GDB_NVIC_REG_BASE + GDB_NVIC_REG_DFSR);*base = 0xffffffff;
这里有很重要的一点就是我们要通过basepri来屏蔽中断
之所以要屏蔽中断是因为设置单步的目的的是为了到达当前函数的下一行
而不是在中断里单步
如果不屏蔽的话,调试模式返回后会先去执行中断
然后我们就要淹没在无止境的systick里出不来了
还有一个地方就是GDB_CORTEXM_PRIORITY_MAX
#ifndef GDB_CORTEXM_PRIORITY_MAX #define GDB_CORTEXM_PRIORITY_MAX (1 << 6)
#endif
如果优先级分组有更改要更改这个宏
我们设置basepri的目的是屏蔽低优先级的中断,同时不屏蔽debugmon
debugmon的默认优先级是0,所以至少要保证GDB_CORTEXM_PRIORITY_MAX的抢占优先级要大于0
不然可能出现单步之后无法进入调试模式的情况
寄存器说明见Cortex-M3 Technical Reference Manual 10.2.4 Debug Exception and Monitor Control Register
(rt-thread gdb)cm系列的GDB移植相关推荐
- GDB调试程序系列 (3)
GDB调试程序系列 (3) 用GDB调试程序 来源:www.trucy.org (2005-03-23 16:48:14) GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成 ...
- RT Thread Free Modbus移植问题整理
RT Thread Free Modbus移植问题整理 问题描述: 在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常. 在移植过程中发现串口(或RS485)数据接收长度异常. 一.环境描 ...
- 正点原子delay函数移植到rt thread操作系统(HAL库)
正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...
- rt thread studio使用QBOOT和片外flash实现OTA升级
我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...
- RT Thread根据开发板制作BSP方法
之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...
- 【软件开发底层知识修炼】十八 快速学习GDB调试五 使用GDB进行调试的一些小技巧
上一篇文章学习了如何使用GDB进行函数调用栈的查看:[软件开发底层知识修炼]十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看 本篇文章是GDB调试快速学习系列的最后一篇.将综合前几篇文章做一 ...
- linux gdb打印内存命令,gdb中查看内存方法总结
出自计组第三次上机附加题第二题 用gdb运行程序b,输出中相应地址究竟指向了什么? 请贴上你是如何找到的(使用了什么gdb指令等等) 在查看地址前首先需要断点定位到需要查看的位置 显示代码内容 (gd ...
- C语言gdb调试之精髓 | gdb调试多线程
C语言gdb调试之精髓(常用命令.多进程.多线程.程序日志) 起语: 版权声明: C语言技术网原创文章,转载请说明文章的来源.作者和原文的链接. 来源:C语言技术网(www.freecplus.net ...
- 关于RT thread系统节拍时钟的配置
关于RT thread系统节拍时钟的配置 -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...
最新文章
- openstack neutron-fwaas 防火墙之iptables实现细节详解
- 你得学会并且学得会的Socket编程基础知识
- 《Java和Android开发实战详解》——1.2节Java基础知识
- PHP内核的学习--PHP生命周期
- Webpack搭建React开发环境
- 远程过程调用RPC RMI(Remote Method Invocation)和Web Service
- mysql 5.7.17 x86_Windows(x86,64bit)升级MySQL 5.7.17免安装版的详细教程
- 一个关于if else容易迷惑的问题(转自鸟哥公众号)
- Android将应用调试log信息保存在SD卡
- win10 安装db2 10.1 并使用DBserver连接db2数据库
- android 人脸识别边框_虹软人脸识别 - Android Camera实时人脸追踪画框适配
- vs2019中git提交代码的步骤
- wps表格的宏被禁用问题
- cache 提高计算机运行速度,使用cache可以提高计算机的运行速度,是什么原因?...
- Linux救援(rescue)模式知识点
- 大学计算机专业英语期末考试,河南大学计算机专业英语试题
- 网络安全岗位介绍——等级保护测评师
- PMP项目管理学习总结,建议收藏
- 搜索引擎检索的一点经验
- 苏州新导RFID智能机房资产管理系统,RFID资产管理追踪系统
热门文章
- 神策数据:五步构建企业 CDP 全域用户关联数据体系
- 解决微信小程序使用wxcharts在屏幕不固定问题-开发工具里也显示好了布局,为啥到真机就是乱的
- 关联规则挖掘算法研究
- 成功解决:Activiti HikariPool-1 - jdbcUrl is required with driverClassName.
- docker镜像代理配置
- 榆熙电商:提升店铺星级的技巧都有哪些?
- 如何隐藏计算机里的云盘,百度云怎么隐藏空间 百度云隐藏空间图文教程-电脑教程...
- android开发 图片浏览器,Android开发之图片浏览器
- 打印后显示发送服务器错误怎么办,跟后台打印程序系统服务通讯时出现错误的解决方法...
- oracle 之dd