[an error occurred while processing this directive]
GCC и прерывания в C коде, __attribute__ ((interrupt ("IRQ"))) и ГЛЮКИ с эпилого/прологом при -O1...-Os. Неспал ночь но ПАРВАЛ gcc. вроде Бобик заработал :)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено klen 08 октября 2006 г. 18:39

Убил субботу, ночь и полсегодня в поисках кривизны. Нашел откуда рога растут - функция разворачивания пролога в /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 в аборте или нет? Как считает?

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание