Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

移植完成后,只能显示输入的数据,无法进入函数 #38

Open
lwFlyFish opened this issue Feb 20, 2020 · 21 comments
Open

Comments

@lwFlyFish
Copy link

移植到STM32,使用keil编译程序。接收和发送没有问题,也初始化函数了,在主循环中调用shellTask(&shell); 配置头文件如下,其他未修改,按照freertos的demo文件来的,实际是裸机运行
#define SHELL_TASK_WHILE 0 #define SHELL_USING_CMD_EXPORT 1
例程时使用的readme.md的普通C函数形式,输入letter:/$ func 666 'A' "hello world",屏幕显示letter:/$ func 666 'A' "hello world"。
请问这是哪里没有配置正确?

@NevermindZZT
Copy link
Owner

串口终端使用的是什么软件,或者可能是命令被优化掉了

@NevermindZZT
Copy link
Owner

在keil的魔术棒工具,打开Options for target对话框,在Linker选项卡中的Misc controls中加 --keep shellCommand*
然后重新编译试试

@NevermindZZT
Copy link
Owner

在keil的魔术棒工具,打开Options for target对话框,在Linker选项卡中的Misc controls中加 --keep shellCommand*
然后重新编译试试

或者修改shell.h第55行为 #define SECTION(x) __attribute__((used, section(x)))

@lwFlyFish
Copy link
Author

在keil的魔术棒工具,打开Options for target对话框,在Linker选项卡中的Misc controls中加 --keep shellCommand*
然后重新编译试试

或者修改shell.h第55行为 #define SECTION(x) attribute((used, section(x)))

用的是secureCRT8.5改section试过了,不行。明天再按照上面的方法试一下。

@lwFlyFish
Copy link
Author

在keil的魔术棒工具,打开Options for target对话框,在Linker选项卡中的Misc controls中加 --keep shellCommand*
然后重新编译试试

试了以下还是同样的现象,追踪了以下过程:
接收数据后进入shellHandler,没有检测到键值,遍历ShellCommand列表也没有结果,
进入shellInsertByte(shell, data);判断数据没有过长,然后插入数据就输出了
过程就结束了,完全没有走到例程的函数。
请问是哪里配置不对吗?

@NevermindZZT
Copy link
Owner

在keil的魔术棒工具,打开Options for target对话框,在Linker选项卡中的Misc controls中加 --keep shellCommand*
然后重新编译试试

试了以下还是同样的现象,追踪了以下过程:
接收数据后进入shellHandler,没有检测到键值,遍历ShellCommand列表也没有结果,
进入shellInsertByte(shell, data);判断数据没有过长,然后插入数据就输出了
过程就结束了,完全没有走到例程的函数。
请问是哪里配置不对吗?

不输入命令,直接按回车,是否会有提示符
确认一下printf函数能否使用

尝试使用此函数

void shellTest()
{
    shellPrint(shellGetCurrent(), "hello world");
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test, shellTest, test);

@lwFlyFish
Copy link
Author

在keil的魔术棒工具,打开Options for target对话框,在Linker选项卡中的Misc controls中加 --keep shellCommand*
然后重新编译试试

试了以下还是同样的现象,追踪了以下过程:
接收数据后进入shellHandler,没有检测到键值,遍历ShellCommand列表也没有结果,
进入shellInsertByte(shell, data);判断数据没有过长,然后插入数据就输出了
过程就结束了,完全没有走到例程的函数。
请问是哪里配置不对吗?

不输入命令,直接按回车,是否会有提示符
确认一下printf函数能否使用

尝试使用此函数

void shellTest()
{
    shellPrint(shellGetCurrent(), "hello world");
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test, shellTest, test);

试了以下还是之前的现象,输入什么数据,就会在屏幕显示数据,不会调用函数。

@NevermindZZT
Copy link
Owner

在keil的魔术棒工具,打开Options for target对话框,在Linker选项卡中的Misc controls中加 --keep shellCommand*
然后重新编译试试

