Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: uVision 4 VS uVision 3 - Синтаксис
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
_shef_
Доброго времени суток.
Я недавно начал изучать АРМ. Прочитал Мартина. Скачал Evaluation Keil uVision 4.00u.
И вот результат. Некоторые вещи я не могу использовать, а точнее не знаю как.

Например:

void MyFunction (void) __irq; - работает
void MyFunction (void) __fiq; - компилятор не удовлетворяется такой записью

void MyFunction (void) __task; - тоже проблема, гуглил код ошибки - попал на сайт Keil'а. Там написано, что теперь модно писать так:
__task void MyFunction (void); ну или что то вроде этого. Так вот такойо вариант тоже не проходит.

Плюс мелкие брызги типа:
EXTERN CODE32 (myFunction?A) пришлось урезать до IMPORT myFunction

Есть где-то справка по этому компилятору? Может я плохо искал?
igorsk
Placing ARM function qualifiers
__irq
Насколько я в курсе, порядок вызова FIQ ничем не отличается от IRQ, так что можно использовать тот же самый атрибут __irq.
Про __task нашел старую доку:
Цитата
The __task attribute affects the generated code of the function as follows:
The function does not include a prolog or an epilog. Therefore, it is not possible to call the function from other routines. Instead, the Real-Time Operating System must save and restore all CPU register context.

Честно говоря слабо представляю, зачем такое может понадобиться, но думаю, что отсутствие этого атрибута вряд ли что-то сломает.
_shef_
Цитата(igorsk @ Apr 24 2010, 04:15) *
Placing ARM function qualifiers
__irq
Насколько я в курсе, порядок вызова FIQ ничем не отличается от IRQ, так что можно использовать тот же самый атрибут __irq.
Про __task нашел старую доку:

Честно говоря слабо представляю, зачем такое может понадобиться, но думаю, что отсутствие этого атрибута вряд ли что-то сломает.


Так то оно так. Только в случае __irq компилятор вставляет сохранение контекста в стеке, а быстрое прерывание имеет свои плюсы - R8-R12 заменяются аппаратно и их вполне может хватить для обработки прерывание. Т.е. операции сохранения и восстановления контекста компилятор может и не воткнуть как в первом случае. Я думаю разница только в этом.

По поводу __task:
К сожалению я строю свою ОС. И в процессе этого строительства изучаю АРМ. Я много уже выслушал на свой счет, но МНЕ ТАК УДОБНО.
Когда я дошел до того момента, когда мои функции становятся потоками - я нуждаюсь в таком атрибуте как __task.
На данный момент я использую такой метод:

pTmpContext->RegistrLR = ((unsigned int) Routine) + 4;

И этими четырьмя байтами обхожу ту самую преамбулу. Но я не могу гарантировать, что эта преамбула будет состоять всегда только из одной команды.
Поэтому __task - было бы не плохо иметь в арсенале.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.