letter-shell 移植适配GHS工具链
1. 添加自定义配置
新建 shell_user_cfg.h
,加入自己的配置选项。
#ifndef __SHELL_USER_CFG_H__
#define __SHELL_USER_CFG_H__
#include <stdlib.h>
#define SHELL_USING_COMPANION 1
#define SHELL_SUPPORT_END_LINE 1
#define SHELL_ENTER_CR 1
#define SHELL_GET_TICK() ostm1_get_system_tick()
#define SHELL_MALLOC(size) malloc(size)
#define SHELL_FREE(obj) free(obj)
#endif
基础只使用 SHELL_ENTER_CR
。
SHELL_USING_COMPANION
:使用log功能时,需要开启。
SHELL_SUPPORT_END_LINE
:使用log功能时,需要开启。用于保持命令提示符在最后一行。
SHELL_GET_TICK
:支持TAB双击显示命令帮助时需要开启。不移植这个接口,TAB键单击,既然是支持补全功能的。
一般使用 -DSHELL_CFG_USER="shell_cfg_user.h"
使默认配置生效。不生效时,直接修改 shell.h
中的 SHELL_CFG_USER
宏为 shell_cfg_user.h
。
2. 代码移植
根据平台移植串口输入输出函数。
完成Shell对象的初始化。
在while(1)中调用 shellTask()
。
3. 编译器相关内容移植
这里使用的是GHS编译工具链。在 shell.h
、shell.c
和 链接脚本中移植编译相关的内容。
shell.h
修改:
#ifndef SHELL_SECTION
#if defined(__CC_ARM) || defined(__CLANG_ARM)
#define SHELL_SECTION(x) __attribute__((section(x), aligned(1)))
#elif defined (__IAR_SYSTEMS_ICC__)
#define SHELL_SECTION(x) @ x
#elif defined(__GNUC__)
#define SHELL_SECTION(x) __attribute__((section(x), aligned(1)))
#elif defined(__ghs__)
#define SHELL_SECTION(x) __attribute__((section("." x), aligned(1)))
#else
#define SHELL_SECTION(x)
#endif
#endif
#ifndef SHELL_USED
#if defined(__CC_ARM) || defined(__CLANG_ARM)
#define SHELL_USED __attribute__((used))
#elif defined (__IAR_SYSTEMS_ICC__)
#define SHELL_USED __root
#elif defined(__GNUC__) || defined(__ghs__)
#define SHELL_USED __attribute__((used))
#else
#define SHELL_USED
#endif
#endif
shell.c
修改:
#if SHELL_USING_CMD_EXPORT == 1
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && __ARMCC_VERSION >= 6000000)
extern const unsigned int shellCommand$$Base;
extern const unsigned int shellCommand$$Limit;
#elif defined(__ICCARM__) || defined(__ICCRX__)
#pragma section="shellCommand"
#elif defined(__GNUC__)
extern const unsigned int _shell_command_start;
extern const unsigned int _shell_command_end;
#elif defined(__ghs__)
extern const unsigned int _shell_command_start;
extern const unsigned int _shell_command_end;
#endif
#else
extern const ShellCommand shellCommandList[];
extern const unsigned short shellCommandCount;
#endif
链接脚本修改:
添加section:
.shellCommand align(4) :>.
设置命令表的起始地址:
__shell_command_start = ADDR(.shellCommand);
__shell_command_end = ENDADDR(.shellCommand);
链接选项配置:
取消 -data_delete
选项,否则,上面设置section会被优化掉。