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

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


Знающий
****

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



День добрый.
Подскажите, как получить размер таблицы прерываний __vector_table из файла startup_stm32f40_41xxx.s , использую IAR.
Go to the top of the page
 
+Quote Post
Obam
сообщение May 26 2015, 07:14
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(Rash @ May 26 2015, 10:51) *
День добрый.
Подскажите, как получить размер таблицы прерываний __vector_table из файла startup_stm32f40_41xxx.s , использую IAR.


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


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 26 2015, 07:51
Сообщение #3


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

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



В Keil в стартапе есть такая строка после векторов:
__Vectors_Size EQU __Vectors_End - __Vectors
Но как ее использовать в c-файлах, я не смог найти способа.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 26 2015, 08:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ May 26 2015, 10:51) *
Но как ее использовать в c-файлах, я не смог найти способа.

Cначала EXPORT <var> в ассемблере, затем extern <type> <var> в си. В IAR'е должно быть что-то подобное.
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 26 2015, 08:42
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



В IAR ещё проще
Код
#pragma section=".intvec"
  printf( "intvec segment size = %d\r\n",  (uint32_t)__segment_end(".intvec")
               - (uint32_t)__segment_begin(".intvec") );


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 26 2015, 08:43
Сообщение #6


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

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



Цитата(aaarrr @ May 26 2015, 11:22) *
Cначала EXPORT <var> в ассемблере, затем extern <type> <var> в си. В IAR'е должно быть что-то подобное.

Порылся в своем, нашел, вспомнил - в c-файл из ассемблерного можно передать переменную. Вот обратного действия у меня не получилось.
Вот здесь жалился: http://electronix.ru/forum/index.php?showt...t&p=1324623
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 26 2015, 15:22
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ May 26 2015, 11:43) *
Вот обратного действия у меня не получилось.

Так там не переменная, а макроопределение с c-синтаксисом. Такого армовский ассемблер не умеет.
Go to the top of the page
 
+Quote Post
Axel
сообщение May 27 2015, 03:49
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



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

CODE
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 возможно что-то подобное?
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение May 27 2015, 07:29
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(ViKo @ May 26 2015, 09:43) *
Порылся в своем, нашел, вспомнил - в 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 - May 27 2015, 07:30
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 27 2015, 07:37
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Axel @ May 27 2015, 10:49) *
Может быть и в IAR возможно что-то подобное?

Что-то подобное я уже писал в предыдущем сообщении.
Но у IAR есть ещё одна чрезвычайно полезная штука: папка doc.
Оказывается, кроме __segment_begin и __segment_end есть не менее полезная псевдофункция __segment_size.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 27 2015, 08:36
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(SSerge @ May 27 2015, 10:37) *
Но у IAR есть ещё одна чрезвычайно полезная штука: папка doc.
Это для слабых! 08.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Rash
сообщение May 28 2015, 06:04
Сообщение #12


Знающий
****

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



Спасибо всем. результат таков:
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.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 28 2015, 07:43
Сообщение #13


Гуру
******

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



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

uin32_t*

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

uin32_t
Go to the top of the page
 
+Quote Post
Rash
сообщение May 28 2015, 10:17
Сообщение #14


Знающий
****

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



всё правильно, что даёт 1, я имел виду, что т.о. не получишь длину таблицы векторов, т.к. можно получить указатель __vector_table, а не определение массива.
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 28 2015, 10:27
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Rash @ May 28 2015, 13:04) *
Спасибо всем. результат таков:
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 Вы проявляете завидную дальновидность sm.gif
Пока что даже у самого толстого F756 этот размер составляет (97+16)*4 = 452 байта.


--------------------
Russia est omnis divisa in partes octo.
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 - 04:01
Рейтинг@Mail.ru


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