Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скрипты в микроконтроллере
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
uriy
Имеется плата с STM32.
На плате есть несколько дискретных и аналоговых входов.
Есть дискретные выходы и выходы с ШИМ. И есть CAN.
Нужна возможность управления всем этим с помощью скриптов в контроллере.
Как принято делать такие вещи? Держать в контроллере какой-то интерпретатор или заливать туда предварительно скомпиленный код?
Из необходимых функций это логические операции с дискретными входами и арифметические с аналоговыми.
Временные задержки. Прием и выдача данных через CAN.

Огурцов
попробуйте дотнет микрофреймворк
там уже и дисплеи наверно прикрутили
x893
.NET microframework
MicroPython
Espruino (javascript)
picoC
_pv
до кучи еще pawn и lua (жирновата правда немного для STM32, особенно если это какой-нибудь F0/F1 )

а еще сюда сейчас любители FORTа набегут sm.gif
uriy
ок спасибо за ссылки буду изучать. Контроллер STM32F103VBT6 128 кбайт флеша.
arhiv6
А ещё есть интерпретатор Си (picoC) - пример.
Если скрипты совсем простые (проигрывание последовательности команд, например), можно виртуальную машину использовать - пример.
Kopa
Цитата(_pv @ Jan 13 2016, 19:52) *
а еще сюда сейчас любители FORTа набегут sm.gif

+1
smalcom
Цитата
Нужна возможность управления всем этим с помощью скриптов в контроллере.

а точно скрипты нужны? может у вас простая выполнялка команд?
AlexandrY
Цитата(Огурцов @ Jan 13 2016, 17:14) *
попробуйте дотнет микрофреймворк
там уже и дисплеи наверно прикрутили


Да .Net MF сильная штука. Единственная из всего названного которую можно по честному отлаживать на целевой платформе .
Вот тут мы ее билдили - http://geektimes.ru/post/266612/

Но процесс очень запутанный. Скрипты сборки это нечто.
Сборка длительная.
128 Кб там впритык. Но правда туда уже входит TCP стек и прочие удовольствия.
Меандр на плате Discovery генерирует 40 КГц
Программы пишутся и отлаживаются на C# в бесплатном Visual Studio 2015

Короче, нужны ресурсы чуток побольше и .Net MF нет альтернатив.

Kopa
Цитата(AlexandrY @ Jan 14 2016, 01:29) *
Короче, нужны ресурсы чуток побольше и .Net MF нет альтернатив.

Цитаты по ссылке приведённой статьи.
Код
Бинарник CLR от GCC — 316 кб. От RealView — 297 кб. 64 Kb of RAM

Код
Я думаю стоит ориентироваться на то, что .Net Micro Framework работает на 2-3 порядка медленнее, в зависимости от оптимизации. Но он и не ориентирован на вычисления.


P.S. А я то думал Форт прожорлив с его типичными 8-16-32Кб вариантами FVM, хотя и не предел sm.gif
Огурцов
Цитата(AlexandrY @ Jan 13 2016, 23:29) *
чуток побольше

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

Цитата(Kopa @ Jan 13 2016, 23:58) *
Цитаты

компилиться должно в нативный код, так что будеть работать чуть медленнее gcc, пусть даже раза в два
ну пусть даже в десять раз, где-то на вызовах фреймворка, но сам фреймворк как либа , т.е. основное время, оптимален
минус в том, что он таки микрофреймворк, т.е. не хватает тех двадцати мегабайт, чтобы десктопные программы шли без какого-либо перепиливания
но это как раз не за горами
Kabdim
Имхо луа. Как с точки зрения потребления ресурсов, так и с точки зрения обучения неподготовленных людей.
Kopa
Цитата(Огурцов @ Jan 14 2016, 02:47) *
ну пусть даже в десять раз, где-то на вызовах фреймворка, но сам фреймворк как либа , т.е. основное время, оптимален

Вам не хватает библиотек уже существующих в С, С++ ?
Не думаю, что задачи использования С# ограничятся конфигурированием периферийных модулей и несложного использования библиотечных модулей.

Цитата(Огурцов @ Jan 14 2016, 02:47) *
минус в том, что он таки микрофреймворк, т.е. не хватает тех двадцати мегабайт, чтобы десктопные программы шли без какого-либо перепиливания
но это как раз не за горами

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

P.S. Ещё ждём когда контроллеры широко будут программироваться на Java? smile3046.gif
Может, действительно, ТС попробовать Lua для скриптования как выше советовали?
x893
Да не проблема выкинуть лишнее из всех скриптовых интерпритаторов. Коды все есть.
И добавить нужных можно - что бы были прямо в нативном коде.
А скрипт использовать только для задания алгоритма.
Хотя все это баловство со скриптами.
Так - побаловаться и бросить.
Огурцов
совсем не
прошивку можно зишифровать, а скрипты отдать на откуп юзеру
представляете, если скрипт будет не в кракозябрах, а на нормальном широко распространенном языке с мощной отладкой на пк ?
еще вариант - рисование графических диаграмм алгоритмов или рабочих процессов на пк, а затем их выполнение на мк
тоже ресурсов надо крохи
Dog Pawlowa
Цитата(Огурцов @ Jan 14 2016, 13:50) *
прошивку можно зишифровать, а скрипты отдать на откуп юзеру

