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

 
 
> Глюк в WinAVR
Guest_Serg79_*
сообщение Sep 25 2006, 06:51
Сообщение #1





Guests






Есть такой макрос:
Код
#define load_val(val)           \
    {                           \
        __asm__ __volatile__    \
        (                       \
            "ldi r16,%0 \n\t"   \
            : "M" (val)         \
        );                      \
    }

Если вызываю так:
Код
load_val(0x23);

Все ОК!
Если так:
Код
load_val(0xFF);

выдает: ../test.c:414: warning: asm operand 0 probably doesn't match constraints
Хотя для "M" определен диапозон от 0 до 255.

В чем заморочка подскажите?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
def461
сообщение Sep 25 2006, 07:18
Сообщение #2





Группа: Новичок
Сообщений: 12
Регистрация: 8-11-05
Пользователь №: 10 610



Подсказываю: в том,что функция ожидает ЗНАКОВЫЙ операнд.
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Sep 25 2006, 07:30
Сообщение #3





Guests






Цитата(def461 @ Sep 25 2006, 11:18) *
Подсказываю: в том,что функция ожидает ЗНАКОВЫЙ операнд.

На счет знакового это не понятно. В доке написанно следующее:
Цитата
8-bit integer constant

Хотя проверил и действительно, все что больше 0x7F вызывает ошибку.
Значит получается не 8-битное а 7-битное значение?

Как же мне все таки подсунуть ему значения с установленным 8 разрядом?
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Sep 25 2006, 10:42
Сообщение #4





Guests






Решил проблему следующим способом:
Код
#define test(val)                                  \
    {                                              \
        __asm__ __volatile__                       \
        (                                          \
            "ldi r26,%0 \n\t"                      \
            "ldi r27,%1 \n\t"                      \
            :: "M" ((uint16_t)(val & 0xFF)),       \
               "M" ((uint16_t)(val >> 8))          \
        );                                         \
    }

И на это ушел считай весь день.

Теперь такое работает:
Код
test(0xFAFF)


Самые сложные "asm" вставки в GCC, но разобравшись с этим вопросом познаещ их силу.
Go to the top of the page
 
+Quote Post

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

 


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


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