每次写完代码最头疼的就是测试,大多数时间都得花在这里。要么用串口调试助手、要么用上位机。至于串口调度助手效率,大家都懂的。但又不想每次都写一个上位机、闲暇之余模仿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;