|
C+ASM - помогите, Не понимаю, чего ему не нравится |
|
|
|
Mar 5 2008, 05:45
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Всем приветы! Ткскзть двое суток без сна, не могу победить простую вещь. Имеется IAR 4.41, пытаюсь сделать ассемблерную вставку, не выходит: Код static inline portDISABLE_INTERRUPTS(void) { asm (" STMDB SP!, {R0}"); asm (" MRS R0, CPSR"); asm (" ORR R0,R0,#0x80"); asm (" MSR CPSR,R0"); asm (" LDMIA SP!, {R0}"); } В ответ получаю Код Error[Og006]: Syntax error in inline assembly: "Error[401]: Operand syntax error" c:\PTJoy\new\firmware\ptjoy\FreeRTOS\Source\portable\IAR\SAM7S256\portmacro.h 93 Error[Og006]: Syntax error in inline assembly: "Error[401]: Operand syntax error" c:\PTJoy\new\firmware\ptjoy\FreeRTOS\Source\portable\IAR\SAM7S256\portmacro.h 94 Error[Og006]: Syntax error in inline assembly: "Error[401]: Operand syntax error" c:\PTJoy\new\firmware\ptjoy\FreeRTOS\Source\portable\IAR\SAM7S256\portmacro.h 95 По-хорошему, нужно делать #define'ом, но там то-же самое, только без номеров строк Ткните пожалуйста, что я делаю не так. Процессор - ARM7. Спасибо!
|
|
|
|
|
 |
Ответов
|
Mar 5 2008, 07:35
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
более правильный код для запрещения прерываний на АРМ такой: Код do { __set_CPSR(StatusReg | (1<<7)); } while (!(__get_CPSR() & (1<<7)));
--------------------
Пасу котов...
|
|
|
|
|
Mar 5 2008, 10:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Andy Mozzhevilov @ Mar 5 2008, 09:35)  более правильный код для запрещения прерываний на АРМ такой: Еще более оптимальный такой (исправлен): Код while (!(__get_CPSR() & (1<<7))) { __set_CPSR(StatusReg | (1<<7)); } Цитата(Andy Mozzhevilov @ Mar 5 2008, 10:15)  Не могу сейчас быстро найти соответсвующий раздел документации. Atmel Application Note Rev. 1156A-08/98Цитата(Kitsok @ Mar 5 2008, 09:54)  Дык у меня thumb, а __?et_CPSR - intrinsic, поэтому, видимо, все функции, вызывающие такой запрет нужно компилять с __intrinsic. Доступ к CPSR имеют только команды ARM-режима (MSR, MRS). Из THUMB режима могут быть вызваны ARM-функции, скомпилированные с атрибутом __interwork. __intrinsic - ключевое слово для функций, реализованных внутри компилятора (для которых компилятор генерит код сам в процессе компиляции) и не должно использоваться для пользовательских функций. Генерируемый для __intrinsic - функций код может отличаться в зависимости от аргументов, режима компиляции и кучи других параметров. Для той же __disable_interrupt() в ARM-режиме генерится непосредственно MSR, MCR, а в THUMB-режиме - вызов соответствующей ARM-функции.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 5 2008, 11:33
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Вот на этом while'е оно и встанет  Точка с запятой там явно лишняя. Да, __intrinsic перепутал естественно с __interwork. Вроде работает, спасибо! Начинаем битву с FIQ, но это уже тема совсем другого топика
|
|
|
|
|
Mar 5 2008, 12:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Kitsok @ Mar 5 2008, 13:33)  Вот на этом while'е оно и встанет  Точка с запятой там явно лишняя. Угу. Делал быстро из кода Andy, упустил. Цитата(repairDV @ Mar 5 2008, 14:35)  А этот ассемблер, который внутри процедуры Си, полнофункциональный? Условные - безусловные переходы на метки поддерживает? Нет. Это даже не ассемблер, а так, некий костыль чтобы вставить NOP. Даже в документации написано что-то вроде "ну есть нечто похожее на ассемблер, но лучше и не пытайтесь его использовать  ". В этом смысле инлайн-ассемблер GCC - просто произведение искусства.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Kitsok C+ASM - помогите Mar 5 2008, 05:45 tag Код asm (" MRS R0, CPSR");
asm ... Mar 5 2008, 06:31 Kitsok Цитата(tag @ Mar 5 2008, 09:31) В этих ко... Mar 5 2008, 06:46 IgorKossak Ассемблерную строку надо заканчивать символом ... Mar 5 2008, 07:05 Kitsok Цитата(IgorKossak @ Mar 5 2008, 10:05) Ас... Mar 5 2008, 07:08  Andy Mozzhevilov Цитата(Kitsok @ Mar 5 2008, 12:08) Ошибки... Mar 5 2008, 07:15 IgorKossak Взял Вашу функцию один к одному, скомпилировал, ни... Mar 5 2008, 07:21 Kitsok Цитата(IgorKossak @ Mar 5 2008, 10:21) Вз... Mar 5 2008, 07:31 Kitsok Цитата(Andy Mozzhevilov @ Mar 5 2008, 10... Mar 5 2008, 07:54 Andy Mozzhevilov Не могу сейчас быстро найти соответсвующий раздел ... Mar 5 2008, 08:15 repairDV А этот ассемблер, который внутри процедуры Си, пол... Mar 5 2008, 12:35 GetSmart Цитата(Сергей Борщ)Цитата(repairDV @ Mar 5 2008 ... Mar 5 2008, 14:04 repairDV Цитата(GetSmart @ Mar 6 2008, 00:04) Стра... Mar 5 2008, 14:15 Сергей Борщ Цитата(GetSmart @ Mar 5 2008, 16:04) Нет.... Mar 5 2008, 15:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|