letter_shell移植

概述

在实际项目开发中,为了方便调试设备,常常需要打印log或者给设备下发指令来进行交互,这时候控制台组件就是一个很好的工具。这里分享一个很强大的嵌入式shell组件。

正文

废话不多说,直接开整。

第一步:获取源码

链接

第二步:准备好具备串口功能的工程,并把源文件加入工程。

在这里插入图片描述

第三步:修改接口文件

修改shell_port.c文件如下

/**
 * @file shell_port.c
 * @author Letter (NevermindZZT@gmail.com)
 * @brief 
 * @version 0.1
 * @date 2019-02-22
 * 
 * @copyright (c) 2019 Letter
 * 
 */

#include "rtthread.h"
#include "shell.h"
#include "dev_uart.h"
#include "stm32f10x.h"

Shell shell;
char shellBuffer[512];

statc rt_mutex_t shellMutex;

/**
 * @brief 用户shell�? * 
 * @param data 数据
 * @param len 数据长度
 * 
 * @return short 实际写入的数据长�? */
short userShellWrite(char *data, unsigned short len)
{
//    serialTransmit(&debugSerial, (uint8_t *)data, len, 0x1FF);
    uart_write(DEV_UART1, (uint8_t *)data, len);
    return len;
}


/**
 * @brief 用户shell�? * 
 * @param data 数据
 * @param len 数据长度
 * 
 * @return short 实际读取�? */
short userShellRead(char *data, unsigned short len)
{
//    return serialReceive(&debugSerial, (uint8_t *)data, len, 0);
    return uart_read(DEV_UART1, (uint8_t *)data, len);
}

/**
 * @brief 用户shell上锁
 * 
 * @param shell shell
 * 
 * @return int 0
 */
int userShellLock(Shell *shell)
{
//    xSemaphoreTakeRecursive(shellMutex, portMAX_DELAY);
    rt_mutex_take(shellMutex, RT_WAITING_FOREVER);
    return 0;
}

/**
 * @brief 用户shell解锁
 * 
 * @param shell shell
 * 
 * @return int 0
 */
int userShellUnlock(Shell *shell)
{
//    xSemaphoreGiveRecursive(shellMutex);
    rt_mutex_release(shellMutex);
    return 0;
}

/**
 * @brief 用户shell初始�? * 
 */
void userShellInit(void)
{
    static rt_thread_t rt_SHELLthread_id = RT_NULL;

//    shellMutex = xSemaphoreCreateMutex();
    shellMutex = rt_mutex_create("shell_mutex", RT_IPC_FLAG_FIFO);

    shell.write = userShellWrite;
    shell.read = userShellRead;
    shell.lock = userShellLock;
    shell.unlock = userShellUnlock;
    shellInit(&shell, shellBuffer, 512);
    rt_SHELLthread_id = rt_thread_create("SHELLthread",
                                shellTask,
                                &shell,
                                512,        //stack size
                                20,            //prioity must<< RT_THREAD_PRIORITY_MAX
                                10);        //timeslice
    if(rt_SHELLthread_id != RT_NULL)
        rt_thread_sta



rtup(rt_SHELLthread_id);
    else
        uart_write(DEV_UART1, "shell task create failed.\r\n", 27);
}

修改shell_cfg.h文件如下

/**
 * @file shell_cfg.h
 * @author Letter (nevermindzzt@gmail.com)
 * @brief shell config
 * @version 3.0.0
 * @date 2019-12-31
 * 
 * @copyright (c) 2019 Letter
 * 
 */

#ifndef __SHELL_CFG_H__
#define __SHELL_CFG_H__

#include "stm32f10x.h"
#include "rtthread.h"


/**
 * @brief 是否使用默认shell任务while循环,使能宏`SHELL_USING_TASK`后此宏有意义
 *        使能此宏,则`shellTask()`函数会一直循环读取输入,一般使用操作系统建立shell
 *        任务时使能此宏,关闭此宏的情况下,一般适用于无操作系统,在主循环中调用`shellTask()`
 */
#define     SHELL_TASK_WHILE            1

/**
 * @brief 是否使用命令导出方式
 *        使能此宏后,可以使用`SHELL_EXPORT_CMD()`等导出命�? *        定义shell命令,关闭此宏的情况下,需要使用命令表的方�? */
#define     SHELL_USING_CMD_EXPORT      1

/**
 * @brief 是否使用shell伴生对象
 *        一些扩展的组件(文件系统支持,日志工具等)需要使用伴生对�? */
#define     SHELL_USING_COMPANION       0


/**
 * @brief 支持shell尾行模式
 */
#define     SHELL_SUPPORT_END_LINE      0

