Перейти к содержанию
    

stm32 bootloader, разьясните новичку

Прилагаю свой проект с функцией перехода по адресу приложения. Подскажите, почему не хочет линковаться проект?

MyBootLoaderV1.0Test.rar

Изменено пользователем batisto4ka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему обойти это можно только, если неизменяемый загрузчик в первом секторе флеш, зашиваемый вами на заводе, будет иметь возможность "засасывать" прошивку из вне.

Каким образом?

Учтите мои требования по интерфейсам, приплюсуйте сюда необходимость реализации некоего рабочего протокола обмена (довольно сложного) в бутлоадере, необходимость определения параметров конфигурации каналов связи (формат этой конфигурации каналов связи может от прошивки к прошивке поменяться и бутлоадер должен заранее знать какой он был в прошлом и будет в будущем :)

Т.е. - вам придётся еще раз реализовать все те функции, что есть в рабочем ПО + необходимо как-то определить, что основное рабочее ПО функционирует неверно

(а ведь определить это бутлоадеру будет очень сложно, раз на этапе тестирования новой прошивки вы сами не выявили её неработоспособности, значит эту неработоспособность очень сложно даже вам определить не говоря уже о бутлоадере :)

Таким образом вам придётся написать бутлоадер значительно сложнее самого рабочего ПО! Значит если у нас рабочее ПО перед пуском в серию должно пройти опытную эксплуатацию на объекте как минимум месяц, то и такой бутлоадер тем более надо ставить на опытную эксплуатацию. Только как вы будете его отлаживать, ставить на опытную эксплуатацию на объект и УДАЛЁННО ОБНОВЛЯТЬ??? :smile3046:

Таким образом - приходим к абсурдности этой идеи ;)

 

А если вы о простом интерфейсе для обновления ПО, не подразумевающем использование различных каналов связи с переменной конфигурацией, то по-моему это уже есть в самом проце в ROM изначально - у NXP в её LPC есть ISP через UART.

 

Раздумывал над таким вариантом. Придумал такой вариант тестирования прошивки: в самой прошивке пишем функцию и располагаем ее по четко указанному адресу памяти программ, задача функции получить какое-нибудь число, выполнить некие действия (например, какие то арифметические действия) и вернуть ответ. Перед загрузкой основной прошивки бутлоадер сделает вызов этой функции с какими-то данными, получит от нее результат, выполнит такие же операции с этим же набором данных сам, сравнит результаты, если результаты совпадут то прошивка будет считаться валидной. Получится эдакий аналог системы пароль-отзыв.

Конечно, от необнаруженных при помощи CRC ошибок в прошивке это может и не спасти (если ошибки в прошивке есть, а сама функция-ключ будет работоспособной), но хотя бы спасет от заливки "левых" прошивок и выполнения устройством непредусмотренных действий.

Всё то же самое, но гораздо лучше реализует обычное CRC всей прошивки. Ведь вы предлагаете контролировать малую часть прошивки (функцию), а я - всю прошивку.

А спасение от заливки левых прошивок в моём способе делает бутлоадер, проверяя эту самую CRC перед обновлением поверх рабочей. Считать CRC генерируемой прошивки должен линковщик, благо к примеру в IAR-е это есть. Либо сторонее ПО - автоматом следующим шагом после линковки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прилагаю свой проект с функцией перехода по адресу приложения. Подскажите, почему не хочет линковаться проект?

После компиляции выдает сообщение:

"

.\Listings\MSU_KDM-3322.axf: Warning: L6310W: Unable to find ARM libraries.

.\Listings\MSU_KDM-3322.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __main.

"

А у вас?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таким образом вам придётся написать бутлоадер значительно сложнее самого рабочего ПО! Значит если у нас рабочее ПО перед пуском в серию должно пройти опытную эксплуатацию на объекте как минимум месяц, то и такой бутлоадер тем более надо ставить на опытную эксплуатацию. Только как вы будете его отлаживать, ставить на опытную эксплуатацию на объект и УДАЛЁННО ОБНОВЛЯТЬ??? :smile3046:

Таким образом - приходим к абсурдности этой идеи ;)

Абсурдные идеи говорите? Представьте, что кто-то хочет сделать диверсию на вашем приборе и выставить фирму в неприглядном свете, он просто зальет 3 левых байта с правильной crc. И как удаленно вы почините такое при вашей "100% надежной" реализации?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абсурдные идеи говорите? Представьте, что кто-то хочет сделать диверсию на вашем приборе и выставить фирму в неприглядном свете, он просто зальет 3 левых байта с правильной crc. И как удаленно вы почините такое при вашей "100% надежной" реализации?)

Интересно - откуда этот злодей знает где должна храниться эта CRC и по какому алгоритму она должна быть посчитана? А если он это узнал из неких источников, то из них же он и узнает всё про вашу функцию контроля и добавит и её.

Защита от таких злодеев реализуется защитой канала связи.

В нашем ПО этому злодею сначала надо узнать пароль доступа ДЛЯ ОБНОВЛЕНИЯ ПО, а также ключ шифрования для доступа к каналу С ПРАВАМИ ОБНОВЛЕНИЯ ПО.

Или Вы в ваших устройствах позволяете обновлять ПО кому попало без защиты канала связи???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или Вы в ваших устройствах позволяете обновлять ПО кому попало без защиты канала связи???

