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" );
do {
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( 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 命令控制台的任务示例