Rash 0 26 мая, 2015 Опубликовано 26 мая, 2015 · Жалоба День добрый. Подскажите, как получить размер таблицы прерываний __vector_table из файла startup_stm32f40_41xxx.s , использую IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 26 мая, 2015 Опубликовано 26 мая, 2015 · Жалоба День добрый. Подскажите, как получить размер таблицы прерываний __vector_table из файла startup_stm32f40_41xxx.s , использую IAR. В datashet-е и в RefMan-е вся расписана. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 мая, 2015 Опубликовано 26 мая, 2015 · Жалоба В Keil в стартапе есть такая строка после векторов: __Vectors_Size EQU __Vectors_End - __Vectors Но как ее использовать в c-файлах, я не смог найти способа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 26 мая, 2015 Опубликовано 26 мая, 2015 · Жалоба Но как ее использовать в c-файлах, я не смог найти способа. Cначала EXPORT <var> в ассемблере, затем extern <type> <var> в си. В IAR'е должно быть что-то подобное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 26 мая, 2015 Опубликовано 26 мая, 2015 · Жалоба В IAR ещё проще #pragma section=".intvec" printf( "intvec segment size = %d\r\n", (uint32_t)__segment_end(".intvec") - (uint32_t)__segment_begin(".intvec") ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 мая, 2015 Опубликовано 26 мая, 2015 · Жалоба Cначала EXPORT <var> в ассемблере, затем extern <type> <var> в си. В IAR'е должно быть что-то подобное. Порылся в своем, нашел, вспомнил - в c-файл из ассемблерного можно передать переменную. Вот обратного действия у меня не получилось. Вот здесь жалился: http://electronix.ru/forum/index.php?showt...t&p=1324623 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 26 мая, 2015 Опубликовано 26 мая, 2015 · Жалоба Вот обратного действия у меня не получилось. Так там не переменная, а макроопределение с c-синтаксисом. Такого армовский ассемблер не умеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 27 мая, 2015 Опубликовано 27 мая, 2015 · Жалоба В 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 возможно что-то подобное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 27 мая, 2015 Опубликовано 27 мая, 2015 (изменено) · Жалоба Порылся в своем, нашел, вспомнил - в 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, но ссылки я уже не приведу. Изменено 27 мая, 2015 пользователем KnightIgor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 27 мая, 2015 Опубликовано 27 мая, 2015 · Жалоба Может быть и в IAR возможно что-то подобное? Что-то подобное я уже писал в предыдущем сообщении. Но у IAR есть ещё одна чрезвычайно полезная штука: папка doc. Оказывается, кроме __segment_begin и __segment_end есть не менее полезная псевдофункция __segment_size. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 27 мая, 2015 Опубликовано 27 мая, 2015 · Жалоба Но у IAR есть ещё одна чрезвычайно полезная штука: папка doc.Это для слабых! :08: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rash 0 28 мая, 2015 Опубликовано 28 мая, 2015 · Жалоба Спасибо всем. результат таков: 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 28 мая, 2015 Опубликовано 28 мая, 2015 · Жалоба а почему размер указателя разделить на размер указателя должно давать что-то отличное от 1:)? uin32_t* или почему размер 32 битного инта резделить на размер 32 битного инта тоже должно давать что-то кроме 1? uin32_t Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rash 0 28 мая, 2015 Опубликовано 28 мая, 2015 · Жалоба всё правильно, что даёт 1, я имел виду, что т.о. не получишь длину таблицы векторов, т.к. можно получить указатель __vector_table, а не определение массива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 28 мая, 2015 Опубликовано 28 мая, 2015 · Жалоба Спасибо всем. результат таков: 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 байта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться