|
|
  |
Размер таблицы прерываний STM32 |
|
|
|
May 28 2015, 10:57
|
Знающий
   
Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231

|
.s беру стандартные из CMSIS, FLASH_WRITE_BLOCK_SIZE задаётся, может быть изменён в настройках перед компиляцией. Приложение это бутлоадер. И т.к. контроллеры могут быть разные, а ядро одинаковое, решил сделать доп. проверку. В Код typedef enum{ ..... } IRQn_Type; можно вставить, но это редактирование stm32f4xx.h, хоть и один раз (но при смене версии нужно учитывать), а так подменил .s файл и всё посчитало при компиляции. Вначале просто вычислил все вектора для мк 4-ой серии и записал дефайнами, но стало интересней сделать поумнее.
|
|
|
|
|
May 28 2015, 11:35
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Бутлоадер в основной прошивке запишет CRC основной прошивки после векторов прерываний. Естественно основная прошивка для этого зарезервирует место для CRC. а зачем он это сделает? да правда нет но можно использовать Reset_Handler он вроде как идет сразу после таблицы с началом __Vectors А можно в конце таблице добавить __Vectors_end , так будет совсем красиво.... Не наврал по карте памяти там __main.o вроде как сразу легло... интересно это зафиксировано?
|
|
|
|
|
May 28 2015, 13:05
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
CRC я дописываю в конец файла прошивки. Естественно, CRC всего файла вместе с CRC должна быть равна 0, если принял правильно. При приеме файла вычисляю его размер, и по этому размеру прогоняю вычисление CRC. Этот же размер я храню в области векторов, конкретно, в дыре по адресу 0x0020. При включении прибора даю время запустить загрузчик с панели управления. Если загрузчик не запускается, читаю по адресу 0x0020 размер прошивки, вычисляю CRC и запускаю рабочую программу, если CRC равна 0. Если CRC не верна, значит, рабочей программы нет.
|
|
|
|
|
May 28 2015, 19:27
|
Знающий
   
Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231

|
Цитата(Golikov A. @ May 28 2015, 21:57)  а мы добили прошивку мусором до полного числа секторов, и конец определяем по первому пустому сектору, при заливке стираем на 1 сектор больше, так у нас конец определен и хранить не надо ничего... Это всё хорошо когда сектора маленькие. А допустим в 401 (256k Flash), 4 сектора 16k - 2 для бута и 2 эмуляция EEPROM, 1 сектор 64 kB - основная программа и 1 сектор 128 - возможно в будущем ещё одна основная программа. Это всё соединено последовательно друг за другом до 100 устройств по RS-485, скорость ~ 115200. И передавать лишнее килобайты как то не особо хочется, при этом не разрушая работу всей системы. ViKo, за метки спасибо, завтра попробую.
|
|
|
|
|
Jun 5 2015, 10:23
|
Знающий
   
Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231

|
Появилось время попробовать вариант 2 код в .s файле Код EXPORT VECTOR_TABLE_SIZE
DATA __vector_table ... ... __vector_table_end VECTOR_TABLE_SIZE EQU __vector_table_end - __vector_tabl код в .с файле Код extern uint32_t VECTOR_TABLE_SIZE; #define FLASH_VECTOR_TABLE_SIZE VECTOR_TABLE_SIZE
[b]// !!! --- По прежнему не работает ---[/b] #if (FLASH_WRITE_BLOCK_SIZE < FLASH_VECTOR_TABLE_SIZE) #error "Error FLASH_WRITE_BLOCK_SIZE" #endif Цитата Remark[Pe193]: zero used for undefined preprocessing identifier "FLASH_WRITE_BLOCK_SIZE" В коде всё как и в 1-ом варианте работает нормально. Думаю заставить препроцессор увидеть переменную раньше дефайна нет. Т.к. в .s файле это дефайн, а при экспорте в .c файл это уже объявление переменной.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|