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

 
 
> Что означает этот код?
RW6MKA
сообщение Mar 8 2014, 15:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Здравствуйте уважаемые форумчане. Возник вопрос при оптимизации кода. Было
Код

                data[0] = w1_receive_byte();//читаем два байта с температурой
        data[1] = w1_receive_byte();
            //загоняем в двух байтную переменную
        temp = data[1];
        temp = temp<<8;
        temp |= data[0];

Подсказали что лучше использовать такое выражение
Код
        *((char *)&Temp;) = w1_receive_byte();
        *((char *)&Temp; + 1) = w1_receive_byte();

Вот никак не могу понять смысла этого кода. Я так понимаю что * и & это операции над указателями , а () приведение к типу но....
Вообщем если не трудно объясните начинающему подробно смысл сей конструкции.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Mar 9 2014, 10:34
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Судя по стартовому посту темы, вопрос касался оптимизации кода, т.е. стремления избавиться от операции 8-кратного сдвига, который МК обычно не умеют делать одной инструкцией. А то и вызывают на этом месте библиотечную функцию, которая осуществляет сдвиги в цикле со счетчиком. Тогда как ответы в общем-то сводятся к тому, как этот сдвиг красивше записать. Т.е. в плане оптимизации эти ответы не только бесполезны, но и уже негативно проявили себя по части всевозможных ошибок при реализации.

В этом плане выражение
Код
*(char *)&Temp = TD_receive_byte();
*((char *)&Temp + 1) = TD_receive_byte();
было вполне оптимальным, с тем лишь недостатком, что оказалось непонятным топикстартеру. Т.е. его и надо было просто разъяснить, но не возвращаться к сдвигу.

На этот счет могу предложить альтернативу с union, которая в максимальной степени оптимальна, но гораздо проще в понимании:
Код
uint16_t temp_18b20()
{
  union {
    unsigned char byte[2];
    uint16_t word;
  } temp;

  ...
  temp.byte[1] = TD_receive_byte();
  temp.byte[0] = TD_receive_byte();
   ...
  return temp.word;
}

Здесь union располагает в одной и той же памяти 2 байта byte и одно слово word, тем самым, позволяя заполнить последнее по частям.
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 9 2014, 10:41
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Xenia @ Mar 9 2014, 14:34) *
т.е. стремления избавиться от операции 8-кратного сдвига, который МК обычно не умеют делать одной инструкцией.

Вот это, как раз, большинство 8-разрядных МК делают одной командой с легкостью, так как 16-битные регистры образуются из пар 8-битных, и такой сдвиг оптимизируется в пересылку сразу в нужный регистр.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 9 2014, 10:49
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(SM @ Mar 9 2014, 14:41) *
Вот это, как раз, большинство 8-разрядных МК делают одной командой с легкостью, так как 16-битные регистры образуются из пар 8-битных, и такой сдвиг оптимизируется в пересылку сразу в нужный регистр.


Всё это лишь надежда на то, что компилятор при оптимизации исправит наш дурацкий код. sm.gif Но тогда зачем такой код писать? Тогда как через union оно так красиво записывается, что глаз не оторвать! sm.gif
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 9 2014, 11:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Xenia @ Mar 9 2014, 14:49) *
Но тогда зачем такой код писать?

Если переменная находится именно в памяти, а не проходит процесс обработки, и не возвращается функцией, то такой код вполне оправдан... А иначе - наоборот, вреден, так как вынудит компилятор сначала записать в память, а потом из нее взять в регистры.

PS
А union мне не нравится, не люблю лишние сущности. Напрямую оно понятнее, так как сразу все видно и понятно, без заглядывания в описание юниона. Главное язык программирования знать, чтобы не смотреть на эту запись, как ТС в начале темы.

