CM3调试系统简析
CM3 调试系统简析
**“一直以来,单片机的调试一直不是很突出的主题,很多简单些的程序在开发中,甚至都没有调试的概念,而只是把生成的映像直接烧入片子,再根据错误症状来判断问题,然后修改程序重新烧,周而复始,直到问题解决或放弃为止。” **
—《Cortex-M3 权威指南》
大部分初学者在学习嵌入式软件时,往往只注重函数 API 的使用和功能的实现,对于调试工具的使用往往不求甚解,殊不知,熟练使用调试工具对嵌入式设备进行故障排查往往是必不可少的技能。
为什么我们需要使用单片机调试?你可能会问这个问题
畅想一下,当代码有好几个分支时,我们想知道当前代码执行的是哪个分支,或代码执行到某一步时,某个变量的值是多少,抑或是我们想知道某个函数被调用了几次、执行时间是多少?
你可能会说:诶,你看我可以用 LED 状态指示灯来判断当前代码的执行情况啊,我还能用这个串口通信输出变量的值,我看那个串口上位机软件接收时间不就能知道代码执行时间了嘛。
没毛病,这个方法的的确确可以,不过有十分大的限制性:
其一:代码分支复杂情况下无法判断代码执行情况;
其二:无法精确知道代码的执行时间,譬如要求精确到 us 级别;
其三:在功能无法正常运行时,无法进行调试,比如时钟初始化就有问题,后面代码都无法执行。
同时,想象一下如下情况,我们想要同时完成:
(1)使用 ADC 外设扫描八个通道电压值,采样率为 1KHz,我们想知道每个时间点上八个通道的电压值;
(2)与此同时,我们还使用了串口外设,我们想知道某个串口在某种情况下某个寄存器的值;
(3)在某个代码段的某种情况下总是出现 bug,我们想让单片机执行一次代码就暂停一下,同时查看代码中相关变量的值和相关寄存器状态;
(4)整套程序还使用了 RTOS,我们想知道每个任务的执行时间和执行顺序。
此时,你会发现基于串口通信数据输出的“调试方法”不再适用。
你:不慌,你看,我们可以创建一个定时器中断服务程序,利用串口外设,软件定时解析从 PC 端发送的各种指令,对指令进行解析输出寄存器或者变量的值,对各个任务也可以利用 CPU 主频和多个计数变量完成对任务的执行时间和执行顺序的解析。除了不能一步一步执行程序外,照样可以满足其他功能。
**确实,可以,但只限在 MCU 速率较低的情况下,实际上 51 单片机的调试工具 ISD51 在线调试模式下就是这么干的,ISD51 在 8051 系统里增加了一个串口中断函数 (ISD51 中断) 。当 ISD51 连接到 uVision 调试器时, 8051 输入 ISD51 的中断函数。只要到程序运行一被停止, 8051 就只运行 ISD51 中断服务程序。当 uVision2 调试器发出一个"Go"的指令, 8051 就脱离 ISD51 中断函数并且运行用户程序。 **
问题是,该方法会使得程序执行效率大大降低,对于 ISD51 在线模式来说,它的调试会使得程序运行速度将会比原来慢 100 倍,这将使得原本需要高速执行的程序无法正常工作,导致时序出现重大问题。
视频课程可以查看以下链接:
bilibili:https://www.bilibili.com/video/BV1bs4y1k7uT?t=2.2
原文档可以在以下链接下载:
Github:https://github.com/leezisheng/Doc
CM3调试系统简析的更多相关文章
- CRM系统简析
寄语: 简单阐述一下对CRM系统应用的理解,此内容参考网上资料所整理. CRM是Customer Relationship Management的缩写,简称客户关系管理. CRM系统可以从三个方面来分 ...
- DiskGenius注册算法简析
初次接触DiskGenius已经成为遥远的记忆,那个时候还只有DOS版本.后来到Windows版,用它来处理过几个找回丢失分区的案例,方便实用.到现在它的功能越来越强大,成为喜好启动技术和桌面支持人员 ...
- 简析.NET Core 以及与 .NET Framework的关系
简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们 二 .NET Core的到来 1. Runtime 2. Unified BCL 3. W ...
- 简析 .NET Core 构成体系
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
- Android 启动过程简析
首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...
- 简析TCP的三次握手与四次分手【转】
转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...
- AFNetworking封装思路简析
http://blog.csdn.net/qq_34101611/article/details/51698473 一.AFNetworking的发展 1. AFN 1.0版本 AFN 的基础部分是 ...
- 简析 __init__、__new__、__call__ 方法
简析 __init__.__new__.__call__ 方法 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使 用.垃圾回收,不同的 ...
- MySQL 慢查询日志配置与简析
MySQL慢查询日志配置与简析 By:授客 QQ:1033553122 <1> 查看是否开启慢查询日志 SHOW VARIABLES LIKE 'slow%'; 说明: a. 如果sl ...
- Linux 目录结构学习与简析 Part2
linux目录结构学习与简析 by:授客 QQ:1033553122 ---------------接Part 1-------------- #1.查看CPU信息 #cat /proc/cpuinf ...
随机推荐
- JDK源码阅读-------自学笔记(六)(java.util.Arrays用法和描述浅析)
工具类的使用 要多使用这个类,同时,很多算法包含其中,常见操作排序.查找.填充.打印等. 1.打印数组 ------Arrays.toString() 1 // 整型初始化 2 int[] integ ...
- HC32L110(六) AS06-VTB07H V5.0测试板AT指令固件
目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...
- 异构数据源同步之数据同步 → datax 改造,有点意思
开心一刻 去年在抖音里谈了个少妇,骗了我 9 万 后来我发现了,她怕我报警 她把她表妹介绍给我 然后她表妹又骗了我 7 万 DataX DataX 是什么,有什么用,怎么用 不做介绍,大家自行去官网( ...
- Javascript/DOM:如何删除 DOM 对象的所有事件侦听器
Javascript/DOM:如何删除 DOM 对象的所有事件侦听器 一.重写 重写 EventTarget 添加监听事件方法 addEventListener if (EventTarget.pro ...
- Vue cli之安装
1.安装node.js Node.js是一个新的后端(后台)语言,它的语法和JavaScript类似,所以可以说它是属于前端的后端语言,后端语言和前端语言的区别: 运行环境:后端语言一般运行在服务器端 ...
- [C#] 禁用控制台关闭按钮
禁用控制台关闭按钮 internal class Program { [DllImport("user32.dll", EntryPoint = "FindWindow& ...
- 使用Docker快速安装Redis
1.使用docker命令下一个redis的镜像 docker pull redis 2.创建 redis 的 data 目录和 conf 目录 1. cd /home/fengsir/redis 2. ...
- Vue插槽与作用域插槽
title: Vue插槽与作用域插槽 date: 2024/6/1 下午9:07:52 updated: 2024/6/1 下午9:07:52 categories: 前端开发 tags: VueSl ...
- js随机数 比较运算符
// 生成一个随机数 1 - 100 范围内的随机数 // 大家先记住 JavaScript 生成随机数值的 公式 // 如果要 生成 a - b 范围内的数值 ...
- Promise 期约
Promise 期约之前 回调地狱 设想这样一个经常发生的场景,我们希望处理Ajax请求的结果,所以我们将处理请求结果的方法作为回调传入,需要将请求结果继续处理,这就导致我们陷入了回调地狱 doSom ...