Инструменты пользователя

Инструменты сайта


chibios:hal:shell

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
chibios:hal:shell [2014/11/08 00:46]
Ruslan Popov
chibios:hal:shell [2014/11/15 15:29] (текущий)
Ruslan Popov
Строка 1: Строка 1:
 +====== Встроенная командная оболочка ======
  
 +[[http://​chibios.sourceforge.net/​html/​group___s_h_e_l_l.html|Документация на модуль]]
 +
 +{{ :​chibios:​hal:​img_20141108_003201.jpg?​600 |}}
 +
 +В ''​Makefile''​ в секцию ''​CSRC''​ следует добавить:​
 +
 +<​file>​$(CHIBIOS)/​os/​various/​shell.c
 +$(CHIBIOS)/​os/​various/​chprintf.c</​file>​
 +
 +В ''​chconf.h''​ активируем ''​CH_USE_MALLOC_HEAP''​ и ''​CH_USE_DYNAMIC''​.
 +
 +В ''​mcuconf.h''​ активируем использование соответствующего USART для оболочки:​
 +
 +<​file>#​define STM32_SERIAL_USE_USART1 ​   TRUE</​file>​
 +
 +Теперь можно перейти к написанию кода. В файле ''​cmd.h''​ определим константы и функции:​
 +
 +<​file>#​include <​ch.h>​
 +
 +#define SHELL_SD ​        SD1
 +#define SHELL_WA_SIZE ​   THD_WA_SIZE(2048)
 +
 +void cmd_init(void);​
 +void cmd_respawn(void);</​file>​
 +
 +В файле ''​cmd.c''​ определим необходимые функции:​
 +
 +<​file>#​include <​hal.h>​
 +#include <​shell.h>​
 +#include "​cmd.h"​
 +
 +static Thread* th_shell;
 +static void cmd_mem(BaseSequentialStream* chp, int argc, char* argv[]);
 +static void cmd_threads(BaseSequentialStream* chp, int argc, char* argv[]);
 +
 +static const ShellCommand commands[] = {
 +    {"​mem", ​    ​(shellcmd_t) cmd_mem},
 +    {"​threads",​ (shellcmd_t) cmd_threads},​
 +    {NULL, ​     NULL}
 +};
 +
 +static const ShellConfig config = {
 +    (BaseSequentialStream*) &​SHELL_SD,​ commands
 +};
 +
 +void cmd_init(void) {
 +    th_shell = NULL;
 +    shellInit();​
 +}
 +
 +void cmd_respawn(void) {
 +    if (!th_shell) {
 +        th_shell = shellCreate(&​config,​ SHELL_WA_SIZE,​ NORMALPRIO);​
 +        if (th_shell == NULL) {
 +            chprintf((BaseSequentialStream* &​SHELL_SD,​
 +                     "​cmd_respawn:​ heap of %d bytes can not be allocated\n",​
 +                     ​SHELL_WA_SIZE);​
 +        }
 +    } else if (chThdTerminated(th_shell)) {
 +        chThdRelease(th_shell);​
 +        th_shell = NULL;
 +    }
 +}
 +
 +static void cmd_mem(BaseSequentialStream* chp, int argc, char* argv[]) { .. }
 +static void cmd_threads(BaseSequentialStream* chp, int argc, char* argv[]) { .. }</​file>​
 +
 +В своей программе это можно использовать следующим образом:​
 +
 +<​file>#​include "​cmd.h"​
 +
 +int main(void) {
 +    halInit();
 +    chSysInit();​
 +    sdStart(&​SHELL_SD,​ NULL);
 +    cmd_init();
 +    ​
 +    while(!chThdShouldTerminate()) {
 +        cmd_respawn();​
 +        chThdSleepMilliseconds(1000);​
 +    }
 +}</​file>​
 +
 +~~DISQUS~~
chibios/hal/shell.txt · Последние изменения: 2014/11/15 15:29 — Ruslan Popov