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

Движок для исполнения пользовательского скрипта.

1 hour ago, jenya7 said:

не вижу чтоб на стак легли 5 и 3 и операции между ними,

Их компилятор убрал, и вместо них сразу положил результат Const 2

1 hour ago, jenya7 said:

но я так понимаю что  JumpF +2 (=> 0005) делает 5-3?

Нет. Это отработка условия в if - в данном случае пустая операция. Оптимизацию по выбрасыванию таких условий я не делал

1 hour ago, jenya7 said:

user_vars это массив переменных int user_vars[8]

Ясно. То есть просто 8 произвольных переменных под хранение чего нибудь.

Последий вопрос остался - есть ли наиболее используемые переменные (или все используются одинаково часто)?

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


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

1 hour ago, xvr said:

Их компилятор убрал, и вместо них сразу положил результат Const 2

Нет. Это отработка условия в if - в данном случае пустая операция. Оптимизацию по выбрасыванию таких условий я не делал

Ясно. То есть просто 8 произвольных переменных под хранение чего нибудь.

Последий вопрос остался - И есть ли наиболее используемые переменные (или все используются одинаково часто)?

наиболее используемые есть (COM, POS, DIR, PWM, VAR0-VAR3, FLSW, RLSW).

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


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

6 minutes ago, jenya7 said:

наиболее используемые есть (COM, POS, DIR, PWM, VAR0-VAR3, FLSW, RLSW).

POS, DIR, PWM, FLSW и RLSW для всех каналов или для некоторых?

 

И сколько полей в структуре с моторами? По сорцу я насчитал 7, а выше вы говорили 6.

 

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


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

1 hour ago, xvr said:

POS, DIR, PWM, FLSW и RLSW для всех каналов или для некоторых?

 

И сколько полей в структуре с моторами? По сорцу я насчитал 7, а выше вы говорили 6.

 

я не все использую в скрипте.  POS, DIR, PWM, FLSW, RLSW, CUR  это для всех моторов.

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


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

Т.е. наиболее часто используются 5*8 (для моторов) + 4 (пользовательских переменных) + 1 (COM). Всего получается 45 штук. Это больше чем 31, для которых кодировка Var* занимает 1 байт.

Предлагаю ограничится первыми пятью каналами моторов. Тогда всего получится 30 переменных.

Обращение к остальным каналам и остальным переменным будет занимать 2 байта в байткоде. Устроит?

 

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


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

1 hour ago, xvr said:

Т.е. наиболее часто используются 5*8 (для моторов) + 4 (пользовательских переменных) + 1 (COM). Всего получается 45 штук. Это больше чем 31, для которых кодировка Var* занимает 1 байт.

Предлагаю ограничится первыми пятью каналами моторов. Тогда всего получится 30 переменных.

Обращение к остальным каналам и остальным переменным будет занимать 2 байта в байткоде. Устроит?

 

да. а что мы экономим? можно сразу сделать 2 байта.

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


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

7 minutes ago, jenya7 said:

можно сразу сделать 2 байта.

Ок, не будем экономить.

 

Тогда можно первые 8 индексов отдать под скалярные переменные (COM как минимум, а возможно и ещё что то появится), далее 8 под пользовательские переменные (VAR0/1/2/3...), а затем по 8 штук под каждый элемент массива motor_rt_params.

 

Завтра накидаю реализацию

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


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

Итак обновление.

Индексы переменных сделал немного по другому:

  • 0 - n - Все скалярные переменные (одиночные). Пока таких только одна - com
  • n - n+8 - VAR переменные
  • n+8 - ...  - Управление моторами (последовательно все поля структуры, затем сами структуры)

В грамматику добавил возможность написать просто присваивания переменных (без if / then)

В оптимизатор обработку if <const> then ...

 

Сорцы, бинарник и пример прикрепляю.

 

Бинарник - script.exe

 

Пример:

  • code.txt - Исходник
  • code.lst - Листинг от компиляции
  • code.bin - Бинарный байткод

 

Интерпретатор (для МК) - interpreter.c (так же нужны файлы из сорцов компилятора - var_defs.inc и var_ids.h)

 

Чуть не забыл: в интерпретаторе (в строке 17) замените MotorRTParamsStructType на реальный тип структуры, описывающей состояние мотора

 

Всё остальное - сорцы

 

code.txt:

if com == 0 && pwm0 > pwm1 then pwm0 += 1; pwm1 = (com-(3-4))
com = 2
if 1 then pwm7 = 256
if 0 then pwm3 = 10

