Доброе время суток! Можно ли на ардуинке сделать программу, которая, в ходе выполнения при выполнении определенных условий, изменяла бы сама себя? Заранее спасибо.
Теоретически можно, но с большими извращениями. Ну вот кто и как будет компилировать новый код внутри микромощного AVR? Правильно, никто и никак. Если к AVR подключить внешнюю память, тогда, возможно, в такую систему можно перетащить какой-нибудь компилятор. А если код уже откомпилирован, значит он и так и так уже во флэше и достаточно его вызвать. Поэтому, если есть только один МК AVR, то модифицировать как-то остается не программу, а некоторый интерпретируемый псевдокод, хранимый в RAM. Если же взять два МК, и соединить их накрест по SPI, то один контроллер сможет перепрошивать другой, а также себя самого при помощи второго МК, предварительно закачав в него или в разделяемую SRAM / внешний флэш свой новый код и попросив себя обновить. Еще, наверное, можно модифицировать загрузчик так, что он будет проверять в качестве источника кода не только UART, но и другие источники, например, ту же внешнюю память, в которую сам МК до этого насочинял новый код.
Я то же задумывался об этом. Можно поступить так: в отдельную EEPROM сохранять переменные, а в коде на дуне, указать, типо: Код (Text): while(val == 0) { //Выполняется начальная программа } while(val == 1) { //Модифицированная программа } При запуске, дуня считывает прошлые переменные с EEPROM, и выполняет определенную программу... Это конечно халява, ну если хорошо подумать, можно и без компиляторов обойтись...
А Вам интересна принципиальная возможность или применительно к конкретной задаче? Если да, то к какой? В некоторых случаях можно обойтись одним алгоритмом и модифицировать только данные. Например, хранить в ПЗУ набор команд или некоторые настройки, которые всегда можно изменить.
Ну, если такого добиться, то можно создать робота, способного к саморазвитию, а это терминатором попахивает
Автор топика самоустранился от обсуждения. Если речь идет об изменении кода в МК, имхо мертвая затея - ресурса МК не хватит. Но если речь идет о самообучающемся коде, то вполне: по принципу интерпретаторов. Т.е. основной код - набор анализаторов данных сенсоров + код управления исполнительными устройствами. Самообучалка: "код", создаваемый в процессе обработки данных. К примеру ехал бот, встретил таракана, остановился, зажег красный LED - спрашивает "что делать". Босс программирует действие. В следующий раз бот смело разворачивается и бежит от таракана...
Это не совсем самообучение. Это просто пример работы с EEPROМ. Тут получается как "двойная программа". В первом случае - начальная программа. Во втором - начальная + дополнительная команда. И так чередовать... Получится так: Условно у нас 3 блока из while(). 1 блок - стандартная программа. 2 блок и 3 блок - стандартная программа + доп.команды Включаем. Выполняется первый блок. Получаем, что робот на гусеницах едет тупо вперёд, но стоит на месте. Датчики говорят, что ничего спереди нету. Тогда дуня, переходит к следующему блоку, где описано "Если "застрял", то выполняем назад - вперёд, пока не выберемся". И сохраняет номер блока "val = 2". И теперь, при включении, робот уже знает, как быть, если "застрял". В теории получается, что он "обучился". И так много всяких разных блоков и команд. Но это как то не совсем правильно, поэтому можно посмотреть в инете.
Имхо, к обучению никакого отношения не имеет. Алгоритм поведения в ситуации "когда застрял" все равно заложен в программистом. Обучение -- это когда программистом заложена какая-то функция, оценивающее наше приближение к цели, а программа делает какие-нибудь случайные действия, оценивая, как они влияют на изменение значения целевой функции. Постепенно находит последовательность действий, которая эффективнее всего приводит к увеличению значения целевой функции.
Так же, как и на любом другом компьютере. Единственная оговорка -- целевая функция должна быть простой. Терминатора, который потом размножится и захватит мир, сделать не получится. А вот, скажем, червяка из нескольких сегментов, который научится поступательно ползать, может и получится. К сожалению, круг задач по самообучению, доступных такому МК, невелик, и многие из них проще решить программисту, а потом уже запрограммировать конкретный алгоритм.
Нейросети как раз требуют больших вычислительных мощностей, что добиться хоть сколь-нибудь интересного результата. Вот статья про идею, которая в свое время взорвала мой мозг, когда я учился в седьмом классе: http://kg.fdd5-25.net/9703/k1211.htm Тогда это казалось чем невообразимым, ну и может программироваться. Для простых игр, конечно... С шахматами так не получится.