Easyelectronics.ru

Электроника для всех
Текущее время: 11 июл 2020, 04:26

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 16 авг 2019, 16:45 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2570
Как работает машинка...
Есть таблица с адресами функций типа
Код:
using tpFuncToCall = void(*)(void*, VM*);


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

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


Оптокод - банальный enum

Код:
enum optoCode {
    NOP=0,
    PUSH,
    POP,
    SUM,
    DONE,
    MINUS,
    DIVISION,
    JUMP,
    INIT_VAR,
    LOAD_SYS_VAR,
    STORE_SYS_VAR,
    COMPARE,
    JUMP_IF_EQUALLY,
    JUMP_IF_MORE,
    JUMP_IF_LESS,
    MULTIPLY,
    CALL,
    RET
};


индекс оптокода есть адрес обрабатывающей его функции в таблице функций

Код:


tFuncDef const VM::LSL_funcList[]={{LSL::nop},
                                   {LSL::push},
                                   {LSL::pop},
                                   {LSL::sum},
                                   {LSL::done},
                                   {LSL::minus},
                                   {LSL::division},
                                   {LSL::jump},
                                   {LSL::init_var},
                                   {LSL::load_sys_var},
                                   {LSL::store_sys_var},
                                   {LSL::compare},
                                   {LSL::jump_if_equally},
                                   {LSL::jump_if_more},
                                   {LSL::jump_if_less},
                                   {LSL::multiply},
                                   {LSL::call},
                                   {LSL::ret}
                                  };




сами функции оформлены как

Show статические методы класса LSL

Show Пример "программы" в оптокодах



а вот как работает машинка, после работы удаляю все созданные оптокодом переменные

Код:

    while (bytecod[virtualMachine.CP]!=DONE){
       if (bytecod[virtualMachine.CP]==NOP)
       {
           virtualMachine.CP++;
           continue;
       }

       virtualMachine.exec_optocod(static_cast<tOptpCode>(bytecod[virtualMachine.CP++]));
       }

       virtualMachine.removeAllVariables();




Эта функция вызывает обработчик оптокода
Код:
void VM::exec_optocod(tOptpCode optocod)
{

    pF=LSL_funcList[optocod].funcAddress;
    pF(&bytecod[VM::CP], this);
}



Последний раз редактировалось Pingvin 16 авг 2019, 17:22, всего редактировалось 8 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 16 авг 2019, 17:02 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2570
_pv писал(а):
Pingvin писал(а):
Я честно пытался поднять LUA или PAWN, но пока не понял, как это сделать.
И главное - мне нужно взоимодействие с моей прошивкой, с моими функциями и переменными.
Вроде и в LUA и в PAWN это можно сделать, но тоже как то не очень просто.

вот в луа это как раз делается самым простым образом, как добавление функций доступных скрипту, так и наоборот, доступ до состояния ВМ из основной программы.

Это я знаю, читал про это.
Но LUA ещё поднять надо.
У меня 103-ий камень - 64 КБт оперативы.
Если кто поможет поднять, буду благодарен.
Хотя бы поиграться с LUA, так как подозреваю, что на прошивку просто не останется оперативы.

Но это не срочно, пока мне интересней со своей машинкой играться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 16 авг 2019, 17:56 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3425
https://stackoverflow.com/questions/562 ... ted-symbol
Цитата:
PS: I am using official lua 5.3.4. It requires at least 7.5KB RAM and 65K ROM. I allocate 4KB stack and 16K heap in internal 64KB RAM of STM32F103ZET6.


это без всяких патчей от eLua, и не только виртуальная машина, а интерпретатор целиком, с парсером и "компилятором" в байт код прям на целевой платформе.
если их и отрезать (google: lua noparser.c), на треть вроде похудеть должен, а можно ещё и часть библиотек выкинуть.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу Пред.  1, 2, 3, 4


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB