|
|
  |
Самомодифицирующийся код в экосистеме Cortex-M., есть ли право на жизнь? |
|
|
|
Jun 29 2018, 15:05
|
Профессионал
    
Группа: Свой
Сообщений: 1 687
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 884

|
Цитата(AVR @ Jun 29 2018, 10:43)  Оптимизация по скорости? А то я хотел microPython предложить, для best-in-class супер простой самомодификации кода. уже предложили. только заметил. Цитата(jcxz @ Jun 29 2018, 11:43)  По скорости. Ну если у меня оптимизация на таком уровне (генерация маш.кода), то это совсем другой порядок скоростей, чем смогут всякие явы и питоны  мда. присоединюсь про другое железо. Явно Allwinner просится
--------------------
Если хочешь узнать, что ждет тебя на дороге впереди, спроси у тех, кто возвращается по ней.
|
|
|
|
|
Jun 29 2018, 16:00
|
Местный
  
Группа: Участник
Сообщений: 297
Регистрация: 20-05-17
Пользователь №: 97 202

|
Цитата(AlexandrY @ Jun 29 2018, 10:00)  Тогда я не согласен с названием "самомодифицирующийся", у меня загрузчики тоже загружают разные не то что функции, а целые программы(и да в машинных кодах, разумеется) в зависимости от аргументов. Попытаюсь объяснить (как я это понял), что подразумевать под "самомодифицирующимся кодом" топикстартер. Не. Не буду. Боюсь всё равно не поймёте А разжигать холивар не хочу Впрочем, скажу кое-что. Ваш загрузчик просто подгружает целые законченные куски кода, а у топикстартера программа меняет отдельные команды своего собственного кода
|
|
|
|
|
Jun 29 2018, 16:18
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(RadiatoR @ Jun 29 2018, 16:23)  Так тут будет тот же if()...if()...if()... Нет, не будет. Цитата(adnega @ Jun 29 2018, 19:03)  Простите, а пункты 1 и 2 не требуют тактов разве? Возможно, Вы и коллега выше не совсем поняли что я имею в виду. Смотрите. Рассмотрим первый случай - когда в цикле непосредственные команды проверки условия Код while(условие) { if(условие 1) инструкция 1; if(условие 2) инструкция 2; if(условие 3) инструкция 3; } Как видно, будут всегда выполняться инструкции, реализующие условия проверки внутри if(...). Если применить СМК, и вычислить условия в if(...)-ах до цикла, то в ОЗУ построится, допустим, следующий код (примем, что условия 1 и 3 истинны) Код while(условие) { инструкция 1; инструкция 3; } Или же, если все условия истинны, то Код while(условие) { инструкция 1; инструкция 2; инструкция 3; } Или же, если первое условие истинно, то Код while(условие) { инструкция 1; } Как видно, в любом случае нет больше в цикле инструкций проверки условий в if(...)-ах (а они же ведь по сути Bxx в ассемблерном представлении) (да и куда лучше вовсе не проверять заранее ложные условия по списку), а выполняются только нужные инструкции сразу, как будто условных конструкций и нет. А п. 1 и 2, конечно, требуют тактов, только для моего случая п. 1. требуется выполнить только 1 раз для всех итераций цикла, на этапе составления списка инструкций СМК. Надеюсь, моя мысль будет так понятнее.
Сообщение отредактировал Arlleex - Jun 29 2018, 16:23
|
|
|
|
|
Jun 29 2018, 16:35
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Arlleex @ Jun 29 2018, 19:18)  Надеюсь, моя мысль будет так понятнее. Условия в рантайме меняются или нет? Если нет, то компилятор сам выкинет заведомо ложные и исполнит заведомо истинные условия. А если они меняются в рантайме, то и ваш генератор СМК должен все эти условия проверить, сгенерить год и исполнить его. По моему, даже если вы выиграете на исполнении СМК, то скорее всего проиграете на подготовке СМК.
|
|
|
|
|
Jun 29 2018, 16:56
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Arlleex @ Jun 29 2018, 16:08)  Приведу пример, где бы я использовал СМК (опять же, в реальной практике была уйма таких задач). Пусть есть некий цикл, но внутри этого цикла подряд идут условно выполняемые команды: Код while(условие) { if(условие 1) инструкция 1;
if(условие 2) инструкция 2;
if(условие 3) инструкция 3;
...
if(условие N) инструкция N; } Потрясающе!!!! Вы угадали прямо в точку! Именно такой алгоритм я и хочу переделать на СМК! Потрясающая проницательность! Конкретней: у меня сейчас есть участок кода примерно такой: char *s; if (map & 1 << 0) копирование 16 или 32 бит в *s с его постинкрементом на соотв. величину из источника, адрес которого берётся из таблицы для данной битовой позиции карты if (map & 1 << 1) копирование 16 или 32 бит в *s с его постинкрементом на соотв. величину из источника, адрес которого берётся из таблицы для данной битовой позиции карты if (map & 1 << 2) копирование 16 или 32 бит в *s с его постинкрементом на соотв. величину из источника, адрес которого берётся из таблицы для данной битовой позиции карты ... if (map & 1 << 11) копирование 16 или 32 бит в *s с его постинкрементом на соотв. величину из источника, адрес которого берётся из таблицы для данной битовой позиции карты всего 12 таких операторов. Вобщем-то 12 таких шагов не напрягают. Но! - есть желание увеличить размер битовой карты до 64 бит, соответственно и кол-во if-ов будет уже очень большим. А всё это вызывается с довольно неплохой частотой из ISR. В то же время одновременно установленными может быть не более некоторого числа бит в карте (примерно около 10 максимум). Но всё равно сколько бит установлено в карте - всё равно будет выполняться вся эта портянка кода - это самое неприятное. Т.е. - даже когда эта функция выключена (битовая карта map==0), то процессор всё равно будет тратить кучу времени на выполнение всех этих 64 шагов. При статическом построении алгоритма. Вот тут то и пришла в голову идея при каждом изменении map строить динамически код. map изменяется очень редко - не чаще раза в секунду. PS: Вобщем генератор уже написан, осталось отладить  Цитата(twix @ Jun 29 2018, 17:35)  действительно, интерпретатор намного эффективнее и проще в реализации. Уже в N-раз повторяю: РАЗГОВОР О СКОРОСТИ ВЫПОЛНЕНИЯ КОДА!!! Причём тут интерпретатор??? Цитата(a123-flex @ Jun 29 2018, 18:05)  мда. присоединюсь про другое железо. Явно Allwinner просится Блин! причём тут allwinner, если у меня МК заточенный своей периферией под конкретную задачу - motor control. И куча периферии задействована. Эта функция - лишь небольшая сервисная часть. Вы этот allwiner вначале хотя-бы автомотивный найдите. не говоря уже о куче другой специфичной периферии....
|
|
|
|
|
Jun 29 2018, 16:56
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(adnega @ Jun 29 2018, 19:35)  Условия в рантайме меняются или нет? Конечно меняются. Это обычные переменные, которые взводятся/сбрасываются где-то выше по коду или вовсе в других его частях. Цитата(adnega @ Jun 29 2018, 19:35)  А если они меняются в рантайме, то и ваш генератор СМК должен все эти условия проверить, сгенерить год и исполнить его. Так выигрыш то огромен, если список таких условных ветвей достаточно большой. Даже из 10 условных команд, в случае, если эти команды нужно выполнить все (худший случай с точки зрения затраченного времени выполнения), понадобится 20 тактов (при условии, что все команды однотактные и условно выполняемая инструкция одна) без СМК. А применив СМК - цикл сократится до 10 тактов (без накладных расходов на проверку условия цикла). В лучшем случае, если только 1 условие верно, нужно выполнить только 1 инструкцию вместо 20 (10 связок "команда сравнения - команда самого условно выполняемого действия") выигрыш в 20 раз! Это ли не здорово? Цитата(adnega @ Jun 29 2018, 19:35)  По моему, даже если вы выиграете на исполнении СМК, то скорее всего проиграете на подготовке СМК. Достаточно написать перед этим интересующие участки на ассемблере, скомпилировать их и видеть в бинарнике готовые инструкции в виде машинных слов. Easy же  Цитата Потрясающе!!!! Вы угадали прямо в точку! Именно такой алгоритм я и хочу переделать на СМК! Потрясающая проницательность! Я просто телепат
Сообщение отредактировал Arlleex - Jun 29 2018, 17:22
|
|
|
|
|
Jun 29 2018, 17:11
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Николай Семёнович @ Jun 29 2018, 19:00)  Ваш загрузчик просто подгружает целые законченные куски кода, а у топикстартера программа меняет отдельные команды своего собственного кода Вот именно. Даже полностью строит процедуру. Вот такой примерно должен быть результат (код) работы генератора: CODE ;Назначение регистров в динамически генерируемой функции. dstReg EQU c_R0 ;указатель на целевой буфер для записи (вх.аргумент) tblReg EQU c_R1 ;указатель на таблицу адресов переменных (вх.аргумент) tmpReg0 EQU c_R2 ;рабочий регистр 0 tmpReg1 EQU c_R3 ;рабочий регистр 1 ;сама функция ;f0 LDR tmpReg0, [tblReg, #bit1*4]; где bit1 - номер первого единичного бита в мл.слове бит-карты ;f0 LDR tmpReg1, [tblReg, #bit2*4]; где bit2 - номер второго единичного бита в мл.слове бит-карты ;f1 LDR/LDRH tmpReg0, [tmpReg0] ;f2 STR/STRH tmpReg0, [dstReg], #step; где step==4 для STR и step==2 для STRH ;f0 LDR tmpReg0, [tblReg, #bit3*4]; где bit3 - номер 3-го единичного бита в мл.слове бит-карты ;f1 LDR/LDRH tmpReg1, [tmpReg1] ;f2 STR/STRH tmpReg1, [dstReg], #step; где step==4 для STR и step==2 для STRH ;f0 LDR tmpReg1, [tblReg, #bit4*4]; где bit4 - номер 4-го единичного бита в мл.слове бит-карты ;f1 LDR/LDRH tmpReg0, [tmpReg0] ;f2 STR/STRH tmpReg0, [dstReg], #step; где step==4 для STR и step==2 для STRH ; ... ;f3 ADDS tblReg, tblReg, #32*4; вставляется при переходе к ст.слову бит-карты если в нём есть единицы ;f0 LDR tmpReg0, [tblReg, #bit1*4]; где bit1 - номер 1-го единичного бита в ст.слове бит-карты ;f1 LDR/LDRH tmpReg1, [tmpReg1] ;f2 STR/STRH tmpReg1, [dstReg], #step; где step==4 для STR и step==2 для STRH ;f0 LDR tmpReg1, [tblReg, #bit2*4]; где bit2 - номер 2-го единичного бита в ст.слове бит-карты ;f1 LDR/LDRH tmpReg0, [tmpReg0] ;f2 STR/STRH tmpReg0, [dstReg], #step; где step==4 для STR и step==2 для STRH ; ... ;f1 LDR/LDRH tmpReg1, [tmpReg1] ;f2 STR/STRH tmpReg1, [dstReg], #step; где step==4 для STR и step==2 для STRH ;f4 BX LR LDR или LDRH использовать - определяется весом бита, заданным в таблице. Генератор формирует код глядя в эту таблицу. Цитата(Arlleex @ Jun 29 2018, 19:18)  Как видно, в любом случае нет больше в цикле инструкций проверки условий в if(...)-ах (а они же ведь по сути Bxx в ассемблерном представлении) (да и куда лучше вовсе не проверять заранее ложные условия по списку), а выполняются только нужные инструкции сразу, как будто условных конструкций и нет. А п. 1 и 2, конечно, требуют тактов, только для моего случая п. 1. требуется выполнить только 1 раз для всех итераций цикла, на этапе составления списка инструкций СМК. Надеюсь, моя мысль будет так понятнее. Блин, коллега, позвольте пожать Вашу руку! Вы - похоже почти единственный человек на этом форуме сходу понявший все нюансы!!!  Цитата(Arlleex @ Jun 29 2018, 19:56)  Я просто телепат  Как будто заглянули в мои исходники!
|
|
|
|
|
Jun 29 2018, 17:23
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Arlleex @ Jun 29 2018, 20:18)  О результатах сообщите, пожалуйста, удалось/не удалось внедрить, буду держать на всякий случай идею такую. Я довольно плотно поработал с битовой графикой на LCD/TFT дисплеях и организовывал меню разной степени вложенности для пользователей устройств с тачскрином/кнопками и экраном. Там таких ситуаций, где флажки надо опрашивать и определять отрисовки, да на каждом шагу по 50  Ок. Генератор написал, но отлаживать буду завтра - поздно уже. Как заработает - напишу. У меня этот код предназначен для записи текущих значений переменных в поток. Карта выбранных для записи переменных приходит по интерфейсу связи и может меняться в процессе работы иногда, не прерывая процесса. Всего в программе много десятков таких переменных, которые хотелось бы писать, но писать все сразу - не хватит пропускной способности канала. Переменные пока только 16- и 32-битные (целочисленные и float). Каждая битовая позиция в карте закреплена жёстко за какой-то переменной. И есть таблица указателей на эти переменные. И это только - сервисная задача. Её выполнение не должно мешать выполнению основных рабочих задач МК, которых достаточно много и тяжёлых. Но в процессе работы нужно следить за всеми этими переменными. Вот примерно так.
|
|
|
|
|
Jun 29 2018, 17:36
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(jcxz @ Jun 29 2018, 20:23)  Всего в программе много десятков таких переменных, которые хотелось бы писать, но писать все сразу - не хватит пропускной способности канала. Идея понятна, идея здравая, сам делаю постоянно такие связки в проектах на МК + CPU (в одной плате). В сервисных структурах обмена указываю, какие переменные в нужном ответном массиве ожидаю в следующей посылке. Идея такая же, только у меня там пока что индусский код (но небольшой), а не СМК. Кстати, видел как еще СМК спасает именно заменой порождающего кода особенно в математических операциях, где цикличные действия зависят от знака некой величины: в таком случае инструкции add заменяется sub и копируется в ОЗУ на выполнение. Ну и куча сопутствующих примеров. ИМХО, главное в порыве радости весь проект не перелопатить на СМК - проклянешь себя через год, взглянув на код
|
|
|
|
|
Jun 29 2018, 17:46
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Arlleex @ Jun 29 2018, 16:08)  Интересная тема для меня, тема СМК. Ни разу не применял,... и не применяйте... представьте себе вы вместо ифа позвали обработчик подпрограммы, а оно само знает какое подставиться... Добро пожаловать в мир ОО восприятия... ну а аля виртуальные методы - делаются на любом языке(почти) на раз-два...тем более на сях... (круглый)
|
|
|
|
|
Jun 29 2018, 18:19
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(AlexandrY @ Jun 29 2018, 20:44)  А для меня лично загадка что вы называете словом СМК  Само Модифицирующийся Код Цитата(kolobok0 @ Jun 29 2018, 20:46)  Добро пожаловать в мир ОО восприятия... ну а аля виртуальные методы - делаются на любом языке(почти) на раз-два...тем более на сях... Как никак, ООП и СМК все-таки есть разнородные подходы к построению программных средств. На ООП без дублирования кода виртуальных методов для всех возможных комбинаций не возможна реализация подхода, даваемого СМК. Это все довольно обширные темы для разговора, и как-никак, они ортогональны, ИМХО. Цитата представьте себе вы вместо ифа позвали обработчик подпрограммы, а оно само знает какое подставиться... Здорово, не так ли?  Ну а если серьезно, то я придерживаюсь принципа: нужно придерживаться максимально золотой границы между читабельностью кода и его функциональной смысловой нагрузкой. Уж выделить 0.0001% кода для СМК, особенно, если он там уж очень гладко ложится, есть комильфо.
Сообщение отредактировал IgorKossak - Jun 29 2018, 20:14
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|