Не постоянный код

Тема в разделе "Arduino & Shields", создана пользователем L_off, 2 мар 2013.

  1. L_off

    L_off Нерд

    Доброе время суток!
    Можно ли на ардуинке сделать программу, которая, в ходе выполнения при выполнении определенных условий, изменяла бы сама себя?
    Заранее спасибо.
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Загрузчик это как-то делает, когда прошивает ардуино через СОМ-порт.
    Вот только зачем?
     
    roggedhorse нравится это.
  3. Unixon

    Unixon Оракул Модератор

    Теоретически можно, но с большими извращениями. Ну вот кто и как будет компилировать новый код внутри микромощного AVR? Правильно, никто и никак. Если к AVR подключить внешнюю память, тогда, возможно, в такую систему можно перетащить какой-нибудь компилятор. А если код уже откомпилирован, значит он и так и так уже во флэше и достаточно его вызвать. Поэтому, если есть только один МК AVR, то модифицировать как-то остается не программу, а некоторый интерпретируемый псевдокод, хранимый в RAM. Если же взять два МК, и соединить их накрест по SPI, то один контроллер сможет перепрошивать другой, а также себя самого при помощи второго МК, предварительно закачав в него или в разделяемую SRAM / внешний флэш свой новый код и попросив себя обновить. Еще, наверное, можно модифицировать загрузчик так, что он будет проверять в качестве источника кода не только UART, но и другие источники, например, ту же внешнюю память, в которую сам МК до этого насочинял новый код.
     
  4. HighDigital

    HighDigital Гик

    Я то же задумывался об этом.
    Можно поступить так: в отдельную EEPROM сохранять переменные, а в коде на дуне, указать, типо:
    Код (Text):
    while(val == 0)
    {
      //Выполняется начальная программа
    }
    while(val == 1)
    {
      //Модифицированная программа
    }
    При запуске, дуня считывает прошлые переменные с EEPROM, и выполняет определенную программу...

    Это конечно халява, ну если хорошо подумать, можно и без компиляторов обойтись...
     
  5. HighDigital

    HighDigital Гик

    Вы случаем не "СкайНэт" хотите сделать? :)
    Смотрите, Каил Рис прийдет за вами! :D
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    А Вам интересна принципиальная возможность или применительно к конкретной задаче?
    Если да, то к какой? В некоторых случаях можно обойтись одним алгоритмом и модифицировать только данные. Например, хранить в ПЗУ набор команд или некоторые настройки, которые всегда можно изменить.
     
  7. HighDigital

    HighDigital Гик

    Ну, если такого добиться, то можно создать робота, способного к саморазвитию, а это терминатором попахивает :)
     
  8. roggedhorse

    roggedhorse Гик

    Автор топика самоустранился от обсуждения.
    Если речь идет об изменении кода в МК, имхо мертвая затея - ресурса МК не хватит.
    Но если речь идет о самообучающемся коде, то вполне: по принципу интерпретаторов.
    Т.е. основной код - набор анализаторов данных сенсоров + код управления исполнительными устройствами. Самообучалка: "код", создаваемый в процессе обработки данных.
    К примеру ехал бот, встретил таракана, остановился, зажег красный LED - спрашивает "что делать". Босс программирует действие. В следующий раз бот смело разворачивается и бежит от таракана...
     
  9. L_off

    L_off Нерд

    эмм...не понял, можно поподробней?
     
  10. L_off

    L_off Нерд

    Автор топика просто отсутствовал, так как не может всегда быть на форуме
     
  11. HighDigital

    HighDigital Гик

    Это не совсем самообучение.

    Это просто пример работы с EEPROМ.
    Тут получается как "двойная программа". В первом случае - начальная программа.
    Во втором - начальная + дополнительная команда.
    И так чередовать...

    Получится так:
    Условно у нас 3 блока из while().
    1 блок - стандартная программа.
    2 блок и 3 блок - стандартная программа + доп.команды

    Включаем. Выполняется первый блок.
    Получаем, что робот на гусеницах едет тупо вперёд, но стоит на месте. Датчики говорят, что ничего спереди нету.

    Тогда дуня, переходит к следующему блоку, где описано "Если "застрял", то выполняем назад - вперёд, пока не выберемся". И сохраняет номер блока "val = 2".
    И теперь, при включении, робот уже знает, как быть, если "застрял".

    В теории получается, что он "обучился".

    И так много всяких разных блоков и команд.
    Но это как то не совсем правильно, поэтому можно посмотреть в инете.
     
  12. apomelov

    apomelov Нерд

    Имхо, к обучению никакого отношения не имеет. Алгоритм поведения в ситуации "когда застрял" все равно заложен в программистом.
    Обучение -- это когда программистом заложена какая-то функция, оценивающее наше приближение к цели, а программа делает какие-нибудь случайные действия, оценивая, как они влияют на изменение значения целевой функции. Постепенно находит последовательность действий, которая эффективнее всего приводит к увеличению значения целевой функции.
     
    Megakoteyka нравится это.
  13. HighDigital

    HighDigital Гик

    В принципе, да. Но как такое сделать на дуньке?
     
  14. apomelov

    apomelov Нерд

    Так же, как и на любом другом компьютере. Единственная оговорка -- целевая функция должна быть простой. Терминатора, который потом размножится и захватит мир, сделать не получится. А вот, скажем, червяка из нескольких сегментов, который научится поступательно ползать, может и получится.
    К сожалению, круг задач по самообучению, доступных такому МК, невелик, и многие из них проще решить программисту, а потом уже запрограммировать конкретный алгоритм.
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    Запрограммируйте перцептрон :)
     
  16. apomelov

    apomelov Нерд

    Нейросети как раз требуют больших вычислительных мощностей, что добиться хоть сколь-нибудь интересного результата. Вот статья про идею, которая в свое время взорвала мой мозг, когда я учился в седьмом классе: http://kg.fdd5-25.net/9703/k1211.htm
    Тогда это казалось чем невообразимым, ну и может программироваться. Для простых игр, конечно... С шахматами так не получится.
     
    roggedhorse нравится это.