|
Что означает этот код? |
|
|
|
Mar 9 2014, 10:46
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Xenia @ Mar 9 2014, 14:34)  Судя по стартовому посту темы, вопрос касался оптимизации кода, т.е. стремления избавиться от операции 8-кратного сдвига, который МК обычно не умеют делать одной инструкцией. А то и вызывают на этом месте библиотечную функцию, которая осуществялет сдвиги в цикле со счетчиком. На 8? В 21-м веке? Со счетчиком? Не верю. Цитата(Xenia @ Mar 9 2014, 14:34)  Здесь union располагает в одной и той же памяти 2 байта byte и одно слово word, тем самым, позвояяя заполнить последнее по частям. Во-первых, громоздко; во-вторых, что будем с эндианизьмом делать?
|
|
|
|
|
Mar 9 2014, 11:07
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Xenia @ Mar 9 2014, 14:49)  Но тогда зачем такой код писать? Если переменная находится именно в памяти, а не проходит процесс обработки, и не возвращается функцией, то такой код вполне оправдан... А иначе - наоборот, вреден, так как вынудит компилятор сначала записать в память, а потом из нее взять в регистры. PS А union мне не нравится, не люблю лишние сущности. Напрямую оно понятнее, так как сразу все видно и понятно, без заглядывания в описание юниона. Главное язык программирования знать, чтобы не смотреть на эту запись, как ТС в начале темы. PPS А с эндианизьмом - #ifdef ....
|
|
|
|
|
Mar 9 2014, 11:21
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Господа программисты, особенно начинающие, обратите серьезное внимание на решение от Ксении. Хватит уже думать на уровне инструкций, переходите на уровень управления данными! 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 и все!
|
|
|
|
|
Mar 9 2014, 11:26
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(adnega @ Mar 9 2014, 15:21)  union и struct позволяют сделать код в разы "читабельней" и "управляемей". Сильно поспорю. Читаемее то, для прочтения чего не надо искать хидер, где описан юнион, читать и разбирать этот хидер, и возвращаться к исходнику с использованием юнита (а без этого подумается, что тут просто запись в структуру, не юнион). Прямое средство запутывания следов. А прямая запись по указателю, как раз, сразу читается, без поиска концов по хидерам.
|
|
|
|
|
Mar 9 2014, 12:21
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Уважаемые форумчане, перестаньте в присутствии новичка ругаться непонятными терминами и спорить  . Вопроса про оптимизацию кода я не ставил, как я уже писал, места мне вполне хватает. Я просил объяснить кусок кода и мне таки его объяснили. Возник вопрос о правильности применения того или иного типа переменной и функции и мне опять таки вежливо и подробно все объяснили. За что всем огромное спасибо. Что касается Цитата Хватит уже думать на уровне инструкций, переходите на уровень управления данными! Вы извините, я не программист и не собираюсь им становиться, это просто увлечение на уровне не особо сложных полезных поделок с простенькими МК. Так что не спорьте между собой что лучше и как лучше, просто по возможности объясняйте таким новичкам как я что нам не понятно и мы будем вам очень благодарны
Сообщение отредактировал RW6MKA - Mar 9 2014, 12:21
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|