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

 
 
 
Reply to this topicStart new topic
> тупой вопрос по WINAVR
_Pasha
сообщение Jun 20 2008, 18:18
Сообщение #1


;
******

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



Доброго времени!

Пишу:
Код
extern volatile uint16_t time;
uint16_t get_time(void)
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
  {
   return(time);
  }
}


gcc 4.2.2 Компилер генерит идеально:

Код
00000208 <get_time>:
208:    2f b7           in    r18, 0x3f; 63
20a:    f8 94           cli
20c:    80 91 b6 00     lds    r24, 0x00B6
210:    90 91 b7 00     lds    r25, 0x00B7
214:    2f bf           out    0x3f, r18; 63
216:    08 95           ret


Вопрос к гуру: насколько такая немного дураковатая конструкция портабельна?
Go to the top of the page
 
+Quote Post
sKWO
сообщение Jun 21 2008, 07:57
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(_Pasha @ Jun 20 2008, 22:18) *
насколько такая немного дураковатая конструкция портабельна?

А чё именно смущает?


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 21 2008, 11:08
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



А где определения ATOMIC_BLOCK и ATOMIC_RESTORESTATE?

Я для запрещения прерываний на некотором участке кода обычно создаю объект специального класса:

/* тут прерывания разрешены */
{
Locker l;
/* тут прерывания запрещены */
}

Запрещением и разрешением прерываний занимаются конструктор и деструктор Locker. Портабильность довольно высокая - для портирования на другую платформу меняется только класс Locker.

Сообщение отредактировал alx2 - Jun 21 2008, 11:23


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jun 21 2008, 12:04
Сообщение #4


;
******

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



Цитата(sKWO @ Jun 21 2008, 10:57) *
А чё именно смущает?


Смущает использование return внутри for(), коим ATOMIC_BLOCK и является.

Цитата(alx2 @ Jun 21 2008, 14:08) *
Запрещением и разрешением прерываний занимаются конструктор и деструктор Locker.


Логично. Еще один плюс плюсов.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 21 2008, 16:51
Сообщение #5


Гуру
******

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



Цитата(_Pasha @ Jun 21 2008, 15:04) *
Смущает использование return внутри for(), коим ATOMIC_BLOCK и является.
"Альтернатива - утки!" Аналогичная функциональность без for(). А вот return внутри цикла без плюсов (конструктора/деструктора) - действительно подводный камень. Лишняя временная переменная и ее return после цикла не должны влиять на качество кода, а портабельность увеличат.


--------------------
На любой вопрос даю любой ответ
"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

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

 


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


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