Цитата(SlavaCh @ Dec 26 2006, 12:45)

1. Как работать с прерываниями? Достаточно описать ф-цию __irq __arm void f(void) , при выходе из которой надо сбросить регистр EIOCR, или необходимо делать еще какое-то описание по адресу 0х18?, ну и соотв настроить AIC.
(В случае со стартапом - я объявляю функцию прерывания просто void, без __irq __arm, так как в стартапе есть асм код, который делает все сам)
тут есть два подхода (точнее, считая и Ваш с Cstartupом, три):
1) на место вектора исключения при помощи асм-файла ставится команда безусловного перехода по адресу AIC_IVR:
Код
CODE32
COMMON INTVEC:CODE:ROOT
org 0x00000018
LDR PC, AT91C_AIC_IVR
END
в С вы объявляете каждый обработчик с атрибутами __arm __irq. Это заставляет компилятор генерить отдельный пролог/эпилог для каждого обработчика, что конечно требует дополнительной памяти кода, но позволяет компилятору сгенерить пролог/эпилог максимально эффективно под конкретный обработчик (сохранять только нужные регистры), а вам индивидуально разрешать в отдельных обработчиках вложенные прерывания:
Код
__irq __arm void IRQ_Handler1() {
.............
AT91C_BASE_AIC->AIC_EOICR = 0;
}
__irq __arm __nested void IRQ_Handler2() {
.............
AT91C_BASE_AIC->AIC_EOICR = 0;
}
2) Делается одна функция-обработчик в которой делается сохранение/восстановление регистров и из этой функции вызываются обработчики, которые представляют из себя обычные функции. Функция-обработчик "подвешивается" на вектор исключения стандартными средствами компилятора:
Код
#pragma vector = 0x0000018
__irq __arm void IRQ_Switch() {
(void (*)(void))(AT91C_BASE_AIC->AT91C_AIC_IVR)();
AT91C_BASE_AIC->AIC_EOICR = 0;
}
void Handler1() {
...........
}
void Handler2() {
...........
}
3) Ваш третий метод по сути тот же второй только на асме. Он получается чуть эффективнее чем вариант 2 на С, но мне больше всего нравится первый вариант.
Цитата(SlavaCh @ Dec 26 2006, 12:45)

2. В вашем описании нет выбора библиотеки, но при создании нового проекта во вкладке
Project -> Options -> General Options -> Library configuration по умолчанию стоит Normal. Это можно оставить , или нужно поменять?
Все, что не описано можно оставить как есть. Менять нужно лишь в том случае, если вы четко понимаете что вы меняете и что вам это действительно нужно менять.
Цитата(SlavaCh @ Dec 26 2006, 12:45)

3. Как описывать обработчики исключений - data abort, и др?
Учитывая, что спец. ключевых слов в описании компилятора (во всяком случае в версии 4.30) нет, то судя по всему только на асме. Ну в крайнем случае пролог/эпилог на асме и вызов основного обработчика, который уже на С. Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах.
Цитата(Dopler @ Dec 26 2006, 09:03)

Цитата(Сергей Борщ @ Dec 25 2006, 15:55)

Спасибо, более-менее все работает, даже получилось создать проект без использования runtime библиотек, т.е. добавил весь необходимый минимальный код в проект. Буду теперь разбираться по шагам.
Всем большое спасибо.
Библиотеку все же желательно подключить. Из нее берется CStartup(если нет своего в проекте), из нее же берутся некоторые функции которые вы явно не вызываете (например у AVR конструкция switch при определенных условиях использует библиотечные функции, сдвиги на несколько битов). Что используется в ARM навскидку не скажу, но можно при помощи xlib распечатать список модулей библиотеки и поразмышлять над их названием. Нет смысла не подключать библиотеку. У IAR замечательный линкер, и ни одного лишнего (неиспользуемого) байта из библиотеки в проект не попадет.