[an error occurred while processing this directive]
|
Убил субботу, ночь и полсегодня в поисках кривизны. Нашел откуда рога растут - функция разворачивания пролога в /gcc/config/arm/arm.c:arm_expand_prologue, поправил, пересобрал, эпилог начал генерится правильно(???) c оптимизацией О1,O2,О3,Оs. компиллер gcc 4.1.2-20060930. Вот результат:
-О0 (без оптимизации):
void uartISR(void)__attribute__ (( interrupt("IRQ")));
void uartISR(void)
{
E52DC004 str r12, [sp, #-0x004]!
E1A0C00D mov r12, sp
E92DD80F stmfd sp!, {r0-r3, r11-r12, lr-pc}
E24CB004 sub r11, r12, #0x00000004
E24DD008 sub sp, sp, #0x00000008
//-----целевой код прерывания(конец пролога)-----------
portBASE_TYPE Tmp = U0IIR;
E3A03903 mov r3, #0x01800000
E283328E add r3, r3, #0x80000023
E5D33000 ldrb r3, [r3]
............................................
VICVectAddr = 0;
E3A03000 mov r3, #0x00000000
E2433EFD sub r3, r3, #0x03f40000
E3A02000 mov r2, #0x00000000
E5832000 str r2, [r3]
}
//-----целевой код прерывания(начало эпилога)-----------
E24BD01C sub sp, r11, #0x0000001c
E89D680F ldmfd sp, {r0-r3, r11, sp-lr}
E8BD1000 ldmfd sp!, {r12}
E25EF004 subs pc, lr, #0x00000004
оптимизация -О1...Оs:
void uartISR(void)__attribute__ (( interrupt("IRQ")));
void uartISR(void)
{
{
E92D500F stmfd sp!, {r0-r3, r12, lr}
//-----целевой код прерывания(конец пролога)-----------
portBASE_TYPE Tmp = U0IIR;
E3A0320E mov r3, #0x80000003
E2832903 add r2, r3, #0x01800000
E5D23008 ldrb r3, [r2, #+0x008]
.....................................
VICVectAddr = 0;
E3A02000 mov r2, #0x00000000
E3E03000 mvn r3, #0x00000000
E5032FCF str r2, [r3, #-0xfcf]
}
//-----целевой код прерывания(начало эпилога)-----------
E8BD500F ldmfd sp!, {r0-r3, r12, lr}
E25EF004 subs pc, lr, #0x00000004
В последнем листе приведен для -O1, поскольку при других оптимизациях компиллеров изменялся только целевой код, то приведен только один лист - эпилог и пролог при всех отличгых от -O0 одинаковы.
Завтра или сегодня выложу поправленую сборку (дома интернет сдох, пишу через мобильник). Непроверял при заходе в irq/fiq из THUMB и выходе внего. Прошу проверить. Нужно вобще потестировать.
Лично у меня проект завелся на всех оптимизациях(раньше ессесенго все работало только без оптимизации). Проект состоящий из 4задач FreeRTOS + 20кб всякого разношерстного кода работы с переферией. Работает не жужит. Дмаю что еслиб где былаб ошибочка то хрен работалоб - куча стеков, heap, и тд - все динамически дышит - и не падает уже минут 40. микросхемка lpc2103 Но! я ваще тумб не пользую - нада проверять.
Еще вопрос. При выходе из irq/frq возврат на прерванную команду - subs pc, lr, #0x00000004. А вот при DAbort всетаки на две команды нада отматывать(по моему разумению изза того что это исключение в v4t происходить через одну команду если возникла ошибка озу). Посему нада в пепилоге subs pc, lr, #0x00000008 применять. Сейчас для всех исключений кроме SWI все едино. Делать -8 в аборте или нет? Как считает?