|
Скрипты в микроконтроллере |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 32)
|
Jan 13 2016, 19:33
|

Знающий
   
Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423

|
А ещё есть интерпретатор Си ( picoC) - пример. Если скрипты совсем простые (проигрывание последовательности команд, например), можно виртуальную машину использовать - пример.
--------------------
|
|
|
|
|
Jan 13 2016, 22:29
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Огурцов @ Jan 13 2016, 17:14)  попробуйте дотнет микрофреймворк там уже и дисплеи наверно прикрутили Да .Net MF сильная штука. Единственная из всего названного которую можно по честному отлаживать на целевой платформе . Вот тут мы ее билдили - http://geektimes.ru/post/266612/Но процесс очень запутанный. Скрипты сборки это нечто. Сборка длительная. 128 Кб там впритык. Но правда туда уже входит TCP стек и прочие удовольствия. Меандр на плате Discovery генерирует 40 КГц Программы пишутся и отлаживаются на C# в бесплатном Visual Studio 2015 Короче, нужны ресурсы чуток побольше и .Net MF нет альтернатив.
|
|
|
|
|
Jan 13 2016, 22:58
|
Знающий
   
Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861

|
Цитата(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, хотя и не предел
Сообщение отредактировал Kopa - Jan 13 2016, 23:02
|
|
|
|
|
Jan 13 2016, 23:47
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(AlexandrY @ Jan 13 2016, 23:29)  чуток побольше года три уже назад, на четвертой дискавери работало, а теперь как минимум два новых камня вышло - должна быть просто фантастикой Цитата(Kopa @ Jan 13 2016, 23:58)  Цитаты компилиться должно в нативный код, так что будеть работать чуть медленнее gcc, пусть даже раза в два ну пусть даже в десять раз, где-то на вызовах фреймворка, но сам фреймворк как либа , т.е. основное время, оптимален минус в том, что он таки микрофреймворк, т.е. не хватает тех двадцати мегабайт, чтобы десктопные программы шли без какого-либо перепиливания но это как раз не за горами
Сообщение отредактировал Огурцов - Jan 13 2016, 23:49
|
|
|
|
|
Jan 14 2016, 01:19
|
Знающий
   
Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861

|
Цитата(Огурцов @ Jan 14 2016, 02:47)  ну пусть даже в десять раз, где-то на вызовах фреймворка, но сам фреймворк как либа , т.е. основное время, оптимален Вам не хватает библиотек уже существующих в С, С++ ? Не думаю, что задачи использования С# ограничятся конфигурированием периферийных модулей и несложного использования библиотечных модулей. Цитата(Огурцов @ Jan 14 2016, 02:47)  минус в том, что он таки микрофреймворк, т.е. не хватает тех двадцати мегабайт, чтобы десктопные программы шли без какого-либо перепиливания но это как раз не за горами На контроллер перекладывать задачи решаемые в рамках компьютера? Не проще ли тогда взять платы "компьютеров" в одноплатном формате для встраивания в оборудование? P.S. Ещё ждём когда контроллеры широко будут программироваться на Java?  Может, действительно, ТС попробовать Lua для скриптования как выше советовали?
Сообщение отредактировал Kopa - Jan 14 2016, 01:24
|
|
|
|
|
Jan 14 2016, 18:18
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Огурцов @ Jan 14 2016, 21:14)  реверс чего ? Реверс прошивки, выполняющей скрипты. Ну если Вы отдаете открытые скрипты юзеру, то он должен знать, как работают операторы скрипта. То есть прошивку он повторит исходя из этого знания.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jan 14 2016, 19:44
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Огурцов @ Jan 14 2016, 13:50)  выполнение на мк тоже ресурсов надо крохи Цитата(Огурцов @ Jan 14 2016, 22:02)  сделайте мне по ней реверс дотнетфреймворка ? Вы уж определитесь про что Вы говорите.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 1 2016, 04:33
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Цитата(uriy @ Feb 1 2016, 00:07)  Решил использовать pawn. Может быть у кого-нибудь уже есть реализация для keil. У меня осталась одна ошибка при компиляции и я застрял на: Error: L6218E: Undefined symbol amx_Register (referred from amxfuncs.o). amx_Register определен в amx.c в хидере есть прототип, но до него столько ifdef что я теряюсь У меня работает этот набор файлов. Пробуйте.
Прикрепленные файлы
pawn.zip ( 28.18 килобайт )
Кол-во скачиваний: 35
|
|
|
|
|
Feb 2 2016, 03:19
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Цитата(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 способны ответить на все ваши вопросы.
|
|
|
|
|
Feb 2 2016, 05:29
|

Гуру
     
Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606

|
Я начал вот с этой статьи 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 способны ответить на все ваши вопросы. Да читать надо, но как всегда некогда пилу точить надо лес валить.
|
|
|
|
|
Feb 15 2016, 10:13
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Цитата(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 технике ничего подсказать не могу, т.к. не пользую.
|
|
|
|
|
Apr 3 2016, 15:13
|

Гуру
     
Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606

|
Наконец-то добрались руки до реализации. Накидал такой скрипт Код #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 корректно изменяется.
|
|
|
|
|
Apr 4 2016, 09:24
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Цитата(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; }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|