ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 апреля
689249 Топик полностью
_VVB (26.07.2016 09:45, просмотров: 1) ответил Xитpый Kитaeц на Нужна среда исполнения такого кода уже записанная во флэш, собственно всё. Остальное решается настройками компилятора и линкера.
Овчинка выделки не стоит. Программа малюсенькая и в обозримом будущем таких программ не предвидится. Подробнее. Стоит цель обновления прошивки порядка 10 блоков аппарата в произвольном порядке без вскрытия аппарата. Наружу выведен Ethernet и USB, подключение к этим обоим интерфейсам через выделенную плату CAN-Ethernet. Внутренняя шина CAN. Используя плату CAN-Ethernet, ПО на ПК может получить доступ к шине CAN, то есть ко всем блокам аппарата. Протокол CAN самописный, не CANopen. Прошивки можно будет обновлять двумя путями: воткнув подготовленную флэшку (разруливать требования для обновления и управлять прошивкой будет плата CAN-Ethernet) и выбрав соответствующий пункт в меню аппарата или подключив аппарат к ПК через Ethernet (управлять прошивкой будет ПК). Я не нашёл информации, как задачу обновления ПО множества плат в аппарате решают другие люди, поэтому начал придумывать. Для унификации я решил сделать для каждого типа микроконтроллера два маленьких проекта: "загрузчик" и "обновитель прошивки". Вход в "загрузчик" осуществляется командой по шине CAN. Адрес точки входа в "загрузчик" известен рабочему ПО. Перед входом в "загрузчик" рабочее ПО отключает исполнительные устройства и прерывания, но оставляет работающим контроллер CAN. "Загрузчик" не производит инициализации каких-либо исполнительных устройств, кроме перестройки контроллера CAN на приём пакета с идентификатором 0 методом поллинга (без использования прерываний) и далее ждёт пришедшей в этом пакете команды. Команды для "загрузчика" простые: "установить начальный адрес для приёма двоичного кода", "установить длину передаваемых двоичных данных", "осуществить сброс микроконтроллера", "принять двоичные данные", "запустить программу по заданному адресу". Таким образом, управляющий блок может записать в произвольный адрес ОЗУ (за исключением двухсот верхних байт, используемых "загрузчиком" для стека) абсолютно любую подготовленную прошивку (например, образ для детальной проверки функционирования, или "обновитель прошивки") и запустить её на выполнение. Это единственная функция "загрузчика" -- принять по CAN двоичный образ и запустить его на выполнение. Проект "загрузчик" является универсальным для каждого типа микроконтроллера (даже с внешними ИМС flash памяти). Но для гибкости очень хочется размещать его по тому адресу, по которому удобно размещать для каждого конкретного аппаратного блока, для этого я начал разбираться с PIC и наткнулся на сложности (в форумах обычно говорят об "shared code" и обсуждают корректное размещение секции данных, это мне не надо). Возврат из "загрузчика" в основную программу невозможен, выход из "загрузчика" только по рестарту. Про "обновитель прошивки" уже должно быть ясно. Это маленький проект, который принимает новую рабочую прошивку по шине CAN и программирует его в flash память. Для того чтобы была доступна вся flash, "обновитель прошивки" использует ОЗУ для исполнения кода, таким образом, можно даже обновить "загрузчик". Микроконтроллеры могут быть с небольшим количеством ОЗУ, например, Cortex-M0 с 16 КБ ОЗУ, что не позволяет реализовать среду исполнения в flash (потому что при программировании flash невозможно исполнение кода из flash).