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

 
 
 
Reply to this topicStart new topic
> WinAVR2009 : inline functions, замечаю странности...
_Pasha
сообщение Dec 24 2009, 10:50
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Привет всем!
Давно замечаю неадекватности при работе с инлайнами типа
Код
#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. Не могу понять, какие настройки его сводят с ума. Если кто сталкивается с подобным - отпишитесь в эту тему для сбора инфы. Спасибо.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 24 2009, 10:55
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(_Pasha @ Dec 24 2009, 13:50) *
return (PINB & (1<<SomePin))? 1:0;

Похоже, пытается наложить маску непосредственно на PINB (интересно, получается? Он вроде read-only)
А без инлайна что делает?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 24 2009, 11:15
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(MrYuran @ Dec 24 2009, 13:55) *
А без инлайна что делает?

Да ну его... без инлайна неинтересно. В общем, я покопаюсь во всех случаях чтения инлайном. Может, все-таки ключи типа -mint8 и прочие хаки имеют побочный эффект...
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 24 2009, 11:35
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(_Pasha @ Dec 24 2009, 13:50) *
Недавно - выдал какую-то чушь с чтением
Какой инструкцией было осуществлено чтение? LDS? Если да, то значит регистр в Extended I\O, и такой код - единственный способ выполнить проверку\модификацию бита в нём.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 24 2009, 12:07
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(SysRq @ Dec 24 2009, 14:35) *
Какой инструкцией было осуществлено чтение? LDS?

Нет. in Пока наблюдал косяки - не выходил за пределы меги 8/48. Касается только инлайнов по работе с портами. Остальное пока что неинтересно. Кстати, при замене инлайна на #define f() все становилось нормально
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 24 2009, 13:36
Сообщение #6


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Выкладывайте код.
Без кода можно потеоретизировать об -O0, переменных вместо констант в (x << y), и т.п., но это ни к чему не преведёт.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:14
Рейтинг@Mail.ru


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