Если юзер будет знать, что делают заскриптованные операции, то реверс будет очень прост.
А юзер должен знать это, чтобы пользоваться "откупом".
Огурцов
реверс чего ? скрипты и так у юзера, открытые, это как вершина айсберга
Dog Pawlowa
Цитата(Огурцов @ Jan 14 2016, 21:14) *
реверс чего ?

Реверс прошивки, выполняющей скрипты.
Ну если Вы отдаете открытые скрипты юзеру, то он должен знать, как работают операторы скрипта.
То есть прошивку он повторит исходя из этого знания.
Огурцов
ну давайте я вам дам какую-то мою программу на c#, сделайте мне по ней реверс дотнетфреймворка ?
да еще так, чтобы другая еще неведомая программа на шарпе тоже работала под вашим реверсом
Dog Pawlowa
Цитата(Огурцов @ Jan 14 2016, 13:50) *
выполнение на мк тоже ресурсов надо крохи

Цитата(Огурцов @ Jan 14 2016, 22:02) *
сделайте мне по ней реверс дотнетфреймворка ?

Вы уж определитесь про что Вы говорите.
Огурцов
я не терял нить рассуждения, в отличие от - про скрипты
скрипты, шарп и воркфлоу по выполнению, как и размеру, суть одного и тогоже порядка
а вот софт, под которым они выполняются на порядки монструознее
uriy
Решил использовать pawn.
Может быть у кого-нибудь уже есть реализация для keil.
У меня осталась одна ошибка при компиляции и я застрял на:
Error: L6218E: Undefined symbol amx_Register (referred from amxfuncs.o).
amx_Register определен в amx.c в хидере есть прототип, но до него столько ifdef что я теряюсь
shreck
Цитата(uriy @ Feb 1 2016, 00:07) *
Решил использовать pawn.
Может быть у кого-нибудь уже есть реализация для keil.
У меня осталась одна ошибка при компиляции и я застрял на:
Error: L6218E: Undefined symbol amx_Register (referred from amxfuncs.o).
amx_Register определен в amx.c в хидере есть прототип, но до него столько ifdef что я теряюсь

У меня работает этот набор файлов. Пробуйте.
uriy
Спасибо! А можно еще ваш файл amxexec_thumb2.s?
Теперь другая функция дважды определена Error: L6200E: Symbol amx_exec_list multiply defined (by amxexec_thumb2.o and amx.o).

Можете мне еще пояснить можно ли каким то образом распаралелить выполнение скрипта и основной программы MCU?
Я планировал собирать данные с АЦП по DMA и усреднять их, только потом использовать эти значения в скрипте.
shreck
Цитата(uriy @ Feb 1 2016, 20:43) *
Спасибо! А можно еще ваш файл amxexec_thumb2.s?
Теперь другая функция дважды определена Error: L6200E: Symbol amx_exec_list multiply defined (by amxexec_thumb2.o and amx.o).

Файл amx.c сдержит реализацию виртуальной машины на переносимом С.
amxexec_thumb2.s содержит оптимизированную реализацию виртуальной машины на асме.
Их не получится скомпилировать вместе в одном проекте. Выбирайте что-то одно.

Цитата
Можете мне еще пояснить можно ли каким то образом распаралелить выполнение скрипта и основной программы MCU?
Я планировал собирать данные с АЦП по DMA и усреднять их, только потом использовать эти значения в скрипте.

Распараллелить? Я использую ось. Соответственно есть набор потоков, в одном из которых крутится виртуальная машина.
Если без оси, то прерывания + debug hook для виртуальной машины. Как то так, наверное.


P.S. Не пренебрегайте документацией. Pawn_Implementer_Guide.pdf + Pawn_Language_Guide.pdf способны ответить на все ваши вопросы.
uriy
Я начал вот с этой статьи http://we.easyelectronics.ru/STM32/prikruc...ok-k-stm32.html
Там часть функций на асме часть на си.
Я уже на горячую голову переделал amxexec_thumb2.s чтобы компилился под keil.
Мне даже в голову вот это не пришло: "Файл amx.c сдержит реализацию виртуальной машины на переносимом С.
amxexec_thumb2.s содержит оптимизированную реализацию виртуальной машины на асме.
"
Осями пользуюсь, но забыл уточнить что в этом проекте ось не планируется.
Тут будет на автоматах.

