FreeRTOS-Plus-IO 集成

FreeRTOS-Plus-CLI 是一个可扩展的框架, 应用程序写入器可以通过该框架定义并注册自己的命令行输入命令。提供了单独的文档页面,描述了 如何编写实现用户定义命令行为的函数; 以及如何使用 FreeRTOS-Plus-CLI注册用户定义的命令。

本页介绍了如何将 FreeRTOS-Plus-CLI 移植到真实硬件上,具体做法是通过提供输入输出(IO)例程(routines)和 FreeRTOS-Plus-CLI 任务。

输入和输出

命令行接口可从输入接收字符,并写入 字符到输出。如何实现这一目标的低层次细节 取决于所使用的微控制器,以及由 微控制器提供的接口。

有一项 FreeRTOS-Plus-CLI 特色演示,使用了 FreeRTOS-Plus-IO FreeRTOS_read() 和 FreeRTOS_write() API 函数,向 UART 提供必要的 输入和输出。它创建的命令行接口可通过 标准哑终端程序(如 HyperTerminal)进行访问。还有另一项 FreeRTOS-Plus-CLI 特色演示, 使用了 TCP/IP 套接字接口,提供必要的输入和输出。它创建的命令行接口可使用 telnet 客户端进行访问。运行 FreeRTOS-Plus-CLI 代码的 FreeRTOS 任务结构在两种情况下类似, 如下所示。

示例 FreeRTOS-Plus-CLI 任务

下列源代码可实现用于托管 FreeRTOS-Plus-CLI 命令解释器接口的任务。 FreeRTOS-Plus-IO FreeRTOS_read() 和 FreeRTOS_write() API 函数用于提供 IO 接口。假设 FreeRTOS-Plus-IO 描述符已经 打开并配置为使用中断驱动字符队列传输模式
任务使用 FreeRTOS-Plus-CLI FreeRTOS_CLIProcessCommand() API 函数。
源代码中的注释提供了更多信息。请注意,此函数并非可重入函数。

CRLF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#define MAX_INPUT_LENGTH    50
#define MAX_OUTPUT_LENGTH 100

static const int8_t * const pcWelcomeMessage =
"FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n";

void vCommandConsoleTask( void *pvParameters )
{
Peripheral_Descriptor_t xConsole;
int8_t cRxedChar, cInputIndex = 0;
BaseType_t xMoreDataToFollow;
/* 输入和输出缓冲区被声明为静态,以使它们远离堆栈。 */
static int8_t pcOutputString[ MAX_OUTPUT_LENGTH ], pcInputString[ MAX_INPUT_LENGTH ];

/* 这段代码假设作为控制台使用的外设已经打开并配置,并作为任务参数传递给任务。
将任务参数强制转换为正确的类型。 */
xConsole = ( Peripheral_Descriptor_t ) pvParameters;

/* 当用户知道他们已经连接时,发送一个欢迎信息。 */
FreeRTOS_write( xConsole, pcWelcomeMessage, strlen( pcWelcomeMessage ) );

for( ;; )
{
/* 这个实现一次读取一个字符。在阻塞状态下等待,直到接收到字符。 */
FreeRTOS_read( xConsole, &cRxedChar, sizeof( cRxedChar ) );

if( cRxedChar == '\n' )
{
/* 接收到换行符,因此输入的命令字符串是完整的,可以进行处理。发送一个
行分隔符,只是为了使输出更容易阅读。 */
FreeRTOS_write( xConsole, "\r\n", strlen( "\r\n" );

/* 命令解释器被反复调用,直到它返回pdFALSE。请参阅“实现命令”文档,
了解为什么会这样。 */
do
{
/* 将命令字符串发送到命令解释器(command interpreter)。
命令解释器生成的任何输出都将放在pcOutputString缓冲区中。 */
xMoreDataToFollow = FreeRTOS_CLIProcessCommand
(
pcInputString, /* 命令解释器 */
pcOutputString, /* 输出缓冲区 */
MAX_OUTPUT_LENGTH/* 输出缓冲区的大小 */
);

/* 将命令解释器生成的输出写入控制台。 */
FreeRTOS_write( xConsole, pcOutputString, strlen( pcOutputString ) );

} while( xMoreDataToFollow != pdFALSE );

/* 输入命令生成的所有字符串都已发送。命令处理完成。
清除输入字符串,准备接收下一个命令。 */
cInputIndex = 0;
memset( pcInputString, 0x00, MAX_INPUT_LENGTH );
}
else
{
/* if()子句在接收到换行符后执行处理。如果接收到任何其他字符,
则else子句执行处理。 */

if( cRxedChar == '\r' )
{
/* 忽略回车。 */
}
else if( cRxedChar == '\b' )
{
/* 按了退格键。擦除输入缓冲区中的最后一个字符(如果有的话)。 */
if( cInputIndex > 0 )
{
cInputIndex--;
pcInputString[ cInputIndex ] = '';
}
}
else
{
/* 输入了一个字符。它不是新行、退格或回车(carriage return),
因此它被接受为输入的一部分,并放置到输入缓冲区中。当输入
\n时,完整的字符串将被传递给命令解释器。 */
if( cInputIndex < MAX_INPUT_LENGTH )
{
pcInputString[ cInputIndex ] = cRxedChar;
cInputIndex++;
}
}
}
}
}

实现 FreeRTOS-Plus-CLI 命令控制台的任务示例


FreeRTOS-Plus-IO 集成
https://blog.zhaosn.top/FreeRTOS-plus-CLI/06-A-FreeRTOS-plus-CLI-task/
作者
Zhao SN
发布于
2026年1月9日
更新于
2026年1月21日
许可协议