目录
letter shell是一个C语言编写的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式设备,以C语言函数为运行单位,可以通过命令行调用,运行程序中的函数。拥有命令自动补全、快捷键功能定义、命令权限管理、用户管理、变量支持、代理函数和参数代理解析等功能。
源码地址:NevermindZZT/letter-shell: letter shell (github.com)
如果上不去可以在国内镜像:letter-shell: letter shell一个嵌入式小型shell,特别适用于单片机系统。 (gitee.com)
这篇文章是基于f1编写的。
STM32+FreeRtos 移植letter-shell工具_freertos shell-CSDN博客
这篇文章是基于f4编写的,但略显粗糙。
硬件:STM32F407ZG
开发工具:Cube IDE
串口助手:MobaXterm
项目源码:letter shell 3.2.3
设置debug端口,为了给freeRTOS让出时钟,将基础时钟远改为其他定时器。
根据自己需要配置串口,这里可以根据需要配置中断和dma,反正shell没用,你自己要用就配上。
配置freeRTOS并启用V2版本,因为shell用了锁,V2修改更简单一些,V1理论也是可以的,就需要修改一些东西。
定义任务,其中有几个东西需要特别注意,栈的大小与你在shell中运行的程序有关,所以志至少需要256,名字必须叫shellTask函数类型必须选As weak,因为代码中实现了shellTask,所以也不要在生成的shellTask中写逻辑,因为不会运行,参数必须要&shell。后面会说这个变量在哪里。
生成单独的.C和.h文件。
在工程根目录创建LetterShell文件夹,里面创建inc和src文件夹。
总结就是把demo/stm32-freereos,src中的c和h分别放到inc和src中,其中log,game,shell_enhance是可选的,我是为了玩自己加上的。
在工程中找到properties或者直接alt+enter,然后把创建的文件夹加入到工程中,
先修改letter shell的源码
shell_cfg.h
在该文件开头加入stm32头文件
设置scan buffer,只有使用操作系统的才可以,修改tick实现,使用锁
设置用户名和密码可选
shell_ext.h中添加头文件
shell_port.h删除#include "serial.h",因为没有。
2048.c选择性添加,如果你没添加就不用改了,建议不填加,这个游戏显示有些问题。
重点文件到了shell_port.c
添加#include "semphr.h",删除#include "serial.h",?#include "cevent.h"
修改userShellWrite和userShellRead函数
将userShellInit中的创建任务函数注释掉,因为我们在前面用ide生成了任务。
注释掉CEVENT_EXPORT(EVENT_INIT_STAGE2, userShellInit);
捎带手在最后添加一个测试的函数
void shellTest(int a, int b, int c)
{
shellPrint(&shell, "This is test\r\n");
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
test, shellTest, This is test);
至此,shell源码就改完了,开始修改stm32的代码。
在mian.c函数添加头文件#include "shell_port.h"
在初始化调用userShellInit
在freereos.c文件中
添加头文件#include "shell.h"? 和#include "shell_port.h"
修改STM32F407ZGTX_FLASH.ld
在.rodata :里面添加如下代码
. = ALIGN(4);
_shell_command_start = .;
KEEP (*(shellCommand))
_shell_command_end = .;
. = ALIGN(4);
可以了,目前为止代码就准备完了。编译代码并下载。
密码登录
命令行执行
推箱子游戏。
很可惜,只有一关。