Golikov 0 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба вот, так что кнопка нужна! :) Да те кто правит и пишет стартап перед каждым проектом, снимаю шляпу, вы вызываете уважение, я видать уже обленился, пользуюсь выданным) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба вот, так что кнопка нужна! :) Нужна, но не для того, чтобы на неё нажимать. Только для нештатных ситуаций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба Нужна, но не для того, чтобы на неё нажимать. Только для нештатных ситуаций. Но если очень хочется нажать, то можно))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup? ... Потому у меня мнение что надо менять философию и уже считать что нижний уровень погиб, работать на уровень выше. И программу делать на этом уровне абстракции, то есть считать зануленые переменные данностью, которую мы не можем победить. И следовательно совершать какие-то доп действия, как минимум. А как максимум еще и не использовать очевидное свойство возможного сохранения памяти. Где гарантия что все так останется, нет документации - нет свойства! ... А зачем его править? Я же написал английским по белому: __no_init объявление в С программе делает то, что надо. У меня без CRC: есть флажок в EEPROM: "программа годная, хорошая". По старту всегда стартует бутлоадер, который смотрит есть ли этот флаг, если есть, то делает проверку, хочет ли кто загрузить фирмварь, нет - прыгает на основную программу. Если флага нет, никуда прыгать не будет. Будет ждать аплоада фирмваря. Аплоад фирмваря заключается в а) стирании флага; б) аплоада и в) прыжка на эту программу после аплоада. Если аплоад не получился по какойто причине, прыжка не будет, будет опять пытатся сделать аплоад. Главная программа стартует, инициализируется, проверяет че надо, и если флажок не стоит, записывает его. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба Но если очень хочется нажать, то можно))) Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки. Для AVR без проблем делается делением лапополам и вся недолга. С каждой заливкой чередуются верхняя половинка/нижняя. Прошивка пишется с последнего сектора. Последним прошивается таблица векторов. Т.к. сектор записи больше чем таблица векторов - то за таблицей можно расположить служебную инфу. Типа номер прошивки и иже. Чтоб не было камня - достаточно обеспечить стабильность работы в течении записи одного всего сектора. Для ARMов - ещё просче. Можно сделать весь софт сегментным и ввести логику фулл, диф, инкрементальной версии по модульно. Софт будет сам себя писать и в добавок у вас в камне более одной рабочей прошивки. В случае сбоя - вы получаете кусок сбойной записи, которая при старте камня никак не будет детектироватья (нет црц и иже). Если ошибка софта - то статистика успешных отработок даёт ответ на вопрос целесообразности работы в той или иной конфигурации загрузки. Почему "если не боитесь" - замороты с адресацией. везде косвенная. Что не всегда поддерживают на ура компиляторы. Особенно когда кода больше чем ближний(оптимизированный) переход. Ослинные уши вылазят в основном на языках си и выше. На армах юзаю IAR - грешен в нём так-же компилятор :) Посему системы записи места краша программы - актуально выходит на первое место. Ну и скидывания причины в удобный вид. Отсюда понятно - что в системе должен быть как минимум накопитель (к примеру микро сд). Но можно :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 12 марта, 2015 Опубликовано 12 марта, 2015 · Жалоба Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки. Да и зачем?? Если бутлодырь "правильный", то перезальет любую кривозалитую прошивку, а все эти дубли и пр, только усложняют прогу и уменьшают объем флешки... Если уж бутлодырь кривой, то и 3 копии не помогут, проверял на собственном опыте, лучше делать больше вариантов прошивки в буте, например, флешка, уарт, а если нужно удаленно - сеть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 14 марта, 2015 Опубликовано 14 марта, 2015 (изменено) · Жалоба Хм... опять что-то нездравое творится. Я залил бутлодер, предложенный ST, сделал все в соответствии с AN2557. Заливаю прошивку с помощью все того же HYperTerminal, предложенного в AN2557. Прошивка получена из проекта Keil, специально настроенного под задачу - перенесен адрес приложения, таблица векторов, в общем - если прошивать и бутлодер и основную программу с помощью Keil - они мирно сосуществуют, прыжки из бутлодера в программу и наоборот - без проблем. Но стоит залить прошивку с помощью HyperTerminal - основная программа не запускается. Отладчиком выяснено, что до функции Jump_To_Application() бутлодер добирается, а дальше - если остановить отладчик - видно что программа висит в HardFault_Handler. Господа, я не силен в отладке - чо мне делать дальше, как понять, что и почему не так пишется? Вектора переношу вот так __set_PRIMASK(1); NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); __set_PRIMASK(0); Еще один момент, для понимания: предположив, что прошивка пишется не со смещением, а несколько затирает бутлодер, то бишь портит его - я прошиваю основную программу Keil'ом. По идее, если бутлодер битый, это не поможет. Ан нет - все становится на свои места. Значит битая основная программа. Но я тогда не пойму, почему отлоадчик остается в бутлодере? ПО идее дали пкоманду прыгнуть по адресу основной программы и все - отладчик из бутлодера ушел... Прикрепляю бутлодер от ST stsw_stm320081111.rar Изменено 14 марта, 2015 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 марта, 2015 Опубликовано 14 марта, 2015 · Жалоба Вот здесь почитайте, может, даст толчок. http://electronix.ru/forum/index.php?showt...t&p=1317836 У меня все заработало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 14 марта, 2015 Опубликовано 14 марта, 2015 (изменено) · Жалоба Ну не знаю, я так понял, что у вас вообще не грузилась основная программа. А у меня она грузится, если прошить Keil и перезапустить. А если прошить bootloaderом - то не грузится. Вопрос - Keil у меня грузит в контроллер файл axf. Бутлодеру я подсовываю hex. Есть предположение, что как-то неправильно генерируется hex. Чтобы проверить это - как мне заставить Keil отправить в контроллер hex файл? Еще вопрос - окно Memory что показывает - Flash или Ram? /////////////// Разобрался как подсунуть HEX - Keil шьет его нормально.... В настройках Keil есть пункт IROM - в нем 2 поля, первое эт старт - 0x8003000, с ним все понятно. ВТорое - size 0x80000. Что-то я не нашел в коде бутлодера, где было бы такое значение, значит оно не учитывается бутлодером? Залил по очереди прошивки - кейлом и бутлодером. Скачал по очереди, в HEX редакторе сравнил. Идентичны до адреса 0x00007477 (это смещение от 0x800....) Дальше каждый байт различен.... Изменено 14 марта, 2015 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 14 марта, 2015 Опубликовано 14 марта, 2015 · Жалоба видно что программа висит в HardFault_Handler. Господа, я не силен в отладке - чо мне делать дальше, как понять, что и почему не так пишется? Скорее всего чтото недоинициализированно. После бутлоадера осталось. Вот смотреть адреса lr, pc - это откуда хард фолт случился. void hard_fault_handler_c(unsigned int * hardfault_args) { unsigned int stacked_r0; unsigned int stacked_r1; unsigned int stacked_r2; unsigned int stacked_r3; unsigned int stacked_r12; stacked_r0 = ((unsigned long) hardfault_args[0]); stacked_r1 = ((unsigned long) hardfault_args[1]); stacked_r2 = ((unsigned long) hardfault_args[2]); stacked_r3 = ((unsigned long) hardfault_args[3]); stacked_r12 = ((unsigned long) hardfault_args[4]); stacked_lr = ((unsigned long) hardfault_args[5]); stacked_pc = ((unsigned long) hardfault_args[6]); stacked_psr = ((unsigned long) hardfault_args[7]); while (1) ; } /******************************************************************************* * Description : This function handles Hard Fault exception. * Input : - * Return : - *******************************************************************************/ void HardFault_Handler(void) { // Go to infinite loop when Hard Fault exception occurs asm("TST LR, #4"); asm("ITE EQ"); asm("MRSEQ R0, MSP"); asm("MRSNE R0, PSP"); asm("B hard_fault_handler_c"); while (1); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 14 марта, 2015 Опубликовано 14 марта, 2015 (изменено) · Жалоба Пока выяснил вот что - бутлодер от прошивки не портится. Но пишется во флеш совсем не то, что пишется, если программировать Keilом Изменено 14 марта, 2015 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 14 марта, 2015 Опубликовано 14 марта, 2015 · Жалоба Мне кто-нибудь может пояснить, что за ерунда? Test_project.hex - то, что генерирует keil Зашиваем keilом - работает, скачиваем с помощью FlashLoader - получаем right.hex - он отличается. Зашиваем бутлодером получаем wrong.hex Как понять логику, если записываем, все записывается правильно, но когда этот правильный код скачиваем - получаем другое... P.S. скачивал не все, у нажные сектора, начиная с 0x08003000 TEST_Project.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 14 марта, 2015 Опубликовано 14 марта, 2015 · Жалоба У меня мысли кончились... Кто-нибудь работал именно с AN2577 ? Получается грузить только встроенным бутлодером или через Keil. Предложенный в AN2577 бутлодер грузит во флеш фигню. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 14 марта, 2015 Опубликовано 14 марта, 2015 · Жалоба А сама запись/чтение данных в/из флэша нормально работает? Может начать с этого? Вообще, на первый взгляд, данные в файлах TEST_Project.hex и right.hex одинаковы, отличие только в разном количестве байт в строке, т.е. "скачиваем с помощью FlashLoader" то, что и залили программатором. А вот right.hex и wrong.hex отличаются. Ищите ошибку где-то в записи во флэш загрузчиком, возможно в приёме данных или отправке с хоста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 14 марта, 2015 Опубликовано 14 марта, 2015 · Жалоба Ваша правда, test и right одинаковы. Я просто сравнивал их средствами редактора, а в нем сравнение шло тупо побаитово, не вникая в суть записи. Чуется мне, что собака где-то в привязке к железу зарыта, точнее к архитектуре памяти. В бутлодере полно дефайнов на разные случаи жизни, но возможео разработчики что-то и упустили. Бот кстати под сотую серию, у меня же 103ret6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться