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 ...
随机推荐
- Docker 必知必会4----容器之间的通信
前面几篇文章,我们基本聊了docker的基本概念,以及基本的操作手段: https://www.cnblogs.com/jilodream/p/18177695 初识dockerhttps://w ...
- ef.core 事务不回滚的我遇到的一种情况分享
比如有几个Repository:_storeRep,_inventoryRep,_storeItemRep.基类封装有BeginTransaction(): using(var trans=_st ...
- C# npoi追加写入时报错 因为文件格式或文件扩展名无效。
造成原因:workbook对象打开后,没有手动close造成的. 使用的npoi版本:2.6.0 ,环境 win10 .net core 5.0
- Android 12(S) Binder(三)
学以致用,这一节来native binder实战! android 12中的service用到的Bp.Bn文件多由aidl生成,所以实战中也用aidl来生成. 1.文件目录结构 文件目录结构如上,偷懒 ...
- mac http&git代理配置
git代理清除git config --global --unset http.proxygit config --global --unset https.proxy 输出代理:$echo $htt ...
- IOS Video Tool Box后台解码失败
---恢复内容开始--- 1.VideoToolBox硬件解码H264流的过程中,如果App从前台按Home键进入后台,会立马产生一个-12903的错误 如果这个时候重置解码器,继续解码,会遇到 - ...
- kettle从入门到精通 第十七课 kettle Transformation executor
Transformation executor步骤是一个流程控件,和映射控件类似却又不一样. 1.子转换需要配合使用从结果获取记录和复制记录到结果两个步骤,而子映射需要配合映射输入规范和映射输出规范使 ...
- mysql ON DUPLICATE KEY UPDATE 演示
<e>查询:INSERT INTO member_test(mem_no,flag)VALUE('111','1') 错误代码: 1062Duplicate entry '111' for ...
- es语法 rest api 模拟query 根据中文姓名搜索demo
es语法 rest api 模拟query 根据中文姓名搜索demo order_info_es/_doc/40094182abc GET order_info_es/_settings?pretty ...
- GIT 生成变更历史文件清单
脚本搞定git文件版本变化信息,解决部署种变更的审核和统计信息工作复杂问题 git diff --name-status --ignore-cr-at-eol --ignore-space-at-eo ...