Цитата
● R0-R3, R12
● Return address
● PSR
● LR
● Return address
● PSR
● LR
Добавление __attribute__((__interrupt__)) (как я смог понять из кода) добавляет выравнивание стека на 8. В этом нет необходимости - обработка прерывания процессором это обеспечивает независимо от требования на выравнивание.
А что обеспечивает сохранение остальных регистров? Или эти регистры в gcc 4.7.2 в случае их использования в вычислениях сохраняются автоматически?
Сейчас при невнимательном тестировании на первый взгляд всё работает и без __attribute__((__interrupt__)).
В документе http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gc...tion-Attributes написано только то, что я и понял - на Cortex Mx только выравнивает стэк:
Цитата
On ARMv7-M the interrupt type is ignored, and the attribute means the function may be called with a word aligned stack pointer.
В start-up никаких изменений режима работы процессора не делается.
CODE
static void ResetException( void )
{
uint32_t * pSrc, * pDest ;
/* Low level Initialize */
arm_cpu_initialize(); // watchdog disable, clock initialize
/* Initialize the relocate segment */
pSrc = & _sidata;
pDest = & __data_start;
if ( pSrc != pDest )
{
// compiled for FLASH
for ( ; pDest < & __data_end ; )
{
*pDest++ = *pSrc++ ;
}
}
// Следить, чтобы переменные не оказались в стеке, очищаемом сейчас.
// Для этого, например, использована секция noinit
/* Clear the zero segment */
for ( pDest = & __bss_start; pDest < & __bss_end; )
{
* pDest ++ = 0;
}
/* Branch to main function */
main();
/* Infinite loop */
for (;;)
;
}
{
uint32_t * pSrc, * pDest ;
/* Low level Initialize */
arm_cpu_initialize(); // watchdog disable, clock initialize
/* Initialize the relocate segment */
pSrc = & _sidata;
pDest = & __data_start;
if ( pSrc != pDest )
{
// compiled for FLASH
for ( ; pDest < & __data_end ; )
{
*pDest++ = *pSrc++ ;
}
}
// Следить, чтобы переменные не оказались в стеке, очищаемом сейчас.
// Для этого, например, использована секция noinit
/* Clear the zero segment */
for ( pDest = & __bss_start; pDest < & __bss_end; )
{
* pDest ++ = 0;
}
/* Branch to main function */
main();
/* Infinite loop */
for (;;)
;
}