PPS
А с эндианизьмом - #ifdef ....
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- RW6MKA   Что означает этот код?   Mar 8 2014, 15:05
- - _Артём_   Цитата(RW6MKA @ Mar 8 2014, 19:05) Код *...   Mar 8 2014, 15:15
- - RW6MKA   А более подробно можно. Конкретно по каждому знаку...   Mar 8 2014, 15:29
|- - _Артём_   Цитата(RW6MKA @ Mar 8 2014, 19:29) А боле...   Mar 8 2014, 15:37
|- - RW6MKA   Цитата(_Артём_ @ Mar 8 2014, 19:37) Берёт...   Mar 8 2014, 15:58
|- - Harvester   Цитата(RW6MKA @ Mar 8 2014, 19:58) Вот эт...   Mar 8 2014, 16:25
|- - RW6MKA   Цитата(Harvester @ Mar 8 2014, 20:25) Ука...   Mar 9 2014, 03:47
|- - aaarrr   Цитата(RW6MKA @ Mar 9 2014, 07:47) То ест...   Mar 9 2014, 04:09
|- - RW6MKA   Цитата(aaarrr @ Mar 9 2014, 08:09) По при...   Mar 9 2014, 07:11
- - aaarrr   Цитата(RW6MKA @ Mar 8 2014, 19:05) Подска...   Mar 8 2014, 15:36
- - RW6MKA   Ну вроде экономия памяти при компиляции. Можно кон...   Mar 8 2014, 15:54
- - aaarrr   * - указатель Без лишней памяти лучше будет напис...   Mar 8 2014, 15:57
- - Harvester   Ужас какой-то. Это как раз тот случай, когда досто...   Mar 8 2014, 16:01
|- - SSerge   Цитата(Harvester @ Mar 8 2014, 23:01) Ужа...   Mar 8 2014, 16:33
- - aaarrr   Цитата(RW6MKA @ Mar 8 2014, 19:58) Вот эт...   Mar 8 2014, 16:02
|- - RW6MKA   Цитата(aaarrr @ Mar 8 2014, 20:02) Есть т...   Mar 8 2014, 16:13
- - aaarrr   Обычно из таких - низкоуровневых - функций данные ...   Mar 9 2014, 07:30
|- - RW6MKA   Цитата(aaarrr @ Mar 9 2014, 11:30) Обычно...   Mar 9 2014, 08:20
|- - aaarrr   Цитата(RW6MKA @ Mar 9 2014, 12:20) Какой ...   Mar 9 2014, 08:28
|- - SM   Цитата(RW6MKA @ Mar 9 2014, 12:20) от -4...   Mar 9 2014, 08:32
- - RW6MKA   Во общем из советов я прихожу к выводу, что float ...   Mar 9 2014, 08:56
- - aaarrr   Могут. На 8-16 битных архитектурах ничем не отлича...   Mar 9 2014, 09:13
- - RW6MKA   Понятно. Тогда с учетом того, что я пишу код в AVR...   Mar 9 2014, 09:35
- - aaarrr   Правильнее будет int16_t, а не uint - результат ве...   Mar 9 2014, 09:38
|- - SM   Цитата(aaarrr @ Mar 9 2014, 13:38) Правил...   Mar 9 2014, 09:44
|- - RW6MKA   Цитата(aaarrr @ Mar 9 2014, 13:38) Правил...   Mar 9 2014, 09:48
|- - aaarrr   Цитата(RW6MKA @ Mar 9 2014, 13:48) Нет, з...   Mar 9 2014, 10:06
|- - RW6MKA   Цитата(aaarrr @ Mar 9 2014, 14:06) Но есл...   Mar 9 2014, 10:15
|- - aaarrr   Цитата(Xenia @ Mar 9 2014, 14:34) Судя по...   Mar 9 2014, 10:46
|- - _Артём_   Цитата(aaarrr @ Mar 9 2014, 14:46) Во-пер...   Mar 9 2014, 10:50
|- - aaarrr   Цитата(_Артём_ @ Mar 9 2014, 14:50) В 21 ...   Mar 9 2014, 10:58
|- - _Артём_   Цитата(aaarrr @ Mar 9 2014, 14:58) У Вас ...   Mar 9 2014, 11:08
|- - SM   Цитата(_Артём_ @ Mar 9 2014, 15:08) что M...   Mar 9 2014, 11:11
- - adnega   Господа программисты, особенно начинающие, обратит...   Mar 9 2014, 11:21
|- - SM   Цитата(adnega @ Mar 9 2014, 15:21) union ...   Mar 9 2014, 11:26
|- - aaarrr   Цитата(SM @ Mar 9 2014, 15:26) Прямое сре...   Mar 9 2014, 11:30
- - RW6MKA   Уважаемые форумчане, перестаньте в присутствии нов...   Mar 9 2014, 12:21
- - aaarrr   Не обращайте внимания, день сегодня такой... выход...   Mar 9 2014, 12:26


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

 


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


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