Зачем столько эмоций, я лишь показал вам две потенциально возможных ситуации, когда назвать такую реализацию 100% надежной нельзя. А злодеи могут быть и бывшими сотрудниками вашей фирмы, которые затаили обиду. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем столько эмоций, я лишь показал вам две потенциально возможных ситуации, когда назвать такую реализацию 100% надежной нельзя.

Да я спокоен как удафф ;)

А злодеи могут быть и бывшими сотрудниками вашей фирмы, которые затаили обиду. :)

Всё решается на своём уровне - ключ доступа для обновления ПО (или методику формирования такого ключа на основании серийного номера изделия и текущего времени к примеру) знает узкий круг лиц и если произошёл такой инцидент - тут должна подключаться служба безопасности и проверять подозреваемых из этого круга.

Если все эти мероприятия выполнены в полном объёме - надёжность будет близка к 100%.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если все эти мероприятия выполнены в полном объёме - надёжность будет близка к 100%.

Согласен, просто меня жизнь научила, что если есть пусть и маловероятная, но возможная ситуация - она случается. =)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После компиляции выдает сообщение:

"

.\Listings\MSU_KDM-3322.axf: Warning: L6310W: Unable to find ARM libraries.

.\Listings\MSU_KDM-3322.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __main.

"

А у вас?

Все, вопрос снят. Нужно подключить core_m3.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите домучать бутлоадер.

Программа бутлоадера записана по адресу 0x08000000. Программа пользователя пишется по адресу 0x0819000. Алгоритм бутлоадера такой: при сбросе ждем 5 секунд, если за это время по юсарту приходит нужная комбинация (короче устанавливается связь с внешним загрузчиком), то работает бутлоадер. А если связь не стуанавливается- загружается программа пользователя если она есть.

Не могу понять одного, как работает эта функция

void    JumpToApplication    (uint32_t ApplicationAddress)
{
typedef     void         (*pFunction)(void);
            pFunction     Jump_To_Application;
            uint32_t     JumpAddress;


//__disable_interrupt();                                                      // Запрещаем прерывания
NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_PROG_OFFSET);
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) //Проверяем, есть ли что-нибудь по адресу (там должно лежать значение SP для приложения, его кладет линкер)
    { 
                //Адрес перехода из вектора Reset
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);      
Jump_To_Application = (pFunction) JumpAddress;                     //Указатель на функцию перехода
      __set_MSP(*(__IO uint32_t*) ApplicationAddress);                    //Устанавливаем SP приложения
      Jump_To_Application();                                            //Запускаем приложение
    }
}

Вроде бы все правильно работает до момента 
[code]JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);

Насколько я понимаю, JumpAddress должна содержать адрес функции SystemInit. Но, у меня получается, что формируется фообще какой-то левый адрес, в котором расположен код бутлоадера.

Я так подозреваю, что причина в том, что нужно прежде чем билдить проект программы пользователя, которую нужно запистаь в память, нужно опредленным образомнастроить адрессацию где-то в настройках, то ли линковщик то ли не знаю. Потому что если брать обыкновенный проект в кейле, где настройки стоят по умолчанию, по адресу вектора сброса записывается адресс, где хранится программа, скомпилированная и слинкованная для базового адресса 0х08000000, поэтому если эту программу через программатор записать в камень и отлаживать, то адрес систем инит там будет к примеру по адресу 0х08000431. А если этот hex переслать в бутлоадер, то соответственно JumpAddress=0х08000431 будет принадлежать области порграммы бутлоадера.

Подскажите, пожалуйста, правильно ли я мыслю? И как настроить проект в Кейле, чтобы все хорошо работало???))))))))))))))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так подозреваю, что причина в том, что нужно прежде чем билдить проект программы пользователя, которую нужно запистаь в память, нужно опредленным образомнастроить адрессацию где-то в настройках, то ли линковщик то ли не знаю. Потому что если брать обыкновенный проект в кейле, где настройки стоят по умолчанию, по адресу вектора сброса записывается адресс, где хранится программа, скомпилированная и слинкованная для базового адресса 0х08000000, поэтому если эту программу через программатор записать в камень и отлаживать, то адрес систем инит там будет к примеру по адресу 0х08000431. А если этот hex переслать в бутлоадер, то соответственно JumpAddress=0х08000431 будет принадлежать области порграммы бутлоадера.

Подскажите, пожалуйста, правильно ли я мыслю? И как настроить проект в Кейле, чтобы все хорошо работало???))))))))))))))))

Все рассуждения верные, как конкретно настроить в кейле не знаю, по аналогии с IAR надо смотреть опции линковщика.

Надо изменить начальные адреса FLASH и Intvec на начальный адрес программы.

В самой программе не забыть первым действием установить новый адрес таблицы векторов, я про это уже говорил.

NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_PROG_OFFSET);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так все решено. На самом деле в программу, которая загружается, нужно добавить

 

__set_PRIMASK(1);//отключить все прерывания
/* Set the Vector Table base location at 0x08010000 */ 
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x19000);     //перенести таблицу векторов прерываний по адресу 0х08019000
/*Тут функции настройки NVICа*/
__set_PRIMASK(0);//включить все прерывания

Изменено пользователем batisto4ka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос по встроенному загрузчику STM, возможно ли его запустить находясь в основной программе не использую ножки BOOT? Например такая возможность имеется у LPC подав специальную команду внутри своей программы перейти в встроенный загрузчик и прошить контроллер с помощью flashmagic.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, действительно все заработало. Основное можно подглядеть: http://www.youtube.com/watch?v=cvKC-4tCRgw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...