LINUX.ORG.RU

ICCARM и GNUC

 , ,


0

2

Сбсна вопрос платформонезависим, а зависит от компилятора. Был кусок кода в иаре.

#if defined (__ICCARM__)
#define __vectors   __root const uVectorEntry __vector_table[] @ ".intvec"
#define __stack     { .ui32Ptr = (uint32_t)Stack + sizeof(Stack) }
typedef union
{
  void (*Handler)(void);
  uint32_t ui32Ptr;

} uVectorEntry;
#endif

Нужно его переделать для GCC.

Всё что после дефайнов по ходу тоже не зависит от компилятора. Возможно реакции требует только 1 строчка после ифа.

Это startap файл для stm32f103c8t6(Cortex-M3).

UPD

Решение:

#define __vectors void (*const __vector_table[])(void) __attribute__((section(".isr_vector")))

Плюс правильный линкер скрипт, или вообще дефолтный стартап из куба.



Последнее исправление: nikitalol (всего исправлений: 3)

Ну надо найти аналоги этому в GCC https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html

Аналог __root это видимо used.

This attribute, attached to a variable with static storage, means that the variable must be emitted even if it appears that the variable is not referenced.

@ ".intvec" это видимо section ("section-name")

Normally, the compiler places the objects it generates in sections like data and bss. Sometimes, however, you need additional sections, or you need certain particular variables to appear in special sections, for example to map to special hardware. The section attribute specifies that a variable (or function) lives in a particular section.

Ну и этому __vector_table[] наверное надо будет какой-нибудь размер задать, который соответствует таблице векторов прерываний. https://stackoverflow.com/questions/43601735/what-does-intvec-mean-in-the-dec...

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 4)

https://jacobmossberg.se/posts/2018/08/11/run-c-program-bare-metal-on-arm-cor... ну и вот еще ссылка. Там линкер-скрипт нужен, в котором секции описаны, его можно самому написать или взять готовый. В даташите на контроллер должна быть инфа по этому поводу, memory map там

SZT ★★★★★
()
Ответ на: комментарий от nikitalol

Линкер-скрипт от линкера зависит, у iar свой линкер, у которого свой формат скриптов, не такой как в gnu ld.

https://www.iar.com/support/tech-notes/linker/how-do-i-place-a-group-of-funct... - вот там про linker configuration file (.icf) что-то пишут. Я сам с iar не работал, но не думаю что там сильно сложно переделывать все это, да и эти линкер скрипты под используемый тобой контролер для GNU тулчейна наверняка уже готовые где-то есть

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.