реклама на сайте
подробности

 
 
> C+ASM - помогите, Не понимаю, чего ему не нравится
Kitsok
сообщение Mar 5 2008, 05:45
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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'ом, но там то-же самое, только без номеров строк wink.gif

Ткните пожалуйста, что я делаю не так. Процессор - ARM7.

Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andy Mozzhevilov
сообщение Mar 5 2008, 07:35
Сообщение #2


Знающий
****

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



более правильный код для запрещения прерываний на АРМ такой:
Код
    do
    {
        __set_CPSR(StatusReg | (1<<7));
    }
    while (!(__get_CPSR() & (1<<7)));


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 5 2008, 10:08
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - Kitsok   Вот на этом while'е оно и встанет Точка с зап...   Mar 5 2008, 11:33
|- - Сергей Борщ   Цитата(Kitsok @ Mar 5 2008, 13:33) Вот на...   Mar 5 2008, 12:41
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016