命令解释器的设计及实现
文章目录
- 1 命令解释器的设计及实现
1 命令解释器的设计及实现
命令解释器的实现较为简单,流程简单归纳为:
- 打印命令提示符
- 读取一行字符串
- 解析命令,执行操作,必要时打印结果
主要实现了如下命令:
实现代码如下:
cli.h:
/*** @brief 命令解释器设计* @details* @author 01课堂 李述铜 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版权所有,禁止用于商业用途*/
#ifndef CLI_H
#define CLI_H#define CLI_TASK_PRIO 0
#define CLI_CMD_PROMATE_SIZE 64
#define CLI_TASK_ENV_SIZE 512
#define CLI_CMD_HISTORY_SIZE 1024
#define CLI_CMD_BUFFER_SIZE 128void CLIInit (void);#endif //CLI_H
cli.c:
/*** @brief 命令解释器设计* @details* @author 01课堂 李述铜 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版权所有,禁止用于商业用途*/
#include <string.h>
#include "tinyOS.h"
#include "cli.h"
#include "uart.h"
#include "extio.h"
#include "WaveGen.h"#define TERMINAL_BS 0x08
#define TERMINAL_SPACE ' '
#define TERMINAL_CR '\r'
#define TERMINAL_LF '\n'
#define TERMINAL_TAB '\t'// 空白字符
static const char spaceCh[] = {TERMINAL_SPACE, TERMINAL_CR, TERMINAL_LF, TERMINAL_TAB, '\0'};
static const char * unknownPinMsg = "Unknown Pin\r\n";
static const char * unknownCmdMsg = "Unknown Command!\r\n";
static const char * noEnoughParamMsg = "No Enough Param!\r\n";// 任务相关
static tTaskStack cliTaskEnv[CLI_TASK_ENV_SIZE]; // 任务1的堆栈空间
static tTask cliTask;// 命令行提示缓冲区
static char promoteBuffer[CLI_CMD_PROMATE_SIZE];/*** 显示消息*/
static void showMsg (const char * msg) {UartWrite(msg, strlen(msg));
}/*** 输出显示字符* @param ch*/
static void showCh (const char ch) {UartWrite(&ch, 1);
}/*** 显示提示符*/
static void showPromote (void) {UartWrite(promoteBuffer, strlen(promoteBuffer));
}/*** 更改提示符*/
static void setPromote (const char * newPromote) {strncpy(promoteBuffer, newPromote, sizeof(promoteBuffer));promoteBuffer[sizeof(promoteBuffer) - 1] = '\0';
}/*** 提示符修改命令*/
static void promoteCmd (void) {char * promote = strtok(NULL, spaceCh);if (promote == NULL) {showMsg(noEnoughParamMsg);return;}setPromote(promote);
}/*** 将引脚名转换为内部序号* @param pinCh* @return*/
static ExtIOPin convertPinNum (char * pinCh) {ExtIOPin pinNum;if (pinCh == NULL) {return ExtIOPinEnd;}pinNum = (ExtIOPin)(*pinCh - '0');if (pinNum >= ExtIOPinEnd) {return ExtIOPinEnd;}return pinNum;
}/*** 外部IO命令解析*/
static void extioCmd () {char * type = strtok(NULL, spaceCh);if (type == NULL) {showMsg(noEnoughParamMsg);return;}if (strstr(type, "get")) { // 命令extio get pinExtIOPin pin;ExtIOState state;pin = convertPinNum(strtok(NULL, spaceCh));if (pin == ExtIOPinEnd) {showMsg(unknownPinMsg);return;}state = ExtIOGetState(pin);showMsg((state == ExtIOHigh) ? "1\r\n" : "0\r\n");} else if (strstr(type, "set")) { // 命令extio set pin valueExtIOPin pin;char * value;pin = convertPinNum(strtok(NULL, spaceCh));if (pin == ExtIOPinEnd) {showMsg(unknownPinMsg);return;}value = strtok(NULL, spaceCh);if (value == NULL) {showMsg(noEnoughParamMsg);return;}ExtIOSetState(pin, *value == '0' ? ExtIOLow : ExtIOHigh);} else if (strstr(type, "dir")) { // 命令extio dir pin in/outExtIOPin pin;char *outType;pin = convertPinNum(strtok(NULL, spaceCh));if (pin == ExtIOPinEnd) {showMsg(unknownPinMsg);return;}outType = strtok(NULL, spaceCh);if (outType == NULL) {showMsg(noEnoughParamMsg);return;}ExtIOSetDir(pin, strstr(outType, "in") ? 1 : 0);} else {showMsg(noEnoughParamMsg);}
}/*** 波形输出命令解析*/
static void waveCmd () {char *type = strtok(NULL, spaceCh);if (type == NULL) {showMsg(noEnoughParamMsg);return;}if (strstr(type, "square")) { // 命令wave squareWaveSelectType(WaveSquare);} else if (strstr(type, "start")) {WaveStartOutput();} else if (strstr(type, "stop")) {WaveStopOutput();} else {showMsg(noEnoughParamMsg);}
}/*** 未知命令处理*/
static void unknowCmd (void) {showMsg(unknownCmdMsg);
}/*** 读取一行数据,如果命令超过则截断*/
static void readLine (char * buffer, uint32_t maxLen) {uint32_t index = 0;while (index < maxLen) {char ch;UartRead(&ch, 1);switch (ch) {case TERMINAL_BS: // 退格键if (index > 0) {buffer[index--] = '\0';showCh(TERMINAL_BS);showCh(TERMINAL_SPACE);showCh(TERMINAL_BS);}break;case TERMINAL_CR:showCh(TERMINAL_LF);default:showCh(ch);buffer[index++] = ch;if ((ch == '\n') || (ch == '\r') || (index >= maxLen)) {buffer[index] = '\0';return;}break;}}
}/*** 解析命令*/
static void processCmd (char * cmdLine) {char * cmdStart;// 获取开头cmdStart = strtok(cmdLine, spaceCh);if (cmdStart == NULL) {return;}// 识别命令if (strstr(cmdStart, "extio")) {extioCmd();} else if (strstr(cmdStart, "wave")) {waveCmd();} else if (strstr(cmdStart, "promote")){promoteCmd();} else {unknowCmd();}
}/*** 解释器任务* @param param*/
void cliTaskEntry (void * param) {static char cmdBuffer[CLI_CMD_BUFFER_SIZE];for (;;) {showPromote();readLine(cmdBuffer, sizeof(cmdBuffer));processCmd(cmdBuffer);}
}/*** 命令解释器设计*/
void CLIInit (void) {strcpy(promoteBuffer, ">>");tTaskInit(&cliTask, cliTaskEntry, (void *) 0x0, CLI_TASK_PRIO, cliTaskEnv, sizeof(cliTaskEnv));
}
参考资料:
- 手把手教你学用嵌入式操作系统
命令解释器的设计及实现相关推荐
- C语言 scpi命令解释器,基于Python的SCPI命令解释器的设计
基于Python的SCPI命令解释器的设计 目前可编程仪器标准命令(SCPI)依然被广泛使用,因此设计一个高效通用的SCPI命令解释器很重要.常用的SCPI命令解释器多以C语言开发,采用链式二叉树等存 ...
- 操作系统课设之简单 shell 命令行解释器的设计与实现
前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...
- 操作系统课程设计--在Linux环境下模拟实现简单命令解释器(C++代码)
操作系统课程设计要求 一.设计目的 熟悉Linux编程环境,加强对Linux命令的理解及函数的运用 二.设计内容 1. 在Linux环境下模拟实现简单命令解释器. (1)要求实现的基本命令包括: pw ...
- linux简单命令解释器设计,Linux环境下模拟实现命令解释器
在Linux环境下模拟实现命令解释器 一.程序概述 1.进入系统概述 本次课程设计是在红帽Linux发行版(Red Hat Enterprise Linux AS release 4 (Nahant ...
- C语言 scpi命令解释器,SCPI命令解释器设计
摘要: 随着计算机技术的迅猛发展,受其影响的仪器行业也发生了巨大的变革,即仪器使用的手动操作改为计算机控制的自动测试.世界著名仪器厂家共同研究制定了用于可程控仪器的标准命令SCPI(Standard ...
- 操作系统课程设计---实验十 简单shell命令行解释器的设计与实现
实验十 简单shell命令行解释器的设计与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用,了解 ...
- 操作系统-VM-linux命令解释器
一. 程序概述 完成的任务 1.mypwd列出当前目录的名称. 2.mychdir改变当前目录. 3.mymkdir新建一个目录 4.myrmdir删除文件夹 5.exit退出命令解释器. 6.myr ...
- C语言 scpi命令解释器,SCPI命令解释器的实现.pdf
SCPI命令解释器的实现.pdf 第 10卷 第 3期 信 息 与 电 子 工 程 VO1.10,NO.3 2012年 6月 INFORMATION AND ELECTRONIC ENGINEERIN ...
- C语言 scpi命令解释器,SCPI命令解释器的实现
摘要: 可程控仪器命令标准(SCPI)目前被广泛应用于测试测量仪器的操作控制中.针对数字示波器的SCPI命令集,研究并设计了一种SCPI命令解释器,此命令解释器通过采用二叉树结构来存储数字示波器的SC ...
最新文章
- 腾讯----贪吃的小Q
- 积极打破消极思维模式
- RO38 –比较RemObjects SDK 通道
- Spring 事务使用详解
- JUnit5基本用法
- angular4点击事件监听_angular 事件广播和事件监听
- Chap 06 HTML使用表格
- python之web编程
- LoadRunner11下载以及详细破解说明
- 【项目一、xxx病虫害检测项目】2、网络结构尝试改进:Resnet50、SE、CBAM、Feature Fusion
- 微信小程序发送验证码短信SDK及文档
- php 递归函数返回数组,php递归函数 PHP中Array相关函数简介
- 智和网管平台-真正开放源码的网元管理系统(EMS)
- CSS制作的32种图形效果 梯形 | 三角 | 椭圆 | 平行四边形 | 菱形 | 四分之一圆 | 旗帜
- PC微信3.3.0内测版(新增朋友圈功能)
- 433_ev1527发送端驱动
- WeUI:专为开发微信HTML5应用的开源Web UI组件库
- FCM推送 push
- 中国电信物联网发展研究中心与华为战略合作协议
- 戴森史上最轻吸尘器全球首发,搭配吸头后仅重1.5千克
热门文章
- html任务清单源码,JavaScript jQuery 任务清单 ToDoList
- Java相对路径调用dll文件,VS项目中调用他人提供的.lib和.dll文件的用法(绝对路径和相对路径)...
- 4.3 核对矩阵的维数-深度学习-Stanford吴恩达教授
- 一起学nRF51xx 22 - 实现一个具体SVC调用功能的demo
- 图像配准代码(包含matlab/opencv C++)
- 2、C语言面试笔试---运算符和表达式
- 雅客EXCEL(6)-通用表格格式、销售实际案例(总结之前的知识点)
- 【Ansible】的python api
- 我的第一个Scrapy 程序 - 爬取当当网信息
- Unity UGUI —— 无限循环List(转载)