code.lst:

# if com == 0 && pwm0 > pwm1 then pwm0 += 1; pwm1 = (com-(3-4))
0000: 80              ReadVar #0 (com)
0001: 00              Const 0
0002: E4              EQ
0003: 81              ReadVar #11 (pwm0)
0004: 90              ReadVar #18 (pwm1)
0005: E6              GT
0006: E8              And
0007: E2 06           JumpF +6 (=> 000F)
0009: 01              Const 1
000A: C1              AddVar #11 (pwm0)
000B: 80              ReadVar #0 (com)
000C: 7F              Const -1
000D: EB              Sub
000E: B0              SetVar #18 (pwm1)

# com = 2
000F: 02              Const 2
0010: A0              SetVar #0 (com)

# if 1 then pwm7 = 256
0011: E0 00 01        Const 256
0014: BF 1D           SetVar #60 (pwm7)

# if 0 then pwm3 = 10

0016: FF              Stop

 

script.zip

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


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

On 5/30/2019 at 4:54 PM, xvr said:

Итак обновление.

 

спасибо. а сам механизм? я текстовый файл пропускаю через script? а получившийся code.lst я куда заливаю?

а. то есть из code.lst я должен получить code.bin. это script.exe выдаст? а как бинарник залить в контролер?

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

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


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

5 hours ago, jenya7 said:

я текстовый файл пропускаю через script?

Да.

5 hours ago, jenya7 said:

а получившийся code.lst я куда заливаю?

Никуда - это вам для справки (чисто посмотреть, что получилось). script.exe выдаст code.bin (это собственно бинарник), и опционально code.lst. Запуск: script.exe code.txt code.bin [code.lst] (квадратные скобки обозначают опциональный параметр). Файлы с текстом скрипта и с кодом могут называться как угодно.

5 hours ago, jenya7 said:

а как бинарник залить в контролер?

Это уже вам решать - бинарник представляет собой образ, который должен быть помещён туда, откуда его будет читать функция get_byte() внутри интерпретатора в МК.

Например можно залить в МК через какой нибудь стандартный канал, например через терминал (через z-modem например), или через какой нибудь tftp сервер (если в МК есть Ethernet). У вас есть какая нибудь связь между МК и РС?

 

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


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

1 hour ago, xvr said:

Это уже вам решать - бинарник представляет собой образ, который должен быть помещён туда, откуда его будет читать функция get_byte() внутри интерпретатора в МК.

Например можно залить в МК через какой нибудь стандартный канал, например через терминал (через z-modem например), или через какой нибудь tftp сервер (если в МК есть Ethernet). У вас есть какая нибудь связь между МК и РС?

 

У меня связь UART. Я могу загрузить бинарник в байтовый массив.

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


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

2 minutes ago, jenya7 said:

Я могу загрузить бинарник в байтовый массив.

Вполне подойдёт. (Только во FLASH из массива не забудьте скопировать, если вам нужно, что бы загруженный скрипт пережил выключение питания)

2 minutes ago, jenya7 said:

У меня связь UART.

У вас терминал, или свой протокол (и управляющая программа на РС)?

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


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

1 hour ago, xvr said:

Вполне подойдёт. (Только во FLASH из массива не забудьте скопировать, если вам нужно, что бы загруженный скрипт пережил выключение питания)

У вас терминал, или свой протокол (и управляющая программа на РС)?

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

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


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

5 minutes ago, jenya7 said:

передевать я могу в принципе через любой терминал.

Передавать через терминал бинарник (как текст) не хорошо - терминал (да и ваш парсер) может плохо отреагировать на коды, меньшие 32 (код пробела). Лучше преобразовать в текст (например в Intel Hex, или просто в многострочный hex). Это можно будет прямо через copy-paste в терминал отправить

Могу сделать текстовый формат (для отправки в тестовом виде в терминал)

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


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

1 hour ago, xvr said:

Передавать через терминал бинарник (как текст) не хорошо - терминал (да и ваш парсер) может плохо отреагировать на коды, меньшие 32 (код пробела). Лучше преобразовать в текст (например в Intel Hex, или просто в многострочный hex). Это можно будет прямо через copy-paste в терминал отправить

Могу сделать текстовый формат (для отправки в тестовом виде в терминал)

В С-шарп это просто

byte[] raw_data = File.ReadAllBytes(burn_file_path);

comport.Write(raw_data, 0, raw_data.Length);

и байты приходят в нужном формате.

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

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


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

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

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

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

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

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

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

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

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

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