Перейти к содержанию
    

Что означает этот код?

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

На 8? В 21-м веке? Со счетчиком? Не верю.

 

 

Здесь union располагает в одной и той же памяти 2 байта byte и одно слово word, тем самым, позвояяя заполнить последнее по частям.

Во-первых, громоздко; во-вторых, что будем с эндианизьмом делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот это, как раз, большинство 8-разрядных МК делают одной командой с легкостью, так как 16-битные регистры образуются из пар 8-битных, и такой сдвиг оптимизируется в пересылку сразу в нужный регистр.

 

Всё это лишь надежда на то, что компилятор при оптимизации исправит наш дурацкий код. :) Но тогда зачем такой код писать? Тогда как через union оно так красиво записывается, что глаз не оторвать! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, громоздко; во-вторых, что будем с эндианизьмом делать?

А что, большие индейцы разве не вымерли?

В 21 веке только мелкие как правило попадаются...Или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 21 веке только мелкие как правило попадаются...Или нет?

У Вас есть роутер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но тогда зачем такой код писать?

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

 

PS

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

 

PPS

А с эндианизьмом - #ifdef ....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас есть роутер?

Нет, у меня нет роутера. Что это такое? :)

Вы намекаете, что MIPS имеет big endian? Не знал...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что MIPS имеет big endian? Не знал...

 

А еще многие имеют программируемый endian. Например TI C6000, да и АРМы тоже не все little, особенно из кортексов-А

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа программисты, особенно начинающие, обратите серьезное внимание на решение от Ксении.

Хватит уже думать на уровне инструкций, переходите на уровень управления данными!

union и struct позволяют сделать код в разы "читабельней" и "управляемей".

Завтра вместо DS18B20 возьмете DS1820 и будете по всему коду искать сдвиги и прогие логические операции?!

 

uint16_t temp_18b20()
{
  union {
    unsigned char byte[2];
        uint16_t  word;
      struct
       {
      uint16_t  ds18b20_f:4;
          uint16_t  ds18b20_i:8;
        };
        struct
        {
           uint16_t  ds1820_f:1;
           uint16_t  ds1820_i:8;
        };
        struct
        {
           uint16_t  ds_uni_f:N // ваше число бит для дробной части
           uint16_t  ds_uni_i:8; // целая часть температуры 
        }
  } temp;

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

 

Меняете в одном месте N и все!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

union и struct позволяют сделать код в разы "читабельней" и "управляемей".

 

Сильно поспорю. Читаемее то, для прочтения чего не надо искать хидер, где описан юнион, читать и разбирать этот хидер, и возвращаться к исходнику с использованием юнита (а без этого подумается, что тут просто запись в структуру, не юнион). Прямое средство запутывания следов. А прямая запись по указателю, как раз, сразу читается, без поиска концов по хидерам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прямое средство запутывания следов.

Соглашусь полностью. Запутывание и загромождение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые форумчане, перестаньте в присутствии новичка ругаться непонятными терминами и спорить :biggrin: . Вопроса про оптимизацию кода я не ставил, как я уже писал, места мне вполне хватает. Я просил объяснить кусок кода и мне таки его объяснили. Возник вопрос о правильности применения того или иного типа переменной и функции и мне опять таки вежливо и подробно все объяснили. За что всем огромное спасибо. Что касается

Хватит уже думать на уровне инструкций, переходите на уровень управления данными!
Вы извините, я не программист и не собираюсь им становиться, это просто увлечение на уровне не особо сложных полезных поделок с простенькими МК. Так что не спорьте между собой что лучше и как лучше, просто по возможности объясняйте таким новичкам как я что нам не понятно и мы будем вам очень благодарны :a14:
Изменено пользователем RW6MKA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не обращайте внимания, день сегодня такой... выходной. Вот народ и спорит от скуки :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...