栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STM32+FreeRtos 移植letter-shell工具

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STM32+FreeRtos 移植letter-shell工具

前言

        Rt-thread系统有非常好用的FinSH调试工具,考虑在FreeRtos也移植一款类似的嵌入式Shell工具,经过资料查找,开源的letter-shell库满足此需求,搞起。

1、平台

       开发环境:vscode+STM32CubeMX+MDKV5

        芯片:STM32F429

        操作系统:FreeRTOS

        STM32库:HAL

2、串口初始化

通过STM32CubeMX软件直接生成,配置参数如下:

  huart7.Instance = UART7;
  huart7.Init.BaudRate = 9600;
  huart7.Init.WordLength = UART_WORDLENGTH_8B;
  huart7.Init.StopBits = UART_STOPBITS_1;
  huart7.Init.Parity = UART_PARITY_NONE;
  huart7.Init.Mode = UART_MODE_TX_RX;
  huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart7.Init.OverSampling = UART_OVERSAMPLING_16;
3、源码移植

源码下载:

letter-shell: letter shell一个嵌入式小型shell,特别适用于单片机系统。https://gitee.com/zhang-ge/letter-shell.git解压得到下列文件

文件移植

 把文件添加如MDK工程里面

 参照作者的移植步骤,我们重点修改shell_port.c文件:

  • 定义shell对象
Shell shell;
  • 定义shell读,写函数
short userShellWrite(char *data, unsigned short len)
{
    HAL_UART_Transmit(&huart7, (uint8_t *)data, len, 0x1FF);
    return len;
}



short userShellRead(char *data, unsigned short len)
{
    if(HAL_UART_Receive(&huart7, (uint8_t *)data, len, 0xFFFF) != HAL_OK)
    {
        return 0;
    }
    else
    {
        return 1;
    }
    //return HAL_UART_Receive(&huart7, (uint8_t *)data, len, 0);
}
  • 申请一片缓冲区
char shellBuffer[512];
  • 定义互斥锁
static SemaphoreHandle_t shellMutex;
  • 实现上锁解锁功能
int userShellLock(Shell *shell)
{
    xSemaphoreTake(shellMutex, portMAX_DELAY);
    return 0;
}


int userShellUnlock(Shell *shell)
{
    xSemaphoreGive(shellMutex);
    return 0;
}
  • 初始化函数实现
void userShellInit(void)
{
    shellMutex = xSemaphoreCreateMutex();

    shell.write = userShellWrite;
    shell.read = userShellRead;
    shell.lock = userShellLock;
    shell.unlock = userShellUnlock;
    shellInit(&shell, shellBuffer, 512);
    xTaskCreate(shellTask, "shell", 256, &shell, 5, NULL);
}
  • 配置文件修改

去掉了shell伴生对象配置和设置命令触发条件(0x0d)


#ifndef __SHELL_CFG_H__
#define __SHELL_CFG_H__

#include "stm32f4xx_hal.h"
#include "FreeRTOS.h"
#include "portable.h"



#define     SHELL_TASK_WHILE            1


#define     SHELL_USING_CMD_EXPORT      1


#define     SHELL_USING_COMPANION       0



#define     SHELL_SUPPORT_END_LINE      1


#define     SHELL_HELP_LIST_USER        0


#define     SHELL_HELP_LIST_VAR         0


#define     SHELL_HELP_LIST_KEY         1


#define     SHELL_HELP_SHOW_PERMISSION  1


#define     SHELL_ENTER_LF              0


#define     SHELL_ENTER_CR              1


#define     SHELL_ENTER_CRLF            0


#define     SHELL_EXEC_UNDEF_FUNC       0


#define     SHELL_PARAMETER_MAX_NUMBER  8


#define     SHELL_HISTORY_MAX_NUMBER    5


#define     SHELL_DOUBLE_CLICK_TIME     200


#define     SHELL_MAX_NUMBER            5


#define     SHELL_PRINT_BUFFER          128


#define     SHELL_SCAN_BUFFER          128


#define     SHELL_GET_TICK()            HAL_GetTick()


#define     SHELL_USING_LOCK            1


#define     SHELL_MALLOC(size)          pvPortMalloc(size)


#define     SHELL_FREE(obj)             vPortFree(obj)


#define     SHELL_SHOW_INFO             1


#define     SHELL_CLS_WHEN_LOGIN        1


#define     SHELL_DEFAULT_USER          "letter"


#define     SHELL_DEFAULT_USER_PASSWORD ""


#define     SHELL_LOCK_TIMEOUT          0 * 60 * 1000

#endif

4、测试

测试代码如下:

void TestEasyTask(void const *argument)
{

 	userShellInit();

	while(1)
	{
		osDelay(1000);
	}

}


void shell_test(uint32_t num)
{
	printf("shell:%d",num);
}

SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), func, shell_test, test);

打开Mobaxterm软件,设备上电即有信息打印出来 

按下”TAB“键,调出帮助信息

如图输入命令,得到结果

 我们即可通过串口测试shell_test函数

总结

 letter shell是一个C语言编写的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式设备,以C语言函数为运行单位,可以通过命令行调用,运行程序中的函数。通过移植这个工具,方便我们进行模块的单元测试。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/690421.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号