Перейти к содержанию
    

в микроконтролере!

вы шутите так?

 

вы просите научить вас пунктуации, хотя коверкаете слова. вам естественно предлагают сначала освоить орфографию. вы сопротивляетесь.

судя по темам вам в впринципе не интересно учиться, вы просто идёте на результат.

 

в таком случае воспользуйтесь поиском по форуму - подобный вопрос поднимался неоднократно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну распарсили мы строку! все прекрасно! куда сохранять результаты парсинга? конкретно в железе! в микроконтролере!

Так не надо выделять место в памяти для хранения всех лексем поотдельности - они уже есть в исходной строке, парсер динамически её обрабатывает. Грубо говоря, нужно выделить место для хранения одной лексемы:

char *expr; //Указатель на обрабатываемую строку
char token[80]; //Лексема

Там в статье всё расписано + приведён полностью рабочий код. Вам достаточно в нем заменить пару функций на свои.

 

Кстати, там же указана ссылка на пероисточник - Герберт Шилдт, Полный справочник по C (Глава 24. Синтаксичекий разбор и вычисление выражений).

Изменено пользователем arhiv6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини Programmable Logic Controller.

...

и я это сохраняю и потом проверяю и если условие выполняется - включаю\выключаю нужные выходы. вопрос есть ли какие то готовые библиотеки а-ля-PLC?

 

Ваша задача не имеет никакого отношения к PLC, это полная чушь.

 

То, что вы тут накалякали, в принципе может быть реализовано путем создания некого скриптового языка. Тем не менее для грамотного решения , вам придется озаботиться и БНФ, и парсингом, и интерпретатором. Однако поскольку вы демонстрируете чрезвычайно низкий уровень знаний и очень много гонора, то шансы на то, что вы сподобитесь решить эту задачу "в общем виде", исчезающе малы.

 

Один из грамотных вариантов решения, который вам может оказаться посильным, таков: освойте язык Форт, поставьте Форт-систему на вашу целевую платформу и задайте для пользователя словарь только с определенными вами Форт словами, а все остальные Форт слова сделайте недоступными для пользователя. При этом парсингом займется Форт система, правда, синтаксис псевдо-языка будет с обратной польской записью. При желании и это можно изменить, да только вряд ли нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

распарсить команды у меня нет проблем. вопрос где хранить входные условия и как их сравнивать.

вопрос как организовать хранение и сравнение логики входных условий.

Можно сделать не компилятор, и интерпретатор. Тогда ничего "хранить" не надо выполнение делается при обработке строк... Правда это "медленнее", чем если сначала откомпилировать, а потом исполнять "переваренный" код... Но зато проще сделать программу обработки.

Вообще если сделать два вида исходных строк, то дело будет значительно проще реализовать.

1. "Арифметические строки" - введите "внутренние переменные", где "входы" или "внутренние переменные" проверяются на "больше-меньше" или "+/-" и результат этих действий превращается в битовые переменные

2. "Логические строки" в которых обрабатываются "битовые переменные"

 

Ну и Форт-система это тоже вариант....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваша задача не имеет никакого отношения к PLC, это полная чушь.

 

То, что вы тут накалякали, в принципе может быть реализовано путем создания некого скриптового языка. Тем не менее для грамотного решения , вам придется озаботиться и БНФ, и парсингом, и интерпретатором. Однако поскольку вы демонстрируете чрезвычайно низкий уровень знаний и очень много гонора, то шансы на то, что вы сподобитесь решить эту задачу "в общем виде", исчезающе малы.

 

Один из грамотных вариантов решения, который вам может оказаться посильным, таков: освойте язык Форт, поставьте Форт-систему на вашу целевую платформу и задайте для пользователя словарь только с определенными вами Форт словами, а все остальные Форт слова сделайте недоступными для пользователя. При этом парсингом займется Форт система, правда, синтаксис псевдо-языка будет с обратной польской записью. При желании и это можно изменить, да только вряд ли нужно.

от вашей демонстрации грандиозных знаний с тоже нех..илым апломбом толку мало.

таких советов я могу каждый день выдавать пачками.

 

 

Так не надо выделять место в памяти для хранения всех лексем поотдельности - они уже есть в исходной строке, парсер динамически её обрабатывает. Грубо говоря, нужно выделить место для хранения одной лексемы:

char *expr; //Указатель на обрабатываемую строку
char token[80]; //Лексема

Там в статье всё расписано + приведён полностью рабочий код. Вам достаточно в нем заменить пару функций на свои.

это очень смелое заявление. таких заявлений я могу каждый день выдавать пачками.

 

Можно сделать не компилятор, и интерпретатор. Тогда ничего "хранить" не надо выполнение делается при обработке строк... Правда это "медленнее", чем если сначала откомпилировать, а потом исполнять "переваренный" код... Но зато проще сделать программу обработки.

Вообще если сделать два вида исходных строк, то дело будет значительно проще реализовать.

1. "Арифметические строки" - введите "внутренние переменные", где "входы" или "внутренние переменные" проверяются на "больше-меньше" или "+/-" и результат этих действий превращается в битовые переменные

2. "Логические строки" в которых обрабатываются "битовые переменные"

 

Ну и Форт-система это тоже вариант....

извините но - тоже пачками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ТС изобрел велосипед с квадратными колесами и на любые попытки форумчан посоветовать более адекватное средство передвижения посылает всех в лес, со словами - 'мне ехать надо, а не ваши глупые советы слушать'.

 

