Завершаю свой проект, но на последнем этапе требуется помошь, господа коты, подскажите! Коротко - делаю блок управления более-менее "умной" логикой на объекте. К центру прицеплено по РС485 куча датчиков, от них собирается телеметрия, обрабатывается, и передается на сервер через IP-сеть. Тут долго рассказывать... тема узкоспецифическая. Кодил это последние 4 месяца, все завершено.
В центральном подуле основа - проц 18F26K22, к нему помимо всего прочего прицеплен ЕНЦ 28J60, и nor-флешка.
На финише осталось теперь сделать, чтобы сие устройство можно было обновить удаленно, т.е написать бутлоадер. Я могу через сеть напрямую писать во флешь произвольные даныные в произвольную позицию, откуда потом бутлоадер при рестарте может обновить содержимое процессорной памяти. Все это если рассматривать по отдельности, в принципе проблемы не представляет, по крайней мере после победы над флешью вообще, и чипом ENC в том числе, над чем основательно и успешно вывихнул мозги))).
Подскажите пожалуйста, конкретными советами (ибо морально силы на исходе), требуется слепить это воедино. (т.е БУТ и основную прошивку, на 26К22). Поскольку прерывания в 26К22 расположены в начале процессорной памяти, нет никакой возможности расположить весь бут целиком в начале процессора. Логика подсказывает, что в 0-м оффсете процессора надо разместить что-то типа asm("goto OFFSET"), и в этом оффсете расположить БУТ, с последующим возвратом в точку расположенную прямо после первой инструкции в начале процессора(ну а там БУТ будет решать, скопировать из NORa чего-то или просто вернуть управление).
В процессе написания описанного монстра нигде не применял дополнительных опций компилятора и линкера, только выставил оптимизацию в normal, ну.. где выставляется offset видел, указывать пробовал, но вопрос как их соединить все равно открыт.
Вот допустим, создаю 2-й проект-BOOT, помимо основного, в котором делаю всю логику БУТа. Как собрать их воедино? Как сделать чтобы в нулевом оффсете PICa располагалось asm(goto...)
Компилятор ХС8 1,45, МПЛАБ Х последней версии, проц повторюсь, PIC18F26K22, хотя кстати собрал этот же проект и под 27К40, там памяти в 2 раза больше, но как оказалось мне и в 26К22 все шикарно влезло, места для БУта достаточно.
И второе. Для начала, я хочу собрать единый ХЕКС для прошивки. А как получить BIN, который буду записывать в NOR через удаленку? непосредственно пригодный для копирования в процессор?
При написании на Си, потребуется писать скрипт линкера. Мануал на линкер имеется в хелпе мплаба. Нужно так же ознакомится с размером стираемых страниц флеша в МК и расположить бут в пределах определенного количества этих страниц так, чтобы на эти страницы не попадал остальной код. Собственно границы страниц и указываются в скрипте линкера. Располагать бут в начале нет никакой необходимости. Некоторая проблема возникает с прерываниями. Либо Вы их в буте вообще не используете, либо отказываетесь от перепрошивки нулевой страницы флеша и оборачиваете обработчик нестираемым семафором, который переключает обработку между основным кодом и бутом. При этом возрастает латентность обработчиков прерываний. И тогда бут оказывается в начале флеша. Получение BIN не обязательно, можно загружать и HEX, преобразуя его на лету в дамп памяти. В любом случае, этим дОлжно заниматься либо ПО в самом МК, либо внешнее ПО, осуществляющее загрузку в МК. Если предполагается шифрование загружаемого потока, то BIN вообще не нужен, внешнее ПО преобразует HEX в любой удобный для загрузки формат и шифрует его. А вообще, есть аппнота по буту для 18-х ПИКов, правда бут там типовой и использует для загрузки типовое ПО Микрочипа. ЗЫ. Никаких goto не требуется. Просто нужно, чтобы main территориально относился к буту. Основной цикл будет содержать две ветки - application и bootloader Я, например, предпочитаю применять буфер загрузки, разделяя флеш ровно пополам на собственно весь код, включая бут, и буфер загрузки. В рабочем режиме фоновым образом грузится новая прошивка, а затем подается команда на перепрошивку и устройство АВТОНОМНО и очень быстро (примерно за 2 секунды на 5000 строк кода в dsPIC33) перегоняет данные буфера в исполняемый флеш.
Лично я бутлоадер всегда располагаю с 0 адреса. Естественно ставлю защиту от стирания. У меня всегда два проекта: бутлоадер и основная программа. В опциях линкера основной программы указываю адрес, доступный для перепрошивки и все это, если нужно объединить после компиляции "автоматом" соединяю программой PicHexEdit В дальнейшем работаю только с основным проектом - бут уже есть. В буте при старте МК по какому-то флагу определяю что делать: запускать основную прошивку или перепрошивать
Бутлоадеры условно можно разделить на два типа: те, которые предназначены для заливки в устройство лежащее на столе (доступное непосредственно) и те, которые работают с удаленным устройством. И эти два вида - "две большие разницы". И по надежности и скорости канала связи и по возможности влиять на ситуацию руками (сбросить МК или нажать на некую кнопку, подключить другое ПО или задействовать другой интерфейс...).
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
Спасибо, поковыряю документацию по линкеру, после чего продолжу задавать вопросы).
Мой случай - удаленка. Я могу долго и упорно отсылать пакеты во флешь, пробивая их через любой степени хреновости UDP-сеть, проверяя и перепроверяя корректность доставки, лишь бы оно вообще хоть как то работало))). Все это делается софтверно. После окончательной записи, активирую соотв. флаг в конфиге, предназначенный для скармливания БУТу, отправляю в устройство РЕСЕТ-команду, и после этого уже ни на что не могу повлиять, оно должно будет получить и записать что требуется через SPI-NOR. Сам БУТ прерывания использовать не будет, там только SPI без прерываний.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
При удаленной прошивке работа с HEX увеличивает объем передаваемых данных минимум в 2,5 раза. При этом, никак не решает вопрос с шифрованием. Если прошивку шифровать, то придется: а) писать шифрующее ПО б) корректировать бут из аппноты. При этом исчезает профит от использования собственно HEX-а. Есть смысл при шифровании изменить формат на бинарный и внести изменения в бут Микрочипа и в этой части.
и после этого уже ни на что не могу повлиять, оно должно будет получить и записать что требуется через SPI-NOR.
В этом и проблема. Все замечательно, если во время обмена и прошивки не будет потеряно питание (даже кратковременно). В Вашем методе (если я его правильно понял) очень высокая вероятность получить удаленный "кирпич".
В Вашем методе (если я его правильно понял) очень высокая вероятность получить удаленный "кирпич".
Память делится на две области: в одну из них заливается новая прошивка и где-то для нее хранится контрольная сумма. Бутлоадер при старте смотрит флаг с какой прошивкой работать. Проверяет контрольную сумму и если она не совпала переходит на работу с предыдущей версией прошивки...
А ничего, что латентность у прерываний растет? Там и так достаточно семафоров из-за единых на все векторов всего двух обработчиков. Впрочем, тут дело вкуса. Можно и не переписывать принятый код. Смысл буферизации от этого не меняется. Главное, не гнать принятые данные сразу в исполняемую часть, даже если запуск произойдет только после верификации.
>>В этом и проблема. Все замечательно, если во время обмена и прошивки не будет потеряно питание (даже кратковременно).
Да, веселье... вообще, есть изделия работающие по такому принципу, сейчас сооружаю аналог. До сих пор пока еще "проносило", но очевидно что однажды оно случится. Вероятность на самом деле минимальная... но может быть, поскольку изделие будет стоять к примеру в трансформаторной будке, чердаке, и.т.д.
Во время обмена - нет. Каждый фрагмент отправляется отдельно, и я могу контролировать по отдельности. Пока я удаленно не верифицирую корректную запись каждого фрагмента - я не разрешу активацию БУТа.
Отсюда родом и была мысль, в нулевое смещение писать "GOTO OFFSET BOOT", а из бута возвращать назад. Т.е, в процессе незавершенной прошивки возможны только 2 состояния: 1. либо ВСЯ ПАМЯТЬ кроме БУТа будет стерта (FF), либо, 2. как минимум 0-я страница будет содержать содержимое, в этом случае степень незавершенности будет неважна, поскольку управление передастся на БУТ, а он начнет процесс заново - т.е если в общем конфиге нет маркера что прошивка завершена, значит бут получив управление сотрет все что есть, кроме самого себя, не вдаваясь в детали. А внешний конфиг (всего аппарата) хранится в SPI- флеши, и не затрагивается ничем, если только специально не записать.
При этом стирать страницы не с начала к концу, а от конца к началу. Насколько я помню, вектор прерывания в 26К22 расположен на 1-й странице памяти, а размер стираемой страницы - 64 байта. Т.е либо будет стерто абсолютно все кроме БУТа, либо сохранится 0-я страница, вместе с командой перехода. И понятно кстати, что даже если БУТ выполнить в виде функции внутри основного проекта, все равно придется внутри описать всю инициализацию, SPI в частности, и прикладные флешь-функции.
Что скажете? только сильно не бейте)))
Сейчас пока теоретизирую "на пальцах", но и в остальной части проекта сначала долго продумывал в уме.
В процессоре 26К22, равно как и в 27К40 мало места, чтобы держать в памяти самого проца точную копию кода. Еще мыслима красивая идея держать в внешней флеши несколько версий, и активировать ту или иную по необходимости (так делается, видел), но флешь неподходящего размера все же.
По этой же причине расточительно передавать по сети HEX, да вообще, зачем заставлять аппарат что-то делать, если это можно сделать софтверно? Только я не знаю пока, как читать ХЕКС, вот и спрашивал про программу. Кстати, спасибо!
И да, потом будет криптография. ПК-часть у меня на том же самом С что и ХС8)))), только размерность int другая, так что функции можно будет применить общие, и примерно одновременно.
Так). То что изложил "на пальцах", на практике заработало! Базовая программа пишет во внешнюю флешь настройку активации для БУТа, который ее читает, пока что промигивает 100 раз диодом, снимает флаг активации и благополучно передает управление назад.
Слепил из 2-х отдельных проектов, покамест, хотя идея расположить БУТ внутри базового проекта нравится.
Благополучно нарвался на переполнение стека... ибо передавать управление надо не из 4-й вложенной функции.
Теперь вот что, дальше надо писать отправку бинарника во флешь. Хотя описание ХЕКСа теперь понятно), порылся и нашел программу,
hex2bin v2.5, Copyright (C) 2017 Jacques Pelletier & contributors
при рассмотрении полученного бинарника "под микроскопом" вроде бы все соответствует. Кто-нибудь юзал? Сойдет для быстрого старта?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения