Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2019, 18:34

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

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

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

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

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

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


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

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3287
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 часов


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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