Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR2009 : inline functions
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
_Pasha
Привет всем!
Давно замечаю неадекватности при работе с инлайнами типа
Код
#define SomePin 5
static inline void pin_out(const uint8_t val) __attribute__((always_inline));
void pin_out(const uint8_t val)
{
if(val) PORTB |=(1<<SomePin); else PORTB &=~(1<<SomePin);
}

static inline uint8_t pin_in(void) __attribute__((always_inline));
uint8_t pin_in(void)
{
  return (PINB & (1<<SomePin))? 1:0;
}


Если с первой функцией все однозначно и красиво переводится, то со второй время от времени происходят чудеса. Сейчас пишу - pin_in() транслируется в sbis PINB,SomePin. Недавно - выдал какую-то чушь с чтением, наложением маски и проверкой на нуль и еще чего-то mov. Не могу понять, какие настройки его сводят с ума. Если кто сталкивается с подобным - отпишитесь в эту тему для сбора инфы. Спасибо.
MrYuran
Цитата(_Pasha @ Dec 24 2009, 13:50) *
return (PINB & (1<<SomePin))? 1:0;

Похоже, пытается наложить маску непосредственно на PINB (интересно, получается? Он вроде read-only)
А без инлайна что делает?
_Pasha
Цитата(MrYuran @ Dec 24 2009, 13:55) *
А без инлайна что делает?

Да ну его... без инлайна неинтересно. В общем, я покопаюсь во всех случаях чтения инлайном. Может, все-таки ключи типа -mint8 и прочие хаки имеют побочный эффект...
SysRq
Цитата(_Pasha @ Dec 24 2009, 13:50) *
Недавно - выдал какую-то чушь с чтением
Какой инструкцией было осуществлено чтение? LDS? Если да, то значит регистр в Extended I\O, и такой код - единственный способ выполнить проверку\модификацию бита в нём.
_Pasha
Цитата(SysRq @ Dec 24 2009, 14:35) *
Какой инструкцией было осуществлено чтение? LDS?

Нет. in Пока наблюдал косяки - не выходил за пределы меги 8/48. Касается только инлайнов по работе с портами. Остальное пока что неинтересно. Кстати, при замене инлайна на #define f() все становилось нормально
SysRq
Выкладывайте код.
Без кода можно потеоретизировать об -O0, переменных вместо констант в (x << y), и т.п., но это ни к чему не преведёт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.