试了以下还是同样的现象,追踪了以下过程:
接收数据后进入shellHandler,没有检测到键值,遍历ShellCommand列表也没有结果,
进入shellInsertByte(shell, data);判断数据没有过长,然后插入数据就输出了
过程就结束了,完全没有走到例程的函数。
请问是哪里配置不对吗?

不输入命令,直接按回车,是否会有提示符
确认一下printf函数能否使用
尝试使用此函数

void shellTest()
{
    shellPrint(shellGetCurrent(), "hello world");
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test, shellTest, test);

试了以下还是之前的现象,输入什么数据,就会在屏幕显示数据,不会调用函数。

直接按tab键会不会出现命令列表,按回车会不会刷新提示符,可以截图看看你的终端的数据吗

@lwFlyFish
Copy link
Author

直接按tab键会不会出现命令列表,按回车会不会刷新提示符,可以截图看看你的终端的数据吗
按tab没反应,按enter返回0D 0A 20,我输入“letter:/$ test”,返回“letter:/$ test”。我不知道怎么上传图片,只要是能解决这个问题,底裤都愿给你看啊。。。。
按enter,数据进入shellHandler(shell, data);后,最终进入shellEnter(shell);这个函数进行条件判断
if(shell->parser.length == 0)
{
shellWriteCommandLine(shell); //进入这个函数,然后就退出了
return;
}

@NevermindZZT
Copy link
Owner

你好。方便把你的工程发到我的邮箱吗,[email protected]

@lwFlyFish
Copy link
Author

你好。方便把你的工程发到我的邮箱吗,[email protected]
工程已发送至邮箱,能看出哪里的问题吗?

@NevermindZZT
Copy link
Owner

你好。方便把你的工程发到我的邮箱吗,[email protected]
工程已发送至邮箱,能看出哪里的问题吗?

邮件被拦截到垃圾箱了,刚刚才看到,我看一下

@NevermindZZT
Copy link
Owner

你好。方便把你的工程发到我的邮箱吗,[email protected]
工程已发送至邮箱,能看出哪里的问题吗?

邮件被拦截到垃圾箱了,刚刚才看到,我看一下

