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

Размер таблицы прерываний STM32

День добрый.

Подскажите, как получить размер таблицы прерываний __vector_table из файла startup_stm32f40_41xxx.s , использую IAR.

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


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

День добрый.

Подскажите, как получить размер таблицы прерываний __vector_table из файла startup_stm32f40_41xxx.s , использую IAR.

 

В datashet-е и в RefMan-е вся расписана.

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


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

В Keil в стартапе есть такая строка после векторов:

__Vectors_Size EQU __Vectors_End - __Vectors

Но как ее использовать в c-файлах, я не смог найти способа.

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


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

Но как ее использовать в c-файлах, я не смог найти способа.

Cначала EXPORT <var> в ассемблере, затем extern <type> <var> в си. В IAR'е должно быть что-то подобное.

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


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

В IAR ещё проще

#pragma section=".intvec"
  printf( "intvec segment size = %d\r\n",  (uint32_t)__segment_end(".intvec") 
               - (uint32_t)__segment_begin(".intvec") );

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


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

Cначала EXPORT <var> в ассемблере, затем extern <type> <var> в си. В IAR'е должно быть что-то подобное.

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

Вот здесь жалился: http://electronix.ru/forum/index.php?showt...t&p=1324623

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


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

Вот обратного действия у меня не получилось.

Так там не переменная, а макроопределение с c-синтаксисом. Такого армовский ассемблер не умеет.

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


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

В CrossWorks (GNU) работает это:

 

extern void* __vectors_load_start__;
extern void* __vectors_load_end__;
................................
uint32_t vt_length = (uint32_t)&__vectors_load_end__ - (uint32_t)&__vectors_load_start__;

Имена взяты из map-файла. Может быть и в IAR возможно что-то подобное?

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


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

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

Я не думаю, что IAR в этом смысле сильно отличается от KEIL, а в KEIL для использования в С из S:

 

s:

EXPORT mysimbol

c:

extern <typedef> mysimbol;

 

В обратную сторону:

 

c:

<typedef> mycsimbol;

s:

IMPORT mycsimbol

 

Мне "удалось" также импортировать в ассемблер символы, генерируемые компоновщиком (касается адресов и размеров секций). Например,

 

IMPORT |Load$$LR$$LR_IROM2$$Length|,

 

то есть, длину региона загрузки LR_IROM2 (должно быть обрамлено именно вертикальными линиями). Это все не я раскопал, конечно. Описано на сайте onarm.com, но ссылки я уже не приведу.

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

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


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

Может быть и в IAR возможно что-то подобное?

Что-то подобное я уже писал в предыдущем сообщении.

Но у IAR есть ещё одна чрезвычайно полезная штука: папка doc.

Оказывается, кроме __segment_begin и __segment_end есть не менее полезная псевдофункция __segment_size.

 

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


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

Но у IAR есть ещё одна чрезвычайно полезная штука: папка doc.
Это для слабых! :08:

 

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


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

Спасибо всем. результат таков:

1. через __segment_size получаем размер таблицы векоров, но это значение нельзя использовать препроцессором, т.е.

#pragma section=".intvec"
#define FLASH_VECTOR_TABLE_SIZE        ((uint32_t)__segment_size(".intvec"))

#define FLASH_WRITE_BLOCK_SIZE         (512)

// !!! --- Это работать не будет ---
#if (FLASH_WRITE_BLOCK_SIZE < FLASH_VECTOR_TABLE_SIZE)
  #error "Error FLASH_WRITE_BLOCK_SIZE"
#endif

 

2. через EXPORT __vector_table в ассемблере (startup_stm32f40_41xxx.s ), затем extern uin32_t __vector_table или extern uin32_t* __vector_table в си, можно определить адрес расположения __vector_table или значение записанное по этому адресу __vector_table[0], но размер таблицы не определить, т.к. опереция sizeof(__vector_table)/sizeof(__vector_table[0]) выдаст 1.

 

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


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

а почему размер указателя разделить на размер указателя должно давать что-то отличное от 1:)?

 

uin32_t*

 

или почему размер 32 битного инта резделить на размер 32 битного инта тоже должно давать что-то кроме 1?

 

uin32_t

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


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

всё правильно, что даёт 1, я имел виду, что т.о. не получишь длину таблицы векторов, т.к. можно получить указатель __vector_table, а не определение массива.

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


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

Спасибо всем. результат таков:

1. через __segment_size получаем размер таблицы векоров, но это значение нельзя использовать препроцессором, т.е.

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

Впрочем, если Вы не сами пишете .s, а используете готовый, то размер таблицы можно вычислить зная максимальный номер вектора. Надо только учесть ещё 16 слов для векторов с отрицательными номерами.

 

Ищем определение typedef enum{ ... } IRQn_Type;, дописываем две строчки:

typedef enum{
  .....
  HASH_RNG_IRQn               = 80,     /*!< Hash and RNG global interrupt                                     */
  FPU_IRQn                    = 81      /*!< FPU global interrupt                                              */
  ,__MAX_VECTOR_NUM__       /* получит значение на 1 больше максимального номера вектора */
} IRQn_Type;
#define  VECTOR_TABLE_SIZE  (4*(__MAX_VECTOR_NUM__-1+16))

 

ЗЫ. Сравнивая размер таблицы векторов с FLASH_WRITE_BLOCK_SIZE Вы проявляете завидную дальновидность :)

Пока что даже у самого толстого F756 этот размер составляет (97+16)*4 = 452 байта.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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