smalcom 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба в микроконтролере! вы шутите так? вы просите научить вас пунктуации, хотя коверкаете слова. вам естественно предлагают сначала освоить орфографию. вы сопротивляетесь. судя по темам вам в впринципе не интересно учиться, вы просто идёте на результат. в таком случае воспользуйтесь поиском по форуму - подобный вопрос поднимался неоднократно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 18 27 января, 2016 Опубликовано 27 января, 2016 (изменено) · Жалоба ну распарсили мы строку! все прекрасно! куда сохранять результаты парсинга? конкретно в железе! в микроконтролере! Так не надо выделять место в памяти для хранения всех лексем поотдельности - они уже есть в исходной строке, парсер динамически её обрабатывает. Грубо говоря, нужно выделить место для хранения одной лексемы: char *expr; //Указатель на обрабатываемую строку char token[80]; //Лексема Там в статье всё расписано + приведён полностью рабочий код. Вам достаточно в нем заменить пару функций на свои. Кстати, там же указана ссылка на пероисточник - Герберт Шилдт, Полный справочник по C (Глава 24. Синтаксичекий разбор и вычисление выражений). Изменено 27 января, 2016 пользователем arhiv6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 17 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини Programmable Logic Controller. ... и я это сохраняю и потом проверяю и если условие выполняется - включаю\выключаю нужные выходы. вопрос есть ли какие то готовые библиотеки а-ля-PLC? Ваша задача не имеет никакого отношения к PLC, это полная чушь. То, что вы тут накалякали, в принципе может быть реализовано путем создания некого скриптового языка. Тем не менее для грамотного решения , вам придется озаботиться и БНФ, и парсингом, и интерпретатором. Однако поскольку вы демонстрируете чрезвычайно низкий уровень знаний и очень много гонора, то шансы на то, что вы сподобитесь решить эту задачу "в общем виде", исчезающе малы. Один из грамотных вариантов решения, который вам может оказаться посильным, таков: освойте язык Форт, поставьте Форт-систему на вашу целевую платформу и задайте для пользователя словарь только с определенными вами Форт словами, а все остальные Форт слова сделайте недоступными для пользователя. При этом парсингом займется Форт система, правда, синтаксис псевдо-языка будет с обратной польской записью. При желании и это можно изменить, да только вряд ли нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба распарсить команды у меня нет проблем. вопрос где хранить входные условия и как их сравнивать. вопрос как организовать хранение и сравнение логики входных условий. Можно сделать не компилятор, и интерпретатор. Тогда ничего "хранить" не надо выполнение делается при обработке строк... Правда это "медленнее", чем если сначала откомпилировать, а потом исполнять "переваренный" код... Но зато проще сделать программу обработки. Вообще если сделать два вида исходных строк, то дело будет значительно проще реализовать. 1. "Арифметические строки" - введите "внутренние переменные", где "входы" или "внутренние переменные" проверяются на "больше-меньше" или "+/-" и результат этих действий превращается в битовые переменные 2. "Логические строки" в которых обрабатываются "битовые переменные" Ну и Форт-система это тоже вариант.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба Ваша задача не имеет никакого отношения к PLC, это полная чушь. То, что вы тут накалякали, в принципе может быть реализовано путем создания некого скриптового языка. Тем не менее для грамотного решения , вам придется озаботиться и БНФ, и парсингом, и интерпретатором. Однако поскольку вы демонстрируете чрезвычайно низкий уровень знаний и очень много гонора, то шансы на то, что вы сподобитесь решить эту задачу "в общем виде", исчезающе малы. Один из грамотных вариантов решения, который вам может оказаться посильным, таков: освойте язык Форт, поставьте Форт-систему на вашу целевую платформу и задайте для пользователя словарь только с определенными вами Форт словами, а все остальные Форт слова сделайте недоступными для пользователя. При этом парсингом займется Форт система, правда, синтаксис псевдо-языка будет с обратной польской записью. При желании и это можно изменить, да только вряд ли нужно. от вашей демонстрации грандиозных знаний с тоже нех..илым апломбом толку мало. таких советов я могу каждый день выдавать пачками. Так не надо выделять место в памяти для хранения всех лексем поотдельности - они уже есть в исходной строке, парсер динамически её обрабатывает. Грубо говоря, нужно выделить место для хранения одной лексемы: char *expr; //Указатель на обрабатываемую строку char token[80]; //Лексема Там в статье всё расписано + приведён полностью рабочий код. Вам достаточно в нем заменить пару функций на свои. это очень смелое заявление. таких заявлений я могу каждый день выдавать пачками. Можно сделать не компилятор, и интерпретатор. Тогда ничего "хранить" не надо выполнение делается при обработке строк... Правда это "медленнее", чем если сначала откомпилировать, а потом исполнять "переваренный" код... Но зато проще сделать программу обработки. Вообще если сделать два вида исходных строк, то дело будет значительно проще реализовать. 1. "Арифметические строки" - введите "внутренние переменные", где "входы" или "внутренние переменные" проверяются на "больше-меньше" или "+/-" и результат этих действий превращается в битовые переменные 2. "Логические строки" в которых обрабатываются "битовые переменные" Ну и Форт-система это тоже вариант.... извините но - тоже пачками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба ТС изобрел велосипед с квадратными колесами и на любые попытки форумчан посоветовать более адекватное средство передвижения посылает всех в лес, со словами - 'мне ехать надо, а не ваши глупые советы слушать'. Ждем, когда ТС 'изобретет' стек, а там уже и до Форта недалеко :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба ТС изобрел велосипед с квадратными колесами и на любые попытки форумчан посоветовать более адекватное средство передвижения посылает всех в лес, со словами - 'мне ехать надо, а не ваши глупые советы слушать'. Ждем, когда ТС 'изобретет' стек, а там уже и до Форта недалеко :) Вот только "изобретет" у ТС не получится. Ибо самые большие и самые дорогие ошибки делаются в начале проекта. А у него это как раз и произошло. И объяснить, что подобные задачи многими решены - для него невозможно. Я например делал такой контроллер в ПЛИС из двух микроконтроллеров в связке... Но ведь ТС и понимать ничего не хочет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба Вот только "изобретет" у ТС не получится. Ибо самые большие и самые дорогие ошибки делаются в начале проекта. А у него это как раз и произошло. И объяснить, что подобные задачи многими решены - для него невозможно. Я например делал такой контроллер в ПЛИС из двух микроконтроллеров в связке... Но ведь ТС и понимать ничего не хочет... я прекрасно понимаю что эта задача многими решена. поэтому и обратился на форум. только решения не вижу. одна претенциозная болтовня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба я прекрасно понимаю что эта задача многими решена. поэтому и обратился на форум. только решения не вижу. одна претенциозная болтовня. Вот тяжело с глухим говорить... Прежде чем спрашивать "где хранить что-то" ответьте на первый вопрос. Что хотите сделать: компилятор или интерпретатор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба Вот тяжело с глухим говорить... Прежде чем спрашивать "где хранить что-то" ответьте на первый вопрос. Что хотите сделать: компилятор или интерпретатор? я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются. вы предлагаете хранить 10 строк и постоянно их парсить. я же один раз распарсил - положил все в структуру - и работаю с ней. структура прекрасно работает. единственно где я падаю - на сложных логических группировках. которые как я понимаю можно хранить в структуре - я просто не могу придумать конструкцию структуры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба 'Сложные логические группировки' в простой структуре сохранить невозможно. Можете дальше ничего не придумывать. Вам уже говорили, как такие задачи решаются, но видимо для вас это 'одна претенциозная болтовня'. Попробую еще раз - вам нужна стековая виртуальная машина, которая будет исполнять байт код (который в свою очередь получен из исходных скриптов). Например, ваш исходный скрипт - If (temp > 30 && hum > 80 || input1 ==1) { // условие на выходе output2 = 1; } будет в байт коде выглядеть как то так: @temp // Read Temp var 30 // Push constant 30 > // Compare operation cjmpf L1 // Conditional jump if false @hum 80 > cjmpt L2 L1: @input1 1 == cjumpt L2 return L2: 1 set output2 // Write value from stack to 'output2' variable return Каждая строка здась закодированна каким то числом (опкод) + дополнительная информация (имя или адрес переменной, адрес для перехода и пр.) Альтернативной стековой машиной, уже упоминавшейся тут, будет Форт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 5 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба от вашей демонстрации грандиозных знаний с тоже нех..илым апломбом толку мало. таких советов я могу каждый день выдавать пачками. это очень смелое заявление. таких заявлений я могу каждый день выдавать пачками. извините но - тоже пачками. Автор! Попробуйте прислушаться к советам и не хамить. Я совершенно не понимаю, откуда возьмётся желание искать приемлемое для Вас решение, разжёвывать и класть в рот при такой "благодарности". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются. вы предлагаете хранить 10 строк и постоянно их парсить. я же один раз распарсил - положил все в структуру - и работаю с ней. структура прекрасно работает. единственно где я падаю - на сложных логических группировках. которые как я понимаю можно хранить в структуре - я просто не могу придумать конструкцию структуры. Ей бо глухой... Для компилятора пишутся исходники. Он их превращает в машинные коды...И это можно сделать на внешнем компьютере. Например Java превращает в байт-код, т.е. полупереваренные коды... И для их размещения нужна область памяти. Интерпретатор работает непосредственно с исходными кодами. Он их слово за словом и выполняет. И ему нужны только временные переменные в памяти данных. Если входные сигналы медленные, то какая разница, сколько парсить? Да и программа выполняется "строка за строкой"... И не нужны никакие сложные структуры... Я вот работал с самодельным логическим контроллером в ПЛИС. Там было 2 микроконтроллера. на них - 50 реле, пяток цапов и ацп... Один микроконтроллер вел "арифметику", другой - битовый вел логику. Общались они через общую память битовых данных. Я делал компилятор в машинный код. Вы же почему-то сваливаете в одну кучу компиляцию исходников и исполняемую программу. На самом деле Вам надо сделать 2 программы. Одну - для превращения сложной командной строки исходника в более простой набор команд. Что-то вроде "RISC", когда каждая простейшая команда выполняет только одно действие. Либо устанавливает переменную или таймер, либо логически обрабатывает переменную. Ну и вторая часть - будет в контроллере, она и будет выполнять эти простейшие действия. И парсер там будет примитивный... Вы посмотрите мои статьи о битовом контроллере... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 (изменено) · Жалоба Автор! Попробуйте прислушаться к советам и не хамить. Я совершенно не понимаю, откуда возьмётся желание искать приемлемое для Вас решение, разжёвывать и класть в рот при такой "благодарности". я ни в коем случае не хочу никого оскорбить и приношу свои категорические извинения. просто я за конструктивные решения. если бы вы слышали какие я советы даю когда мы с ребятами выходим покурить - подумали бы не иначе докторскую недавно защитил. Ей бо глухой... Вы же почему-то сваливаете в одну кучу компиляцию исходников и исполняемую программу. На самом деле Вам надо сделать 2 программы. Одну - для превращения сложной командной строки исходника в более простой набор команд. Что-то вроде "RISC", когда каждая простейшая команда выполняет только одно действие. Либо устанавливает переменную или таймер, либо логически обрабатывает переменную. Ну и вторая часть - будет в контроллере, она и будет выполнять эти простейшие действия. И парсер там будет примитивный... Вы посмотрите мои статьи о битовом контроллере... а почему так нельзя? for (int i = 0; i < sizeof(dailyTask[task_num].taskParams); i++) { if (dailyTask[task_num].taskParams[i].enable) { dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].result = TASKER_EvaluateParamCondition(dailyTask[task_num].taskParams[i].variable, dailyTask[task_num].taskParams[i].limit, dailyTask[task_num].taskParams[i].compare); dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].logic = dailyTask[task_num].taskParams[i].logicGate; dailyTask[task_num].condIdx++; } } uint32_t TASKER_EvaluateParamCondition(float *val, float val_lim, uint32_t compare) { switch (compare) { case 0: return (*val == val_lim); break; case 1: return (*val > val_lim); break; case 2: return (*val < val_lim); break; case 3: return (*val >= val_lim); break; case 4: return (*val <= val_lim); break; case 5: return (*val != val_lim); break; default : return 2; } } что я могу сказать. работает. быстро. четко. конечно интенсивный дебагинг я еще не делал но... элементарная структура. 10 строк кода. Изменено 27 января, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба Warning: :bb-offtopic: подумали бы не иначе докторскую недавно защитил. мы слышим какие вопросы вы задаете и как реагируете на предложенные решения тут. Так что про докторскую(или хотя-бы про минимально научный склад ума) мысль даже не закрадывается(по крайней мере у меня)... Видео с курилки в студию, разберем, оценим на досуге ))))))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться