реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Размер таблицы прерываний STM32
Rash
сообщение May 28 2015, 10:57
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



.s беру стандартные из CMSIS, FLASH_WRITE_BLOCK_SIZE задаётся, может быть изменён в настройках перед компиляцией. Приложение это бутлоадер. И т.к. контроллеры могут быть разные, а ядро одинаковое, решил сделать доп. проверку.
В
Код
typedef enum{  ..... } IRQn_Type;
можно вставить, но это редактирование stm32f4xx.h, хоть и один раз (но при смене версии нужно учитывать), а так подменил .s файл и всё посчитало при компиляции. Вначале просто вычислил все вектора для мк 4-ой серии и записал дефайнами, но стало интересней сделать поумнее.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 28 2015, 11:02
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

А нафига, даже бутлоадеру, знать размер таблицы?
Go to the top of the page
 
+Quote Post
Rash
сообщение May 28 2015, 11:06
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



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

Бутлоадер в основной прошивке запишет CRC основной прошивки после векторов прерываний. Естественно основная прошивка для этого зарезервирует место для CRC.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 28 2015, 11:35
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Бутлоадер в основной прошивке запишет CRC основной прошивки после векторов прерываний. Естественно основная прошивка для этого зарезервирует место для CRC.

а зачем он это сделает?

да правда нет

но можно использовать
Reset_Handler
он вроде как идет сразу после таблицы с началом __Vectors
А можно в конце таблице добавить __Vectors_end , так будет совсем красиво....


Не наврал по карте памяти там __main.o вроде как сразу легло... интересно это зафиксировано?
Go to the top of the page
 
+Quote Post
scifi
сообщение May 28 2015, 12:19
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Rash @ May 28 2015, 14:06) *
Бутлоадер в основной прошивке запишет CRC основной прошивки после векторов прерываний. Естественно основная прошивка для этого зарезервирует место для CRC.

В таблице векторов прерываний есть дырки. Туда можно записать.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 28 2015, 13:05
Сообщение #21


Универсальный солдатик
******

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



CRC я дописываю в конец файла прошивки. Естественно, CRC всего файла вместе с CRC должна быть равна 0, если принял правильно. При приеме файла вычисляю его размер, и по этому размеру прогоняю вычисление CRC.
Этот же размер я храню в области векторов, конкретно, в дыре по адресу 0x0020. При включении прибора даю время запустить загрузчик с панели управления. Если загрузчик не запускается, читаю по адресу 0x0020 размер прошивки, вычисляю CRC и запускаю рабочую программу, если CRC равна 0. Если CRC не верна, значит, рабочей программы нет.
Go to the top of the page
 
+Quote Post
Rash
сообщение May 28 2015, 13:24
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



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

А вот как в конце таблицы добавить метку с адресом __Vectors_end, как писал Golikov A. я не понял. Это возможно решило вопрос с препроцессором.

Использовать дыры во флеш не хочется, что бы не попасть при выходе новых контроллеров.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 28 2015, 13:31
Сообщение #23


Универсальный солдатик
******

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



В Keil:
Код
__Vectors       DCD     __initial_sp             ; Top of Stack
                DCD     Reset_Handler            ; Reset Handler
...
                DCD     FPU_IRQHandler                  ; FPU
                                      
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

Ассемблерная строка начинается с метки.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 28 2015, 18:57
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Этот же размер я храню в области векторов, конкретно, в дыре по адресу 0x0020

а мы добили прошивку мусором до полного числа секторов, и конец определяем по первому пустому сектору, при заливке стираем на 1 сектор больше, так у нас конец определен и хранить не надо ничего...
Go to the top of the page
 
+Quote Post
Rash
сообщение May 28 2015, 19:27
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 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, за метки спасибо, завтра попробую.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 28 2015, 20:12
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а кто передавать то требует?
вы передаете только программу и контрольную сумму, а как ее в сектора класть уже бутлоадер решает.
Именно он может ее дополнить до целого числа секторов и записать во флэш. Можно даже считать что программа дополняется 0xFF и контрольную сумму считать именно для такого дополнения (значением стертого сектора). Бутлоадер получит программу, запишет начало, в конце сектора запишет контрольную сумму и свободен...



Go to the top of the page
 
+Quote Post
ViKo
сообщение May 29 2015, 04:00
Сообщение #27


Универсальный солдатик
******

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



Цитата(Golikov A. @ May 28 2015, 21:57) *
а мы добили прошивку мусором до полного числа секторов, и конец определяем по первому пустому сектору, при заливке стираем на 1 сектор больше, так у нас конец определен и хранить не надо ничего...

Транжиры вы. biggrin.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 29 2015, 09:45
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



да все равно память на борту лежит, какая разница что в ней, 0, мусор или пусто? Ее же не сдашь в магазин обратно, если лишняя оказалась....
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 5 2015, 10:23
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 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 файл это уже объявление переменной.


Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 5 2015, 11:09
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



вас спасет assert

через #if, вероятнее такое действительно не пролезет, на уровне препроцессора значение очевидно не вычисляется, адреса меток, наверное будут присвоены на уровне линковки....
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016