|
Оверлеи - посоветуйте или раскритикуйте, аналог динамической линковки для AVR |
|
|
|
Jul 4 2018, 07:22
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Коллеги! Обращаюсь к знатокам за советом. Появилась идея сделать нечто, функционально напоминающее динамическую линковку для программ AVR. Раньше, когда DLL еще не изобрели, такое называлось "оверлейными модулями"... Известно, что основная беда всех программ для МК AVR - это высокая трудоемкость модификации прошивки. И вот предлагаемая идея призвана значительно улучшить эту ситуацию. Идея такая: 1. Основную программу собираем, как обычно. В ней есть интерфейс к SD-карте, и определена раз и навсегда область памяти, где будут оверлеи. Ну и выделен блок ОЗУ для данных оверлея. 2. Адреса начала кода оверлея и буфера данных фиксированы, и на этапе разработки оверлея известны. 3. Оверлей - это единственная функция, либо (предпочтительнее) несколько функций, адреса которых определены в структуре, которая как раз и размещается с адреса flash, выделенного для оверлея - ну типа таблицы векторов или вызовов. В общем, не суть важно, как. 4. Когда мы хотим наделить наше устройство другим функционалом, мы записываем на SD-карту скомпилированный оверлей, стартуем девайс, который обнаруживает соответствующий файл на карте, и прошивает его содержимое в заданную область, после чего обращается через таблицу вызовов к функциям оверлея.
Лично я хочу попробовать задействовать этот функционал для модификаци своего проекта "цифровой цветомузыки": сейчас в коде намертво прошито несколько эффектов, сменить которые для рядового пользователя достаточно сложно, как и избавиться от не нужных. Планирую каждый эффект сделать в виде оверлея, чтобы каждый желающий выбрал себе нужные и использовал без геморроя с перекомпиляцией прошивки.
Как оцените идею?
Это не совсем ситуация с самопрошивкой через бут-область AVR, т.к. объем прошиваемой области предполагается не с нулевого адреса, а скорее с середины flash, и при этом с перезатиранием области бута, которая в конце, как правило. Очень похоже, но чуточку отличается... в связи с чем и вопросы:
- как компилировать оверлей? То есть как получить hex-файл для набора функций? - как задать секцию (т.е. конкретный адрес начала функции) для функции я знаю, но как сделать это для целого модуля? тем более для модуля, содержащего как функции, так и данне во flash?
я сильно-сильно плаваю в скриптах линковщика (а точнее - вообще тону), и хитрости makefile меня тоже скорее пугают, чем помогают... Мне бы как-то попроще, если это возможно...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 31)
|
Jul 4 2018, 08:55
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(ARV @ Jul 4 2018, 10:22)  я сильно-сильно плаваю в скриптах линковщика (а точнее - вообще тону), и хитрости makefile меня тоже скорее пугают, чем помогают... Мне бы как-то попроще, если это возможно... Тогда Вам нужно знать хитрости линковщика чтобы во время перезаписи созданной отдельной библиотеки для каждого выбранного эффекта, производить корректную модификацию кода.
|
|
|
|
|
Jul 4 2018, 11:23
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Какие-то советы не совсем по теме вы даёте, коллеги  Основной код модифицировать не нужно, он знает только номера функций в таблице оверлея и адрес этой таблицы, и обращается по ним. А все варианты оверлеев содержат в самом своём начале эту самую таблицу, ссылающуюся на собственные функции. Поэтому в одном оверлее условно 5-я функция цветомузыки может быть "красный на максимум", а в другом - "синий на минимум". И как бы настоящую линковку мне не надо повторять, и разбираться с ней особенно не стоит, как и с форматом elf-файла - не влезет его разбор в AVR, да и ни к чему... Мне бы просто понять, как при помощи AVR-GCC собрать модуль с функциями и таблицей, и как из него получить HEX для записи...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jul 4 2018, 11:43
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ARV @ Jul 4 2018, 14:23)  Какие-то советы не совсем по теме вы даёте, коллеги  Перефразирую: - есть код и данные (константы и переменные); - нужно уметь запускать этот код и размещать данные по указанным доступным адресам/смещениям; - допускается иметь таблицу смещений функции, данных и использовать ее при загрузке модуля; - модуль может пользоваться функциями/данными основного приложения, вызывая их по конкретным адресам или по таблице указателей. На каком-нить Cortex-M - без проблем. А на AVR... ну, только если путем переписывания flash и динамического распределения ОЗУ. Задачка неактуальная, но интересная.
|
|
|
|
|
Jul 4 2018, 12:12
|
Частый гость
 