/**
 * @brief 是否在输出命令列表中列出用户
 */
#define     SHELL_HELP_LIST_USER        1

/**
 * @brief 是否在输出命令列表中列出变量
 */
#define     SHELL_HELP_LIST_VAR         0

/**
 * @brief 是否在输出命令列表中列出按键
 */
#define     SHELL_HELP_LIST_KEY         0

/**
 * @brief 是否在输出命令列表中展示命令权限
 */
#define     SHELL_HELP_SHOW_PERMISSION  1

/**
 * @brief 使用LF作为命令行回车触�? *        可以和SHELL_ENTER_CR同时开�? */
#define     SHELL_ENTER_LF              1

/**
 * @brief 使用CR作为命令行回车触�? *        可以和SHELL_ENTER_LF同时开�? */
#define     SHELL_ENTER_CR              1

/**
 * @brief 使用CRLF作为命令行回车触�? *        不可以和SHELL_ENTER_LF或SHELL_ENTER_CR同时开�? */
#define     SHELL_ENTER_CRLF            1

/**
 * @brief 使用执行未导出函数的功能
 *        启用后,可以通过`exec [addr] [args]`直接执行对应地址的函�? * @attention 如果地址错误,可能会直接引起程序崩溃
 */
#define     SHELL_EXEC_UNDEF_FUNC       0

/**
 * @brief shell命令参数最大数�? *        包含命令名在内,超过16个参数并且使用了参数自动转换的情况下,需要修改源�? */
#define     SHELL_PARAMETER_MAX_NUMBER  8

/**
 * @brief 历史命令记录数量
 */
#define     SHELL_HISTORY_MAX_NUMBER    5

/**
 * @brief 双击间隔(ms)
 *        使能宏`SHELL_LONG_HELP`后此宏生效,定义双击tab补全help的时间间�? */
#define     SHELL_DOUBLE_CLICK_TIME     200

/**
 * @brief 管理的最大shell数量
 */
#define     SHELL_MAX_NUMBER            5

/**
 * @brief shell格式化输出的缓冲大小
 *        �?时不使用shell格式化输�? */
#define     SHELL_PRINT_BUFFER          128

/**
 * @brief shell格式化输入的缓冲大小
 *        �?时不使用shell格式化输�? * @note shell格式化输入会阻塞shellTask, 仅适用于在有操作系统的情况下使�? */
#define     SHELL_SCAN_BUFFER           128

/**
 * @brief 获取系统时间(ms)
 *        定义此宏为获取系统Tick,如`HAL_GetTick()`
 * @note 此宏不定义时无法使用双击tab补全命令help,无法使用shell超时锁定
 */
#define     SHELL_GET_TICK()            rt_tick_get() //HAL_GetTick()

/**
 * @brief 使用�? * @note 使用shell锁时,需要对加锁和解锁进行实�? */
#define     SHELL_USING_LOCK            1

/**
 * @brief shell内存分配
 *        shell本身不需要此接口,若使用shell伴生对象,需要进行定�? */
#define     SHELL_MALLOC(size)          rt_malloc(size) //pvPortMalloc(size)

/**
 * @brief shell内存释放
 *        shell本身不需要此接口,若使用shell伴生对象,需要进行定�? */
#define     SHELL_FREE(obj)             rt_free(obj) //vPortFree(obj)

/**
 * @brief 是否显示shell信息
 */
#define     SHELL_SHOW_INFO             1

/**
 * @brief 是否在登录后清除命令�? */
#define     SHELL_CLS_WHEN_LOGIN        1

/**
 * @brief shell默认用户
 */
#define     SHELL_DEFAULT_USER          "letter"

/**
 * @brief shell默认用户密码
 *        若默认用户不需要密码,设为""
 */
#define     SHELL_DEFAULT_USER_PASSWORD ""

/**
 * @brief shell自动锁定超时
 *        shell当前用户密码有效的时候生效,超时后会自动重新锁定shell
 *        设置�?时关闭自动锁定功能,时间单位为`SHELL_GET_TICK()`单位
 * @note 使用超时锁定必须保证`SHELL_GET_TICK()`有效
 */
#define     SHELL_LOCK_TIMEOUT          0 * 60 * 1000

#endif

第四步:调试

添加指令,如下

static void re_boot(void)
{
	__set_FAULTMASK(1);
	NVIC_SystemReset();
}
SHELL_EXPORT_CMD(
SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
re_boot, re_boot, system re_boot);
结果如下

在这里插入图片描述

总结

这样就完成了letter shell的简单移植使用,letter shell还支持日志打印等功能,有兴趣可以自己修改尝试。更多功能可以参考作者git进行使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值