/**
 * @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            0

将shell_cfg.h文件50行左右位置的这三个宏,按照上面的进行修改,试一下

@kkkk-oss
Copy link

kkkk-oss commented May 9, 2024

请问这个问题解决了吗

@NevermindZZT
Copy link
Owner

请问这个问题解决了吗

请问是遇到同样的问题了吗

@kkkk-oss
Copy link

kkkk-oss commented May 9, 2024

请问这个问题解决了吗

请问是遇到同样的问题了吗

是的,我在windows平台用vscode编译器跑这个工程,输入命令后只能回显命令,定位到输入enter键不能成功解析,在
if (base[i].attr.attrs.type == SHELL_TYPE_KEY
&& shellCheckPermission(shell, &(base[i])) == 0)
打印出命令表中所有命令的type都是SHELL_TYPE_CMD_MAIN,所以没有开始处理函数,上面的enter宏都有试过,而且shell->parser.keyValue=0

@NevermindZZT
Copy link
Owner

请问这个问题解决了吗

请问是遇到同样的问题了吗

是的,我在windows平台用vscode编译器跑这个工程,输入命令后只能回显命令,定位到输入enter键不能成功解析,在
if (base[i].attr.attrs.type == SHELL_TYPE_KEY
&& shellCheckPermission(shell, &(base[i])) == 0)
打印出命令表中所有命令的type都是SHELL_TYPE_CMD_MAIN,所以没有开始处理函数,上面的enter宏都有试过,而且shell->parser.keyValue=0

可能需要把命令的 attr.value 打印出来看看,感觉像是数据错位了

@kkkk-oss
Copy link

请问这个问题解决了吗

请问是遇到同样的问题了吗

是的,我在windows平台用vscode编译器跑这个工程,输入命令后只能回显命令,定位到输入enter键不能成功解析,在
if (base[i].attr.attrs.type == SHELL_TYPE_KEY
&& shellCheckPermission(shell, &(base[i])) == 0)
打印出命令表中所有命令的type都是SHELL_TYPE_CMD_MAIN,所以没有开始处理函数,上面的enter宏都有试过,而且shell->parser.keyValue=0

可能需要把命令的 attr.value 打印出来看看,感觉像是数据错位了

base[0]addr: 0x4b06c0 base[0].attr.attrs.type: 0 base[0].attr.value: 2048
base[0].data.cmd.desc: default user, base[0].data.key.desc: default user
base[1]addr: 0x4b06e8 base[1].attr.attrs.type: 0 base[1].attr.value: 256
base[1].data.cmd.desc: set var, base[1].data.key.desc: set var
base[2]addr: 0x4b0710 base[2].attr.attrs.type: 0 base[2].attr.value: 2304
base[2].data.cmd.desc: up, base[2].data.key.desc: up
base[3]addr: 0x4b0738 base[3].attr.attrs.type: 0 base[3].attr.value: 2304
base[3].data.cmd.desc: down, base[3].data.key.desc: down
base[4]addr: 0x4b0760 base[4].attr.attrs.type: 0 base[4].attr.value: 6400
base[4].data.cmd.desc: right, base[4].data.key.desc: right
base[5]addr: 0x4b0788 base[5].attr.attrs.type: 0 base[5].attr.value: 6400
base[5].data.cmd.desc: left, base[5].data.key.desc: left
base[6]addr: 0x4b07b0 base[6].attr.attrs.type: 0 base[6].attr.value: 2304
base[6].data.cmd.desc: tab, base[6].data.key.desc: tab
base[7]addr: 0x4b07d8 base[7].attr.attrs.type: 0 base[7].attr.value: 6400
base[7].data.cmd.desc: backspace, base[7].data.key.desc: backspace
base[8]addr: 0x4b0800 base[8].attr.attrs.type: 0 base[8].attr.value: 6400
base[8].data.cmd.desc: delete, base[8].data.key.desc: delete
base[9]addr: 0x4b0828 base[9].attr.attrs.type: 0 base[9].attr.value: 6400
base[9].data.cmd.desc: delete, base[9].data.key.desc: delete
base[10]addr: 0x4b0850 base[10].attr.attrs.type: 0 base[10].attr.value: 6400
base[10].data.cmd.desc: enter, base[10].data.key.desc: enter
base[11]addr: 0x4b0878 base[11].attr.attrs.type: 0 base[11].attr.value: 8192
base[11].data.cmd.desc: show command info
help [cmd], base[11].data.key.desc: show command info
help [cmd]
base[12]addr: 0x4b08a0 base[12].attr.attrs.type: 0 base[12].attr.value: 8448
base[12].data.cmd.desc: list all user, base[12].data.key.desc: list all user
base[13]addr: 0x4b08c8 base[13].attr.attrs.type: 0 base[13].attr.value: 8448
base[13].data.cmd.desc: list all cmd, base[13].data.key.desc: list all cmd
base[14]addr: 0x4b08f0 base[14].attr.attrs.type: 0 base[14].attr.value: 8448
base[14].data.cmd.desc: list all var, base[14].data.key.desc: list all var
base[15]addr: 0x4b0918 base[15].attr.attrs.type: 0 base[15].attr.value: 8448
base[15].data.cmd.desc: list all key, base[15].data.key.desc: list all key
base[16]addr: 0x4b0940 base[16].attr.attrs.type: 0 base[16].attr.value: 8448
base[16].data.cmd.desc: clear console, base[16].data.key.desc: clear console
base[17]addr: 0x4b0968 base[17].attr.attrs.type: 0 base[17].attr.value: 8448
base[17].data.cmd.desc: run command directly, base[17].data.key.desc: run command directly

@NevermindZZT
Copy link
Owner

请问这个问题解决了吗

请问是遇到同样的问题了吗

是的,我在windows平台用vscode编译器跑这个工程,输入命令后只能回显命令,定位到输入enter键不能成功解析,在
if (base[i].attr.attrs.type == SHELL_TYPE_KEY
&& shellCheckPermission(shell, &(base[i])) == 0)
打印出命令表中所有命令的type都是SHELL_TYPE_CMD_MAIN,所以没有开始处理函数,上面的enter宏都有试过,而且shell->parser.keyValue=0

可能需要把命令的 attr.value 打印出来看看,感觉像是数据错位了

base[0]addr: 0x4b06c0 base[0].attr.attrs.type: 0 base[0].attr.value: 2048 base[0].data.cmd.desc: default user, base[0].data.key.desc: default user base[1]addr: 0x4b06e8 base[1].attr.attrs.type: 0 base[1].attr.value: 256 base[1].data.cmd.desc: set var, base[1].data.key.desc: set var base[2]addr: 0x4b0710 base[2].attr.attrs.type: 0 base[2].attr.value: 2304 base[2].data.cmd.desc: up, base[2].data.key.desc: up base[3]addr: 0x4b0738 base[3].attr.attrs.type: 0 base[3].attr.value: 2304 base[3].data.cmd.desc: down, base[3].data.key.desc: down base[4]addr: 0x4b0760 base[4].attr.attrs.type: 0 base[4].attr.value: 6400 base[4].data.cmd.desc: right, base[4].data.key.desc: right base[5]addr: 0x4b0788 base[5].attr.attrs.type: 0 base[5].attr.value: 6400 base[5].data.cmd.desc: left, base[5].data.key.desc: left base[6]addr: 0x4b07b0 base[6].attr.attrs.type: 0 base[6].attr.value: 2304 base[6].data.cmd.desc: tab, base[6].data.key.desc: tab base[7]addr: 0x4b07d8 base[7].attr.attrs.type: 0 base[7].attr.value: 6400 base[7].data.cmd.desc: backspace, base[7].data.key.desc: backspace base[8]addr: 0x4b0800 base[8].attr.attrs.type: 0 base[8].attr.value: 6400 base[8].data.cmd.desc: delete, base[8].data.key.desc: delete base[9]addr: 0x4b0828 base[9].attr.attrs.type: 0 base[9].attr.value: 6400 base[9].data.cmd.desc: delete, base[9].data.key.desc: delete base[10]addr: 0x4b0850 base[10].attr.attrs.type: 0 base[10].attr.value: 6400 base[10].data.cmd.desc: enter, base[10].data.key.desc: enter base[11]addr: 0x4b0878 base[11].attr.attrs.type: 0 base[11].attr.value: 8192 base[11].data.cmd.desc: show command info help [cmd], base[11].data.key.desc: show command info help [cmd] base[12]addr: 0x4b08a0 base[12].attr.attrs.type: 0 base[12].attr.value: 8448 base[12].data.cmd.desc: list all user, base[12].data.key.desc: list all user base[13]addr: 0x4b08c8 base[13].attr.attrs.type: 0 base[13].attr.value: 8448 base[13].data.cmd.desc: list all cmd, base[13].data.key.desc: list all cmd base[14]addr: 0x4b08f0 base[14].attr.attrs.type: 0 base[14].attr.value: 8448 base[14].data.cmd.desc: list all var, base[14].data.key.desc: list all var base[15]addr: 0x4b0918 base[15].attr.attrs.type: 0 base[15].attr.value: 8448 base[15].data.cmd.desc: list all key, base[15].data.key.desc: list all key base[16]addr: 0x4b0940 base[16].attr.attrs.type: 0 base[16].attr.value: 8448 base[16].data.cmd.desc: clear console, base[16].data.key.desc: clear console base[17]addr: 0x4b0968 base[17].attr.attrs.type: 0 base[17].attr.value: 8448 base[17].data.cmd.desc: run command directly, base[17].data.key.desc: run command directly

运行的平台是大端序吗,参考下 #184

@kkkk-oss
Copy link

请问这个问题解决了吗

请问是遇到同样的问题了吗

是的,我在windows平台用vscode编译器跑这个工程,输入命令后只能回显命令,定位到输入enter键不能成功解析,在
if (base[i].attr.attrs.type == SHELL_TYPE_KEY
&& shellCheckPermission(shell, &(base[i])) == 0)
打印出命令表中所有命令的type都是SHELL_TYPE_CMD_MAIN,所以没有开始处理函数,上面的enter宏都有试过,而且shell->parser.keyValue=0

可能需要把命令的 attr.value 打印出来看看,感觉像是数据错位了

base[0]addr: 0x4b06c0 base[0].attr.attrs.type: 0 base[0].attr.value: 2048 base[0].data.cmd.desc: default user, base[0].data.key.desc: default user base[1]addr: 0x4b06e8 base[1].attr.attrs.type: 0 base[1].attr.value: 256 base[1].data.cmd.desc: set var, base[1].data.key.desc: set var base[2]addr: 0x4b0710 base[2].attr.attrs.type: 0 base[2].attr.value: 2304 base[2].data.cmd.desc: up, base[2].data.key.desc: up base[3]addr: 0x4b0738 base[3].attr.attrs.type: 0 base[3].attr.value: 2304 base[3].data.cmd.desc: down, base[3].data.key.desc: down base[4]addr: 0x4b0760 base[4].attr.attrs.type: 0 base[4].attr.value: 6400 base[4].data.cmd.desc: right, base[4].data.key.desc: right base[5]addr: 0x4b0788 base[5].attr.attrs.type: 0 base[5].attr.value: 6400 base[5].data.cmd.desc: left, base[5].data.key.desc: left base[6]addr: 0x4b07b0 base[6].attr.attrs.type: 0 base[6].attr.value: 2304 base[6].data.cmd.desc: tab, base[6].data.key.desc: tab base[7]addr: 0x4b07d8 base[7].attr.attrs.type: 0 base[7].attr.value: 6400 base[7].data.cmd.desc: backspace, base[7].data.key.desc: backspace base[8]addr: 0x4b0800 base[8].attr.attrs.type: 0 base[8].attr.value: 6400 base[8].data.cmd.desc: delete, base[8].data.key.desc: delete base[9]addr: 0x4b0828 base[9].attr.attrs.type: 0 base[9].attr.value: 6400 base[9].data.cmd.desc: delete, base[9].data.key.desc: delete base[10]addr: 0x4b0850 base[10].attr.attrs.type: 0 base[10].attr.value: 6400 base[10].data.cmd.desc: enter, base[10].data.key.desc: enter base[11]addr: 0x4b0878 base[11].attr.attrs.type: 0 base[11].attr.value: 8192 base[11].data.cmd.desc: show command info help [cmd], base[11].data.key.desc: show command info help [cmd] base[12]addr: 0x4b08a0 base[12].attr.attrs.type: 0 base[12].attr.value: 8448 base[12].data.cmd.desc: list all user, base[12].data.key.desc: list all user base[13]addr: 0x4b08c8 base[13].attr.attrs.type: 0 base[13].attr.value: 8448 base[13].data.cmd.desc: list all cmd, base[13].data.key.desc: list all cmd base[14]addr: 0x4b08f0 base[14].attr.attrs.type: 0 base[14].attr.value: 8448 base[14].data.cmd.desc: list all var, base[14].data.key.desc: list all var base[15]addr: 0x4b0918 base[15].attr.attrs.type: 0 base[15].attr.value: 8448 base[15].data.cmd.desc: list all key, base[15].data.key.desc: list all key base[16]addr: 0x4b0940 base[16].attr.attrs.type: 0 base[16].attr.value: 8448 base[16].data.cmd.desc: clear console, base[16].data.key.desc: clear console base[17]addr: 0x4b0968 base[17].attr.attrs.type: 0 base[17].attr.value: 8448 base[17].data.cmd.desc: run command directly, base[17].data.key.desc: run command directly

运行的平台是大端序吗,参考下 #184

是小端

@NevermindZZT
Copy link
Owner

请问这个问题解决了吗

请问是遇到同样的问题了吗

是的,我在windows平台用vscode编译器跑这个工程,输入命令后只能回显命令,定位到输入enter键不能成功解析,在
if (base[i].attr.attrs.type == SHELL_TYPE_KEY
&& shellCheckPermission(shell, &(base[i])) == 0)
打印出命令表中所有命令的type都是SHELL_TYPE_CMD_MAIN,所以没有开始处理函数,上面的enter宏都有试过,而且shell->parser.keyValue=0

可能需要把命令的 attr.value 打印出来看看,感觉像是数据错位了

base[0]addr: 0x4b06c0 base[0].attr.attrs.type: 0 base[0].attr.value: 2048 base[0].data.cmd.desc: default user, base[0].data.key.desc: default user base[1]addr: 0x4b06e8 base[1].attr.attrs.type: 0 base[1].attr.value: 256 base[1].data.cmd.desc: set var, base[1].data.key.desc: set var base[2]addr: 0x4b0710 base[2].attr.attrs.type: 0 base[2].attr.value: 2304 base[2].data.cmd.desc: up, base[2].data.key.desc: up base[3]addr: 0x4b0738 base[3].attr.attrs.type: 0 base[3].attr.value: 2304 base[3].data.cmd.desc: down, base[3].data.key.desc: down base[4]addr: 0x4b0760 base[4].attr.attrs.type: 0 base[4].attr.value: 6400 base[4].data.cmd.desc: right, base[4].data.key.desc: right base[5]addr: 0x4b0788 base[5].attr.attrs.type: 0 base[5].attr.value: 6400 base[5].data.cmd.desc: left, base[5].data.key.desc: left base[6]addr: 0x4b07b0 base[6].attr.attrs.type: 0 base[6].attr.value: 2304 base[6].data.cmd.desc: tab, base[6].data.key.desc: tab base[7]addr: 0x4b07d8 base[7].attr.attrs.type: 0 base[7].attr.value: 6400 base[7].data.cmd.desc: backspace, base[7].data.key.desc: backspace base[8]addr: 0x4b0800 base[8].attr.attrs.type: 0 base[8].attr.value: 6400 base[8].data.cmd.desc: delete, base[8].data.key.desc: delete base[9]addr: 0x4b0828 base[9].attr.attrs.type: 0 base[9].attr.value: 6400 base[9].data.cmd.desc: delete, base[9].data.key.desc: delete base[10]addr: 0x4b0850 base[10].attr.attrs.type: 0 base[10].attr.value: 6400 base[10].data.cmd.desc: enter, base[10].data.key.desc: enter base[11]addr: 0x4b0878 base[11].attr.attrs.type: 0 base[11].attr.value: 8192 base[11].data.cmd.desc: show command info help [cmd], base[11].data.key.desc: show command info help [cmd] base[12]addr: 0x4b08a0 base[12].attr.attrs.type: 0 base[12].attr.value: 8448 base[12].data.cmd.desc: list all user, base[12].data.key.desc: list all user base[13]addr: 0x4b08c8 base[13].attr.attrs.type: 0 base[13].attr.value: 8448 base[13].data.cmd.desc: list all cmd, base[13].data.key.desc: list all cmd base[14]addr: 0x4b08f0 base[14].attr.attrs.type: 0 base[14].attr.value: 8448 base[14].data.cmd.desc: list all var, base[14].data.key.desc: list all var base[15]addr: 0x4b0918 base[15].attr.attrs.type: 0 base[15].attr.value: 8448 base[15].data.cmd.desc: list all key, base[15].data.key.desc: list all key base[16]addr: 0x4b0940 base[16].attr.attrs.type: 0 base[16].attr.value: 8448 base[16].data.cmd.desc: clear console, base[16].data.key.desc: clear console base[17]addr: 0x4b0968 base[17].attr.attrs.type: 0 base[17].attr.value: 8448 base[17].data.cmd.desc: run command directly, base[17].data.key.desc: run command directly

运行的平台是大端序吗,参考下 #184

是小端

那好奇怪,直接打印出来的 attr.value 是对的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants