每次写完代码最头疼的就是测试,大多数时间都得花在这里。要么用串口调试助手、要么用上位机。至于串口调度助手效率,大家都懂的。但又不想每次都写一个上位机、闲暇之余模仿u-boot和rtt-shell 写了一个shell,大多数代码都来自U-BOOT的、做了小小的阉割。
使用方法
/*在需要登记命令的文件内包含shell.h、console.h两个头文件 */
例:
REG_CMD --命令登记宏
(
printconf, --命令名
3, --命令的最大参数个数
do_printconf, --命令处理函数(函数的类型遵循 int (*cmd_callback)(struct cmd_tbl_t *, int argc, char **argv))
"显示系统配置", --简单的使用说明
"打印系统配置信息." --详细使用说明
);
另外由于所有的命令列表都编译到了cmdlist代码段,所以需要在编译器中设置防止cmdlist被优化。
暂时没心思写详细说明,直接给出代码。
代码主要由四个文件组成(Console.c、Console.h、shell.c、shell.h)
Console提供打印移植接口
/*console.h*/
#ifndef _CONSOLE_H_
#define _CONSOLE_H_
#include "app_type.h"
void console_init(void);
void console_putc(const char c);
void console_puts(const char * s);
bool console_get(char *c);
char console_getc(void);
/*---对输入格式化字符串进行检测---*/
void console_printf (const char *fmt, ...) __attribute__((format(printf,1,2)));
#endif
/*console.c*/
#include "includes.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdbool.h>
#include <string.h>
/**==========================================================
*@brief 控制台初始化
*@param none
==========================================================*/
void console_init(void){}
/**==========================================================
*@brief 输出一个字符到串口控制台
*@param c
==========================================================*/
void console_putc(const char c){}
/**==========================================================
*@brief 输出一个字符串到串口控制台
*@param s
==========================================================*/
void console_puts(const char * s){}
/**==========================================================
*@brief 从串口控制台获取一个输入字符
*@retval true:成功获取
==========================================================*/
bool console_get(char *c){}
/**==========================================================
*@brief 从串口控制台获取一个输入字符
*@retval c
*@attetion 阻塞方式调用
==========================================================*/
char console_getc(void){}
static char printbuffer[128];
/**==========================================================
*@brief 打印一个格式化字符串到串口控制台
*@retval
==========================================================*/
void console_printf (const char *fmt, ...)
{
va_list args;
va_start (args, fmt);
vsprintf (printbuffer, fmt, args); //将输入参考格式化后放到缓冲区
va_end (args);
console_puts (printbuffer);
}
/*shell 提供命令处理*/
/*shell.h*/
/**********************************************************************
* @file shell.h
* @brief 命令行处理
*
* @version 1.0
* @date 2015-06-09
* @author roger
*
* Copyright(C) 2015
* All rights reserved.
* Copyright(C) 2015 QQ 932896234
* @reference u-boot
*
***********************************************************************/
#ifndef __SHELL_H_
#define __SHELL_H_
#ifndef NULL
#define NULL 0
#endif
#define CFG_MAXARGS 16 /*最大参数个数-----------------*/
#define CFG_MAXCMDS 30 /*最多允许定义的命令个数-------*/
/*----------------------------------------------------------------------------------------------------------
* Monitor Command Table
--------------------------------------------------------------------------------------------------------*/
typedef struct cmd_tbl_t
{
char *name; /* 命令名 */
char maxargs; &nb

本文介绍了如何在MDK平台上实现Cortex-M3处理器的Shell功能,以简化代码测试。作者分享了从U-BOOT和RTT-Shell中汲取灵感并简化后的Shell代码,包括命令登记、Console接口和Shell处理。通过示例代码,展示了如何使用和注册命令,并提供了命令处理函数。此外,还包含了删除字符、读取行和解析行等实用函数的实现。
最低0.47元/天 解锁文章
1528

被折叠的 条评论
为什么被折叠?