Цитата
P.S. Не пренебрегайте документацией. Pawn_Implementer_Guide.pdf + Pawn_Language_Guide.pdf способны ответить на все ваши вопросы.
Да читать надо, но как всегда некогда пилу точить надо лес валить.
shreck
Цитата(uriy @ Feb 2 2016, 11:29) *
Да читать надо, но как всегда некогда пилу точить надо лес валить.

"Лучше день потерять, а потом за пять минуть долететь" sm.gif
uriy
Прочитал implementers guide и language guide так и не понял как обращаться к железу из скрипта.
Похоже придется еще раз читать...
Мне нужно принимать и отправлять данные через CAN, анализировать цифровые и аналоговые входы, управлять ШИМ.
На прием данных идеально ложаться ивенты.
Но как сделать чтобы основная программа в контроллере вызывала эти ивенты в скрипте?
И как обратиться из скрипта к функциям в основной программе, чтобы например запустить ШИМ?
Public functions это какраз те функции что доступны скрипту и основной программе или нет?
shreck
Цитата(uriy @ Feb 15 2016, 15:09) *
Прочитал implementers guide и language guide так и не понял как обращаться к железу из скрипта.
Похоже придется еще раз читать...
Мне нужно принимать и отправлять данные через CAN, анализировать цифровые и аналоговые входы, управлять ШИМ.
На прием данных идеально ложаться ивенты.
Но как сделать чтобы основная программа в контроллере вызывала эти ивенты в скрипте?
И как обратиться из скрипта к функциям в основной программе, чтобы например запустить ШИМ?
Public functions это какраз те функции что доступны скрипту и основной программе или нет?

Implementers guide, Extension modules, p.49:
Цитата
An extension module provides a pawn program with application-specific (“na-
tive”) functions. An native function is a function that is implemented in the host
application (as opposed to being implemented in the pawn script) and it is typi-
cally implemented in a different programming language. Creating an extension
module is a three-step process:
1 writing the native functions (in C);
2 making the functions known to the abstract machine;
3 writing an include file that declares the native functions for the pawn pro-
grams.

Ну и дальше углубляетесь.

По event driven технике ничего подсказать не могу, т.к. не пользую.
Jenya7
Цитата(shreck @ Feb 2 2016, 09:19) *
Файл amx.c сдержит реализацию виртуальной машины на переносимом С.
amxexec_thumb2.s содержит оптимизированную реализацию виртуальной машины на асме.
Их не получится скомпилировать вместе в одном проекте. Выбирайте что-то одно.

странно. а у меня скомпилировалось.
uriy
Наконец-то добрались руки до реализации.
Накидал такой скрипт
Код
#pragma dynamic 100

native GreenLed(NewValue)
native SetPWM(NewPWM);
native BlueLed(NewValue);
native IsKeyPressed();

main()
{
   GreenLed(0);
   BlueLed(1);

   for(;;)
   {
           if(IsKeyPressed())
        {
            GreenLed(1);
             BlueLed(1);
        }
        else
        {
            GreenLed(0);
               BlueLed(0);
        }
   }
}

Функции GreenLed(NewValue) и BlueLed(NewValue) отлично работают.
Не могу понять как передать данные в скрипт из железки.
Как например считать нажатие кнопки IsKeyPressed?

В железке функция выглядит так
Код
cell IsKeyPressed(AMX *amx, const cell *params)
{
    cell ret = 0;
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) != GPIO_PIN_RESET)
        ret = 1;
    return ret;
}

Скрипт вызывает эту функцию и ret корректно изменяется.
shreck
Цитата(uriy @ Apr 3 2016, 21:13) *
...
Функции GreenLed(NewValue) и BlueLed(NewValue) отлично работают.
Не могу понять как передать данные в скрипт из железки.
Как например считать нажатие кнопки IsKeyPressed?

В железке функция выглядит так
Код
cell IsKeyPressed(AMX *amx, const cell *params)
{
    cell ret = 0;
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) != GPIO_PIN_RESET)
        ret = 1;
    return ret;
}

Скрипт вызывает эту функцию и ret корректно изменяется.


Да вроде все правильно сделали. Если native функция должна вернуть единственное значение, которое умещается в размер cell, то просто возвращаете его: return 'значение'.
Если надо вернуть много значений, то возвращаете их через ссылочные параметры функции. Например, вот функция, возвращающая массив значений:
Код
native get_tempcoef(Float:coef[6]);

и ее C-реализация:
Код
cell AMX_NATIVE_CALL n_gettempcoef(AMX * amx, const cell* params)
{
    static const float foo[6] = { bla-bla };
    // Получаем адрес массива coef:
    cell* dst = amx_Address(amx, params[1]);
    // и заполняем его значениями.
    for (uint32_t i = 0; i < 6; ++i)
    {
        float t = foo[i];
        dst[i] = amx_ftoc(t);
    }
    return 0;
}

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.