Ждем, когда ТС 'изобретет' стек, а там уже и до Форта недалеко :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ТС изобрел велосипед с квадратными колесами и на любые попытки форумчан посоветовать более адекватное средство передвижения посылает всех в лес, со словами - 'мне ехать надо, а не ваши глупые советы слушать'.

 

Ждем, когда ТС 'изобретет' стек, а там уже и до Форта недалеко :)

Вот только "изобретет" у ТС не получится. Ибо самые большие и самые дорогие ошибки делаются в начале проекта. А у него это как раз и произошло. И объяснить, что подобные задачи многими решены - для него невозможно. Я например делал такой контроллер в ПЛИС из двух микроконтроллеров в связке... Но ведь ТС и понимать ничего не хочет...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот только "изобретет" у ТС не получится. Ибо самые большие и самые дорогие ошибки делаются в начале проекта. А у него это как раз и произошло. И объяснить, что подобные задачи многими решены - для него невозможно. Я например делал такой контроллер в ПЛИС из двух микроконтроллеров в связке... Но ведь ТС и понимать ничего не хочет...

я прекрасно понимаю что эта задача многими решена. поэтому и обратился на форум. только решения не вижу. одна претенциозная болтовня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я прекрасно понимаю что эта задача многими решена. поэтому и обратился на форум. только решения не вижу. одна претенциозная болтовня.

Вот тяжело с глухим говорить...

Прежде чем спрашивать "где хранить что-то" ответьте на первый вопрос.

Что хотите сделать: компилятор или интерпретатор?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот тяжело с глухим говорить...

Прежде чем спрашивать "где хранить что-то" ответьте на первый вопрос.

Что хотите сделать: компилятор или интерпретатор?

я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются. вы предлагаете хранить 10 строк и постоянно их парсить. я же один раз распарсил - положил все в структуру - и работаю с ней. структура прекрасно работает. единственно где я падаю - на сложных логических группировках. которые как я понимаю можно хранить в структуре - я просто не могу придумать конструкцию структуры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

'Сложные логические группировки' в простой структуре сохранить невозможно. Можете дальше ничего не придумывать.

 

Вам уже говорили, как такие задачи решаются, но видимо для вас это 'одна претенциозная болтовня'.

 

Попробую еще раз - вам нужна стековая виртуальная машина, которая будет исполнять байт код (который в свою очередь получен из исходных скриптов).

 

Например, ваш исходный скрипт -

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

Каждая строка здась закодированна каким то числом (опкод) + дополнительная информация (имя или адрес переменной, адрес для перехода и пр.)

 

Альтернативной стековой машиной, уже упоминавшейся тут, будет Форт

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

от вашей демонстрации грандиозных знаний с тоже нех..илым апломбом толку мало.

таких советов я могу каждый день выдавать пачками.

 

это очень смелое заявление. таких заявлений я могу каждый день выдавать пачками.

 

извините но - тоже пачками.

Автор! Попробуйте прислушаться к советам и не хамить. Я совершенно не понимаю, откуда возьмётся желание искать приемлемое для Вас решение, разжёвывать и класть в рот при такой "благодарности".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются. вы предлагаете хранить 10 строк и постоянно их парсить. я же один раз распарсил - положил все в структуру - и работаю с ней. структура прекрасно работает. единственно где я падаю - на сложных логических группировках. которые как я понимаю можно хранить в структуре - я просто не могу придумать конструкцию структуры.

Ей бо глухой...

Для компилятора пишутся исходники. Он их превращает в машинные коды...И это можно сделать на внешнем компьютере. Например Java превращает в байт-код, т.е. полупереваренные коды... И для их размещения нужна область памяти.

Интерпретатор работает непосредственно с исходными кодами. Он их слово за словом и выполняет. И ему нужны только временные переменные в памяти данных.

Если входные сигналы медленные, то какая разница, сколько парсить? Да и программа выполняется "строка за строкой"... И не нужны никакие сложные структуры...

Я вот работал с самодельным логическим контроллером в ПЛИС. Там было 2 микроконтроллера. на них - 50 реле, пяток цапов и ацп... Один микроконтроллер вел "арифметику", другой - битовый вел логику. Общались они через общую память битовых данных. Я делал компилятор в машинный код.

Вы же почему-то сваливаете в одну кучу компиляцию исходников и исполняемую программу. На самом деле Вам надо сделать 2 программы. Одну - для превращения сложной командной строки исходника в более простой набор команд. Что-то вроде "RISC", когда каждая простейшая команда выполняет только одно действие. Либо устанавливает переменную или таймер, либо логически обрабатывает переменную. Ну и вторая часть - будет в контроллере, она и будет выполнять эти простейшие действия. И парсер там будет примитивный...

Вы посмотрите мои статьи о битовом контроллере...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Автор! Попробуйте прислушаться к советам и не хамить. Я совершенно не понимаю, откуда возьмётся желание искать приемлемое для Вас решение, разжёвывать и класть в рот при такой "благодарности".

я ни в коем случае не хочу никого оскорбить и приношу свои категорические извинения.

просто я за конструктивные решения. если бы вы слышали какие я советы даю когда мы с ребятами выходим покурить - подумали бы не иначе докторскую недавно защитил.

 

 

Ей бо глухой...

Вы же почему-то сваливаете в одну кучу компиляцию исходников и исполняемую программу. На самом деле Вам надо сделать 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 строк кода.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Warning: :bb-offtopic:

подумали бы не иначе докторскую недавно защитил.
мы слышим какие вопросы вы задаете и как реагируете на предложенные решения тут. Так что про докторскую(или хотя-бы про минимально научный склад ума) мысль даже не закрадывается(по крайней мере у меня)...

Видео с курилки в студию, разберем, оценим на досуге )))))))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...