单片机shell命令_MCU调试大法:使用串口实现简单shell功能

MCU调试大法:使用串口实现简单shell功能

[复制链接]

MCU程序调试方法有很多,比如软/硬件仿真、添加数据打印等。

像Keil MDK就支持不少单片机的软件仿真,在没有拿到单片机的情况下,就可以先仿真调试部分功能,查看代码逻辑是否正确。硬件仿真则需要借助仿真器,如调试Cortex内核MCU常用的J-Link/ST-Link等。通过watch窗口可以查看变量的值:

在代码中添加数据的打印,则需要借助MCU的串口功能,将运行时的关键数据通过串口打印至PC,便于观察。这是我调试时非常喜欢使用的一个功能,因为需要打印哪些数据完全自主可控,而且可以做到基本不影响程序正常运行。

这里顺便把如何使用printf的方法讲一下,比较简单,会的同学可以直接略过:

/@@* 头文件不能少 */

#include <stdio.h>

/@@* 平台的选择 */

#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /@@* __GNUC__ */

PUTCHAR_PROTOTYPE

{

/@@* 这里只需要实现一个字符ch的发送即可,以下以ST为例 */

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);

return ch;

}

可交互的调试方法—shell

有了串口数据打印,寻找BUG方便了不少;但是随着使用场景的增多:比如我需要在某个时刻打印某些数据、需要控制程序进入某个分支、调试算法时需要经常修改某些变量的值。此时光有打印就不行了,我需要一个可以实时和MCU进行交互的系统,那就是shell。

这里介绍一个体积极小的嵌入式shell,功能如下:

命令自动补全,使用tab键补全命令

命令长帮助,使用help [command]显示命令长帮助

长帮助补全,输入命令后双击tab键补全命令长帮助指令

快捷键,支持使用Ctrl + A~Z组合按键直接调用函数

shell变量,支持在shell中查看和修改变量值,支持变量作为命令参数

开始移植

1. 下载源码并添加至工程中:

360截图20191106140620843.jpg (5.14 KB, 下载次数: 0)

2019-11-6 14:06 上传

360截图20191106140437649.jpg (11.25 KB, 下载次数: 2)

2019-11-6 14:06 上传

算上h文件,也就5个。

2. 初始化shell

定义shell全局实体:

SHELL_TypeDef shell;

在main中初始化,这里需要提供write函数,即字符发送函数:

/@@* 初始化shell */

shell.read = NULL; //采用中断方式,所以不需要提供read方法

shell.write = user_shellWrite;

shellInit(&shell);

/@@* shell write定义 */

void user_shellWrite(const char ch)

{

/@@* 实现一个字符ch的发送功能,使用阻塞方式发送 */

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);

}

3. shell调用

在串口接收中断中,调用shellHandler处理函数:

void USART1_IRQHandler(void)

{

HAL_UART_IRQHandler(&huart1);

//将收到的字符实时送入shell处理

shellHandler(&shell, uart1_it_buf);

HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_it_buf, 1);

}

4. 配置

将SHELL_DISPLAY_RETURN关闭,不然会打印shell函数返回值;SHELL_USING_CMD_EXPORT则根据个人喜好来,我这里将其关闭,所以以下将使用命令表来添加命令:

/@@**

*  是否显示命令调用函数返回值

* 使能此宏,则每次调用shell命令之后会以整形和十六进制的方式打印函数的返回值

*/

#define SHELL_DISPLAY_RETURN 0

/@@**

* @brief 是否使用命令导出方式

* 使能此宏后,可以使用`SHELL_EXPORT_CMD()`或者`SHELL_EXPORT_CMD_EX()`

* 定义shell命令,关闭此宏的情况下,需要使用命令表的方式

*/

#define SHELL_USING_CMD_EXPORT 0

5. 添加命令

因为定义了SHELL_USING_CMD_EXPORT为0,所以我们使用命令表来添加命令。在shell.c中,这里我们可以看到默认实现了两个命令help和cls:

const SHELL_CommandTypeDef shellDefaultCommandList[] =

{

SHELL_CMD_ITEM_EX(help, shellHelp, command help, help [command] --show help info of command),

SHELL_CMD_ITEM(cls, shellClear, clear command line),

/@@* 在这里按照格式添加自己的命令,如显示版本 */

SHELL_CMD_ITEM(version, shell_showVersion, show current version),

};

shell_showVersion的实现,可以在其他C文件中实现

/@@**

* @brief shell显示当前软件版本

*

*/

void shell_showVersion(void)

{

SHELL_TypeDef *shell = shellGetCurrent();

if (!shell)

{

return;

}

shellDisplay(shell, "\r\n V1.0.0\r\n");

shellDisplay(shell, "\r\n Build: "__DATE__" "__TIME__"\r\n");

return;

}

6. run

实际效果如下:

按TAB可以显示所有命令,在输入命令时按TAB还可以自动补全。

其他

这里只是完成了最基础的移植工作,还有一些高级的功能就等着大家自行摸索啦。

有了shell调试起来肯定如虎添翼,呼呼哈哈!

还有一点,给客户演示demo的时候,逼格也高了很多,哈哈哈!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Desktop 果然

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />如果是真的&#xff0c;那么果然可怕&#xff0c;还好没有安装&#xff0c;诸位有安装和使用的有没有如下的体验&#xff1f; http://blogs.salon.com/0001561/categories/visual…

[vue] 怎么在vue中使用插件?

[vue] 怎么在vue中使用插件&#xff1f; npm 安装 然后再main.js 引入 最后 vue.use(插件名)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

中文整合包_MIMOSA2: 基于微生物组和代谢组数据的整合分析

MIMOSA2&#xff1a;基于微生物组和代谢组数据的整合分析MIMOSA2 升级自MIMOSA1。是 Borenstein 实验室(http://borensteinlab.com/ , 专注宏基因组系统 生物学)最新开发的工具。用于微生物群落和代谢组的整合分析&#xff0c;寻找微生物和代谢产物之间的关系。先前Borenstein …

微软建议的ASP性能优化28条守则

二十八条改善 ASP 性能和外观的技巧 Len Cardinal&#xff0c;高级顾问&#xff0c;Microsoft Consulting Services George V. Reilly Microsoft IIS Performance Lead 改编自Nancy Cluts 的文章 开发人员技术工程师 Microsoft Corporation 2000 年 4 月 摘要&#xff1a;本文介…

[vue] vue如何监听键盘事件?

[vue] vue如何监听键盘事件&#xff1f; 那要看你怎么监听了, 比如 keyup.enter, 或者直接全局监听个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

同余逆元简单总结

# 同余&逆元 1. 同余 1. 同余的基本概念及性质 若\(x\)%\(ma\)即m是 x-a 的一个因子, 则称x与a关于m同余,记作:\[x \equiv a(mod \;m)\]同余基本性质:○1. 自反性:\(a \equiv a(mod\;m)\) ○2. 对称性:\(a \equiv b(mod\;m) \rightarrow b \equiv a(mod\;m)\) ○3. 传递性:…

python二级简书_12月4日,总结发现杯,备战python二级

上午看二级第一二章下午查询成绩夜晚看第三章做笔记&#xff0c;回看笔记总结&#xff1a;整体不是很理想&#xff0c;但感觉都比我高&#xff0c;呜呜呜他们的成绩一个个的都出来了&#xff0c;我的呢……为什么&#xff0c;还查不到&#xff0c;我知道我考的差&#xff0c;但…

编写高性能 Web 应用程序的 10 个技巧 (转)

http://www.microsoft.com/china/msdn/library/webservices/asp.net/us0501ASPNETPerformance.mspx本文讨论&#xff1a;常见的 ASP.NET 性能神话 有用的 ASP.NET 性能技巧和诀窍 在 ASP.NET 中处理数据库的一些建议 缓冲以及用 ASP.NET 进行后台处理 本文使用下列技术&#xf…

[vue] 怎么在watch监听开始之后立即被调用?

[vue] 怎么在watch监听开始之后立即被调用&#xff1f; let vmnew Vue({el:"#first",data:{msg:liuneng},watch:{msg:{handler (newMsg,oldMsg){console.log(newMsg);},immediate:true}}})设置immediate属性为true个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前…

关于 spring 使用 mongodb 的 mongotemplate 对象操作数据库,对象注入问题(即该对象能否正常的调用相应的CRUD方法来处理数据)...

通过 spring 框架&#xff0c;直接调用一些处理对象的方法和数据库交互&#xff0c; http 接口从 controller 层调用开始&#xff0c; 如果是&#xff1a;controller --> service --> dao --> entity 这个流程正常调用&#xff0c;则&#xff1a; &#xff08;1&#…

二叉搜索时与双向链表python_【剑指offer】26 二叉搜索树与双向链表

- 题目描述输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。- 解题思路递归- Java实现/**public class TreeNode { int val 0; TreeNode left null; TreeNode right nul…

碎片脚本注解(后续整理)

#!/bin/bash#"${1:0:1}"的意思表示提取$1中的第一个字符&#xff0c;变量$1表示的是命令行输出的第一个字符串&#xff0c;#变量$0表示从输出的$1字符传中的第一个字符开始截取&#xff0c;最后一个$1表示只截取一个字符。if [ "${1:0:1}" - ]; then   …

标准配置的Windows平台上潜在可用屏幕区域

经常在windows开发网站的朋友&#xff0c;在开始设计网站时&#xff0c;最需要知道的就是一个图片的大小和尺寸。我本人也是在windows上玩弄了几年的&#xff0c;虽然没有什么正规的证书之类的&#xff0c;但是自己对windows的东西&#xff0c;一些基本的还是知道的&#xff0c…

iframe带了token不显示_不就是登录吗,能有多复杂?sa-token带你轻松搞定多地登陆、单地登录、同端互斥登录...

前言在java的世界里&#xff0c;有很多优秀的权限认证框架&#xff0c;如Apache Shiro、Spring Security 等等。这些框架背景强大&#xff0c;历史悠久&#xff0c;其生态也比较齐全。但同时这些框架也并非十分完美&#xff0c;在前后台分离已成标配的互联网时代&#xff0c;这…

Day 3 in India

时间&#xff1a;2005-4-3 10:15地点&#xff1a;Vikram New Delhi(3) 开始对印度的饮食产生反应昨天中午吃的是印度菜&#xff0c;就是几个碗里面有不同的菜&#xff08;我是这么认为的&#xff09;&#xff0c;然后上一些类似于国内的煎饼之类的东西。先拿一块饼放到自己的盘…

该文件可能是只读的 或者您要访问的位置_喔噢小贴士:如何保护PPT不被更改,将其设为只读...

如果要阻止其他人对Microsoft PowerPoint演示文稿进行编辑&#xff0c;或者让其他人知道您发送的文件是最终版本&#xff0c;则可以将其设为只读。只需要几步点击。注意&#xff1a;虽然将PowerPoint演示文稿设为只读可以很好地阻止其他人编辑您的内容&#xff0c;但解锁只读演…