|
Строковый парсер на VHDL |
|
|
|
 |
Ответов
|
Jul 3 2017, 07:44
|
Знающий
   
Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450

|
Цитата(Jenya7 @ Jul 3 2017, 11:41)  а как мне определить строку? как массив байтов? Я бы разбирал непосредственно поток байтов на входе парсера. А шаблоны - константы и переходы в машине состояний. Попробуйте написать парсер на Си в виде функции, принимающей входной поток побайтно и разбирающей его с использованием статических переменных предыдущего состояния. А потом переписать это на VHDL.
|
|
|
|
|
Jul 3 2017, 08:06
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(novikovfb @ Jul 3 2017, 12:44)  Я бы разбирал непосредственно поток байтов на входе парсера. А шаблоны - константы и переходы в машине состояний. Попробуйте написать парсер на Си в виде функции, принимающей входной поток побайтно и разбирающей его с использованием статических переменных предыдущего состояния. А потом переписать это на VHDL. шутите? с С на VHDL? это прием строки по UART Код void USART1_IRQHandler(void) { /* RXNE handler */ if ((USART1->SR & USART_IT_RXNE) != RESET) // Received character? { /* Copy data into RX Buffer */ uint8_t chr = (USART1->DR & (uint16_t)0x01FF); if (chr=='\r') //0xD,0xA { usart1_rx_buf[usart1_rx_idx] = '\0'; usart1_rx_idx = 0; usart1_rx_ready = 1; } else { if(chr=='\b') { if (usart1_rx_idx > 0) usart1_rx_idx--; return; } if(usart1_rx_idx < RX1_BUFFERSIZE) //no overflow { usart1_rx_buf[usart1_rx_idx] = chr; usart1_rx_idx++; } else usart1_rx_overflow = 1; } /* Clear RXDATAV interrupt */ //USART_IntClear(UART0, UART_IF_RXDATAV); USART1->SR = (uint16_t)~USART_FLAG_RXNE; } } а это парсер строки Код uint32_t PARSER_ParseInputString(char* str, char** args) { uint32_t argc=0;
args[argc] = strtok(str, ARGS_DELIM);
while (args[argc] != NULL) { if(argc >= ARGS_MAX) return (ARGS_MAX+1); args[++argc] = strtok (NULL, ARGS_DELIM); }
return argc; }
uint32_t PARSER_ParseCommand(char *str) { uint32_t len = strlen(str); char temp_str[len]; strcpy (temp_str, str); uint32_t argc = PARSER_ParseInputString(temp_str, args); if (!argc) return ST_PARSE_NO_ARGS; uint32_t arg_count = (argc - 1); uint32_t i; uint32_t result; char *com = ToLower(args[0]); for (i = 0; i < sizeof(commands); i++) { //command found if (com_found) break; if (strcmp(commands[i].name,com)==0) { com_found = 1; if (arg_count < commands[i].minargs) return ST_PARSE_WRONG_ARGS; if (arg_count > commands[i].maxargs) return ST_PARSE_WRONG_ARGS; result = commands[i].fp(arg_count, args); switch (result) { case MSG_OK: Parser_SendString(USART2, msg_ok, print_out); break; case MSG_INV_INP: Parser_SendString(USART2, msg_invinp, print_out); break; case MSG_INV_ARG: Parser_SendString(USART2, msg_invarg, print_out); break; case MSG_MIS_ARG: Parser_SendString(USART2, msg_misarg, print_out); break; } } } if (com_found) com_found = 0; else { Parser_SendString(USART2, msg_wrncom, print_out); return ST_PARSE_WRONG_COM; } return ST_PARSE_OK; } и как это переписать на VHDL?
|
|
|
|
Сообщений в этой теме
Jenya7 Строковый парсер на VHDL Jul 3 2017, 06:51        novikovfb Цитата(Jenya7 @ Jul 3 2017, 12:06) и как ... Jul 3 2017, 08:14         Maverick Цитата(novikovfb @ Jul 3 2017, 11:14) При... Jul 3 2017, 11:39        AVR Цитата(Jenya7 @ Jul 3 2017, 11:06) и как ... Jul 3 2017, 11:46         Maverick Цитата(AVR @ Jul 3 2017, 14:46) Еще реком... Jul 3 2017, 11:52 Jenya7 спасибо. буду пробовать. хотелось не с нуля, но ви... Jul 3 2017, 14:46 Raven Решение подобной задачи описывается тут:
"Как... Jul 3 2017, 16:29 Maverick Цитата(Raven @ Jul 3 2017, 19:29) Решение... Jul 3 2017, 19:10  XVR Цитата(Maverick @ Jul 3 2017, 22:10) не п... Jul 4 2017, 10:31   Maverick Зачем микропроцессор, неужели команд так много и с... Jul 4 2017, 11:44    XVR Цитата(Maverick @ Jul 4 2017, 14:44) Или ... Jul 4 2017, 14:31    Jenya7 Цитата(Maverick @ Jul 4 2017, 17:44) Заче... Jul 5 2017, 05:58     Maverick Цитата(Jenya7 @ Jul 5 2017, 08:58) Проток... Jul 5 2017, 07:15      Jenya7 Цитата(Maverick @ Jul 5 2017, 13:15) Прив... Jul 5 2017, 07:37       Maverick Цитата(Jenya7 @ Jul 5 2017, 10:37) в конт... Jul 5 2017, 07:52       XVR Цитата(Jenya7 @ Jul 5 2017, 10:37) неужел... Jul 5 2017, 08:27   Maverick Цитата(XVR @ Jul 4 2017, 13:31) http://ww... Jul 5 2017, 08:46  Raven Цитата(Maverick @ Jul 3 2017, 22:10) хоро... Jul 5 2017, 20:58   Maverick Цитата(Raven @ Jul 5 2017, 23:58) Дык, а ... Jul 5 2017, 21:24 Jenya7 Цитата(Raven @ Jul 3 2017, 21:29) Решение... Jul 4 2017, 06:13  novikovfb Цитата(Jenya7 @ Jul 4 2017, 10:13) спасиб... Jul 4 2017, 11:08   Tausinov Цитата(novikovfb @ Jul 4 2017, 14:08) MIP... Jul 4 2017, 11:28    novikovfb Цитата(Tausinov @ Jul 4 2017, 15:28) Вам ... Jul 4 2017, 11:35 GriXa Добрый день!
Мне кажется, с помощью простых if... Jul 4 2017, 09:26 Jenya7 Цитата(GriXa @ Jul 4 2017, 15:26) Добрый ... Jul 4 2017, 11:06 vladec Посмотрите по ресурсам, может уложите задачу в оди... Jul 5 2017, 07:45 Jenya7 Цитата(vladec @ Jul 5 2017, 13:45) Посмот... Jul 5 2017, 08:02  novikovfb Цитата(Jenya7 @ Jul 5 2017, 11:57) я не х... Jul 5 2017, 08:04   Jenya7 Цитата(novikovfb @ Jul 5 2017, 14:04) как... Jul 5 2017, 08:23    Maverick Цитата(Jenya7 @ Jul 5 2017, 11:23) вариан... Jul 5 2017, 08:25  Maverick Цитата(Jenya7 @ Jul 5 2017, 11:02) я хочу... Jul 5 2017, 08:14 Leka Цитатаsome_command arg1 arg2 \r
"Железны... Jul 5 2017, 09:25 XVR Цитата(Leka @ Jul 5 2017, 12:25) "Же... Jul 5 2017, 10:12 Jenya7 Цитата(Leka @ Jul 5 2017, 15:25) "Же... Jul 5 2017, 10:32 Unfog Если есть возможность самому выбирать протокол, до... Jul 10 2017, 12:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|