Группа: Участник
Сообщений: 102
Регистрация: 23-02-09
Пользователь №: 45 242

|
Цитата(adnega @ Jul 4 2018, 14:43)  Задачка неактуальная, но интересная. интересно, когда придется работать с трехбайтовыми адресами, в мегах выше 64-й, из-за 16-ой флеш адресации, и побайтовой Озу, при описании движения констант меж ними потребуют работу с модификаторами generic (IAR) ,куча мата от линкера, и прочая..
|
|
|
|
|
Jul 4 2018, 12:38
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ARV @ Jul 4 2018, 15:18)  как указать компилятору (или чему?), что адрес таблицы функций должен быть строго таким-то? все функции тоже должны быть строго в определенной области адресов? как потом получить hex-? Дык, это легко указать в скрипте линкера, но на этапе компиляции. Гораздо сложнее получить некий объектный код и запускать его с произвольного адреса. Например, создать 3 файла obj1, obj2, obj3, которые в произвольном порядке закинуть на карту, а МК потом их по очереди вычитает и загрузит по первым доступным адресам.
|
|
|
|
|
Jul 4 2018, 12:50
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(ARV @ Jul 4 2018, 15:18)  ...как скомпилировать? ....адрес таблицы функций должен быть строго таким-то? все функции тоже должны быть строго в определенной области адресов? как потом получить hex-?... делал подобное в меге128. на лопапалам её флэш делил. компилял как обычно. но делал софтинку для потрошения hex формата (подправлял адресацию). Менял и вектора так-же...прошивал половинку меги + таблицу векторов. у Вас без таблицы векторов, насколько я понимаешь. Общая засада при таких хотелках = проследить чтоб везде была относительная адресация. имхо: компилять обычно как программу. обязательно везде относительная адресация. дать линкеру честно сформировать таблицу нужных вентилей вызовов (таблица векторов ли или некая своя структура адресов функций - не суть). далее корректируем эту таблицу - до загрузки, если адреса загрузки фиксированы. - в момент загрузки, если адрес загрузки не известен. адрес естественно выровнен на нужное смещение. как то так (круглый)
|
|
|
|
|
Jul 4 2018, 14:29
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ARV @ Jul 4 2018, 15:43)  Этого (загрузки по произвольным адресам) не требуется (пока). Я в скриптах, как уже писал, не силен, и ответов на заданные вопросы не знаю... надеюсь на помощь. Нужно определить секцию под оверлеи. Все данные и функции размещать в этой секции. Попробую набросать код в AVR-студии, но ничего не обещаю, т.к. ни разу с AVR этого не делал. Сделал таблицу экспорта test_ovl.c CODE #include "test_ovl.h"
const uint16_t ovl_const_1 = 1; const uint16_t ovl_const_2 = 2;
volatile const sOVL_EXPORT ovl_export_func __attribute__((section(".ovl_export"))) = { 0, // ovl_data_ram_pointer sizeof(sOVL_DATA), // ovl_data_ram_size &ovl_func_1, // func_1 &ovl_func_2, // func_2 &ovl_const_1, // const_1 &ovl_const_2, // const_2 };
void ovl_entry(void){}
uint16_t ovl_func_1(const uint16_t param) { return param + ovl_const_2 + ovl_export_func.ovl_data->data_1; }
uint16_t ovl_func_2(const uint16_t param) { return param / ovl_export_func.ovl_data->data_2 + ovl_const_2; }
test_ovl.h CODE #ifndef __TEST_OVL_H__ #define __TEST_OVL_H__
#include <stdint.h>
typedef uint16_t t_ovl_func(const uint16_t param);
typedef struct sOVL_DATA { uint16_t data_1; uint16_t data_2; } sOVL_DATA;
typedef struct sOVL_EXPORT { sOVL_DATA *ovl_data; const uintptr_t ovl_data_size; t_ovl_func *func_1; t_ovl_func *func_2; const uint16_t *const_1; const uint16_t *const_2; } sOVL_EXPORT;
uint16_t ovl_func_1(const uint16_t param); uint16_t ovl_func_2(const uint16_t param);
#endif // __TEST_OVL_H__
test_ovl.ld CODE MEMORY { OVL_EXPORT(r!x) : ORIGIN = 0xE000, LENGTH = 16 OVL(rx) : ORIGIN = 0xE010, LENGTH = 8k - 16 }
SECTIONS { .ovl_export : { KEEP(*(.ovl_export)) } >OVL_EXPORT
.text : { *(.text) *(.text.*) *(.data) *(.data.*) } >OVL }
test_ovl.bat Код del test_ovl.s test_ovl.d test_ovl.map avr-gcc -mmcu=atmega88 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test_ovl.o -c test_ovl.c avr-gcc -mmcu=atmega88 -Wl,--gc-sections,-Map=test_ovl.map,-cref,-u,ovl_entry test_ovl.o -T test_ovl.ld -o test_ovl.elf avr-objcopy -O binary test_ovl.elf test_ovl.bin avr-objdump -D -bbinary -mavr --start-address=16 test_ovl.bin > test_ovl.s del test_ovl.o test_ovl.d test_ovl.elf test_ovl.s (test_ovl.bin с 16 смещения) CODE 00: 00 00 04 00 09 70 15 70 68 E0 6A E0 00 00 00 00 0000e010 <ovl_entry>: &ovl_func_2, // func_2 &ovl_const_1, // const_1 &ovl_const_2, // const_2 };
void ovl_entry(void){} e010: 08 95 ret
0000e012 <ovl_func_1>:
uint16_t ovl_func_1(const uint16_t param) { return param + ovl_const_2 + ovl_export_func.ovl_data->data_1; e012: e0 91 00 e0 lds r30, 0xE000 e016: f0 91 01 e0 lds r31, 0xE001 e01a: 20 81 ld r18, Z e01c: 31 81 ldd r19, Z+1 ; 0x01 e01e: 2e 5f subi r18, 0xFE ; 254 e020: 3f 4f sbci r19, 0xFF ; 255 e022: 28 0f add r18, r24 e024: 39 1f adc r19, r25 } e026: c9 01 movw r24, r18 e028: 08 95 ret
0000e02a <ovl_func_2>:
uint16_t ovl_func_2(const uint16_t param) { return param / ovl_export_func.ovl_data->data_2 + ovl_const_2; e02a: e0 91 00 e0 lds r30, 0xE000 e02e: f0 91 01 e0 lds r31, 0xE001 e032: 62 81 ldd r22, Z+2 ; 0x02 e034: 73 81 ldd r23, Z+3 ; 0x03 e036: 04 d0 rcall .+8 ; 0xe040 <__udivmodhi4> e038: 6e 5f subi r22, 0xFE ; 254 e03a: 7f 4f sbci r23, 0xFF ; 255 } e03c: cb 01 movw r24, r22 e03e: 08 95 ret
0000e040 <__udivmodhi4>: e040: aa 1b sub r26, r26 e042: bb 1b sub r27, r27 e044: 51 e1 ldi r21, 0x11 ; 17 e046: 07 c0 rjmp .+14 ; 0xe056 <__udivmodhi4_ep>
0000e048 <__udivmodhi4_loop>: e048: aa 1f adc r26, r26 e04a: bb 1f adc r27, r27 e04c: a6 17 cp r26, r22 e04e: b7 07 cpc r27, r23 e050: 10 f0 brcs .+4 ; 0xe056 <__udivmodhi4_ep> e052: a6 1b sub r26, r22 e054: b7 0b sbc r27, r23
0000e056 <__udivmodhi4_ep>: e056: 88 1f adc r24, r24 e058: 99 1f adc r25, r25 e05a: 5a 95 dec r21 e05c: a9 f7 brne .-22 ; 0xe048 <__udivmodhi4_loop> e05e: 80 95 com r24 e060: 90 95 com r25 e062: bc 01 movw r22, r24 e064: cd 01 movw r24, r26 e066: 08 95 ret
0000e068 <ovl_const_1>: e068: 01 00 ..
0000e06a <ovl_const_2>: e06a: 02 00 ..
Все переменные нужно задать в sOVL_DATA и обращаться к ним так ovl_export_func.ovl_data->data_1. При загрузке модуля в первых 16 битах нужно записать адрес, выделяемого блока в ОЗУ для данного модуля, а размер можно узнать из следующих 16 бит.
|
|
|
|
|
Jul 4 2018, 18:00
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
В AVR-студии добавил пару строчек в опциях линкера: -T../test_ovl.ld -Wl,--gc-sections,-Map=test_ovl.map,-cref,-u,ovl_entry см. картинку
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 5 2018, 00:01
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(ARV @ Jul 4 2018, 14:23)  Поэтому в одном оверлее условно 5-я функция цветомузыки может быть "красный на максимум", а в другом - "синий на минимум". С другой стороны эти 5-е функции из разных оверлеев по сути представляют одну функцию с двумя параметрами: цвет и яркость. И реализовать такой функционал гораздо проще через табличную организацию параметров в EEPROM. Цитата(ARV @ Jul 4 2018, 14:23)  И как бы настоящую линковку мне не надо повторять, и разбираться с ней особенно не стоит, как и с форматом elf-файла - не влезет его разбор в AVR, да и ни к чему... Мне бы просто понять, как при помощи AVR-GCC собрать модуль с функциями и таблицей, и как из него получить HEX для записи... Т.е. Вы планируете не все возможные варианты функций-эффкектов собрать в один файл, а на каждую допустимую комбинацию свой файл транслировать?
Сообщение отредактировал aiwa - Jul 5 2018, 00:02
|
|
|
|
|
Jul 5 2018, 11:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(aiwa @ Jul 5 2018, 04:01)  Т.е. Вы планируете не все возможные варианты функций-эффкектов собрать в один файл, а на каждую допустимую комбинацию свой файл транслировать? Да, именно такой подход планирую. В стандартной прошивке прошит стандартный эффект, а любые варианты пользователь по мере необходимости загружает сам. Плюс "всех вариантов в одной прошивке" в том, что переключение эффекта быстрое и без ущерба микроконтроллеру. Минус - память не резиновая, и угодить на все предпочтения нереально, в итоге из нравящихся мне эффектов (занимающих память!) другим и выбрать нечего... Плюс оверлейного варианта - количество эффектов неограничено, каждый из них может быть существенно сложноее по алгоритму, т.к. ему достается гораздо больше памяти. Минус оверлеев - долгая загрузка, т.е. переключение эффектов занимает заметное время, а так же не очень большой ресурс перезаписи flash. Пока только вникаю в данные рекомендации и думаю о целесообразности... Пересилят ли плюсы минусы?
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jul 5 2018, 13:28
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(ARV @ Jul 5 2018, 14:01)  Плюс "всех вариантов в одной прошивке" в том, что переключение эффекта быстрое и без ущерба микроконтроллеру. Вы не совсем поняли. Я имел ввиду организацию дампа на карточке для подкачки. Здесь два варианта: иметь все спецэффекты в одном "файле", или иметь кучу "файлов" с разнообразным набором эффектов. В первом случае Вам по сути при перезаписи с карточки во флеш придется выполнить работу линкера. Этот случай более правильный и гибкий. Второй случай: Вы прописываете файлы с предопределенной комбинацией эффектов. В таком случае Вам разбираться ни с чем не нужно - просто вырезать в выхода компилятора необходимый дамп прошивки. Но головняк будет с созданием набора таких дампов и с увеличением количества эффектов он будет несоизмеримо возрастать.
|
|
|
|
|
Jul 5 2018, 13:39
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(aiwa @ Jul 5 2018, 16:28)  просто вырезать в выхода компилятора необходимый дамп прошивки. Это как? А адреса? А распределение ОЗУ? Я в сообщении #13 привел пример исходников, которые можно собрать с известного адреса и безболезненно с этого адреса грузить. Правда, придется под оверлей в основной программе выделить ОЗУ и указатель на эту область сохранить во flash при загрузке оверлея.
|
|
|
|
|
Jul 5 2018, 14:36
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(adnega @ Jul 5 2018, 16:39)  Это как? А адреса? А распределение ОЗУ? ТС вначале упоминал, что блоки ОЗУ распределены для каждого оверлея и адреса этих блоков уже известны на этапе разработки.
|
|
|
|
|
Jul 5 2018, 15:51
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(aiwa @ Jul 5 2018, 17:36)  ТС вначале упоминал, что блоки ОЗУ распределены для каждого оверлея и адреса этих блоков уже известны на этапе разработки. Про ОЗУ ничего не было и вряд ли могло быть, т.к. расход ОЗУ уж очень индивидуальная вещь. Да и размер ОЗУ у AVR крошечный. А вот функции можно описать в таблице. Цитата Но вопрос в том, как скомпилировать модуль! Я готовый шаблон привел для avr-gcc.
|
|
|
|
|
Jul 5 2018, 16:51
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(adnega @ Jul 4 2018, 14:43)  Перефразирую: ... - нужно уметь запускать этот код и размещать данные по указанным доступным адресам/смещениям; ... Мне казалось, что под размещающимися по указанным адресам данным как раз и подразумевается ОЗУ.
|
|
|
|
|
Jul 5 2018, 17:13
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(aiwa @ Jul 5 2018, 19:51)  Мне казалось, что под размещающимися по указанным адресам данным как раз и подразумевается ОЗУ. Да, но не так вольно. У основной программы есть свободное ОЗУ. При загрузке оверлея можно узнать сколько именно ОЗУ ему требуется. Выделить в ОЗУ основной программы необходимый участок и передать указатель на него оверлею. Хотя, если в один момент времени может работать только один оверлей, то можно и фиксировано выделить определенное число байт.
|
|
|
|
|
Jul 5 2018, 17:45
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(adnega @ Jul 5 2018, 20:13)  Хотя, если в один момент времени может работать только один оверлей, то можно и фиксировано выделить определенное число байт. Топикстартер поправит, если я неправильно понял: есть набор функций №1, №2, №3 ... и для их нужд заранее предопределены участки OЗУ. Каждая из этих функций имеет несколько различных вариантов реализации (в теме - оверлеев), и каждый вариант может использовать только свою область ОЗУ (ну, естественно и ОЗУ стационарной программы).
|
|
|
|
|
Jul 9 2018, 08:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Отвечаю оптом всем, цитировать не очень удобно. Идея такая: "основная программа" выделяет некий буфер, грубо говоря, все свободное ОЗУ за вычетом необходимого пространства стека и собственных нужд. Адрес этого буфера известен всем оверлеям на этапе разработки, т.е. в модуле оверлея это просто указатель на буфер ИЗВЕСТНОГО размера. Оверлей накладывает на этот указатель тип структуры собственных данных и работает с ними. таким образом, все оверлеи разделяют одну и ту же область памяти, никакого выделения/освобождения не требуется - только инициализация при старте оверлея. Как вариант, каждый оверлей имеет функцию №1 init, которой передается адрес этого буфера, что принципиально ничего не меняет. На счет того, что будет содержать в себе оверлей в плане эффектов цветомузыки, я еще до конца не решил - то ли один-единственный эффект, то ли некий набор... Принципиальным тут для меня является крайне небольшой ресурс перезаписей flash у МК AVR - гарантируется 1000 раз всего-то... Разумеется, буду продумывать механизм проверки имеющегося оверлея на карточке на загруженность, чтобы не переписывать понапрасну, но все равно, 1000 "переключений" режима цветомузыки - это как-то маловато... Еще одна проблема, над решением которой придеттся думать, это необходимость передачи оверлею набора функций из основной программы, т.е. аналогично некоему BIOS, чтобы в каждом оверлее не тянуть одинаковые функции типа memcpy или иные, которые активно используются в цветомузыке...
Пока что все на этапе обдумывания, но, как я понял, принципиально идею оверлеев вы одобряете?
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jul 9 2018, 14:18
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ARV @ Jul 9 2018, 11:24)  Адрес этого буфера известен всем оверлеям на этапе разработки, т.е. в модуле оверлея это просто указатель на буфер ИЗВЕСТНОГО размера. Это упрощает реализацию. Оверлей всегда один в памяти МК в один момент времени? Цитата(ARV @ Jul 9 2018, 11:24)  Еще одна проблема, над решением которой придеттся думать, это необходимость передачи оверлею набора функций из основной программы, т.е. аналогично некоему BIOS, чтобы в каждом оверлее не тянуть одинаковые функции типа memcpy или иные, которые активно используются в цветомузыке... Это легко. Только должен быть определен набор этих функций и известны все типы. Цитата(ARV @ Jul 9 2018, 11:24)  Пока что все на этапе обдумывания, но, как я понял, принципиально идею оверлеев вы одобряете? Если переключать раз в неделю, то можно. Если с частотой 2 Гц, то исключено. А вариант с Cortex-M не рассматриваете?
|
|
|
|
|
Jul 9 2018, 17:39
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(ARV @ Jul 9 2018, 11:24)  Пока что все на этапе обдумывания, но, как я понял, принципиально идею оверлеев вы одобряете? Не одобряем. Надо параметризовать эффект-автомат и придумать какой-нибудь упрощённый язык его программирования. Программу для него писать в виде обычного текстового файла и разрешить пользователям самим это делать.
|
|
|
|
|
Jul 10 2018, 08:06
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(haker_fox @ Jul 10 2018, 08:03)  Мне кажется, если это нужно, возьмите более подходящий МК (что-нить на Cortex-M3/4 или на крайний случай M0). Они могут исполнять код из ОЗУ. А тут ужу простора для фантазии больше) Тут тяжёлый случай.
|
|
|
|
|
Jul 12 2018, 10:13
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Проще всего не делать ничего - это факт, с которым не поспоришь. Чуть более сложно запилить цветомузыку на компьютере - для этого вообще ничего программировать не надо, полным полно готового - только лампочки подключи. Я сильно удивлен, что этих советов никто не дал.
Что касается текстового языка и возможности пользователю самостоятельно создавать эффекты - это уже реализовано, только эффекты не цветомузыкальные, а обычные, т.е. не связаны с музыкой от слова никак. И, кстати, не сильно заинтересовались пользователи... Т.к. при описании эффектов думать надо.
Более сложные интерпретаторы, увы, реализовать невозможно в рамках поставленной задачи. И поэтому пока что описанный мной метод оверлеев - единственный вариант обеспечить настоящее многообразие с минимальными усилиями конечного пользователя.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|