aaarrr 69 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба Судя по стартовому посту темы, вопрос касался оптимизации кода, т.е. стремления избавиться от операции 8-кратного сдвига, который МК обычно не умеют делать одной инструкцией. А то и вызывают на этом месте библиотечную функцию, которая осуществялет сдвиги в цикле со счетчиком. На 8? В 21-м веке? Со счетчиком? Не верю. Здесь union располагает в одной и той же памяти 2 байта byte и одно слово word, тем самым, позвояяя заполнить последнее по частям. Во-первых, громоздко; во-вторых, что будем с эндианизьмом делать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба Вот это, как раз, большинство 8-разрядных МК делают одной командой с легкостью, так как 16-битные регистры образуются из пар 8-битных, и такой сдвиг оптимизируется в пересылку сразу в нужный регистр. Всё это лишь надежда на то, что компилятор при оптимизации исправит наш дурацкий код. :) Но тогда зачем такой код писать? Тогда как через union оно так красиво записывается, что глаз не оторвать! :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба Во-первых, громоздко; во-вторых, что будем с эндианизьмом делать? А что, большие индейцы разве не вымерли? В 21 веке только мелкие как правило попадаются...Или нет? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба В 21 веке только мелкие как правило попадаются...Или нет? У Вас есть роутер? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба Но тогда зачем такой код писать? Если переменная находится именно в памяти, а не проходит процесс обработки, и не возвращается функцией, то такой код вполне оправдан... А иначе - наоборот, вреден, так как вынудит компилятор сначала записать в память, а потом из нее взять в регистры. PS А union мне не нравится, не люблю лишние сущности. Напрямую оно понятнее, так как сразу все видно и понятно, без заглядывания в описание юниона. Главное язык программирования знать, чтобы не смотреть на эту запись, как ТС в начале темы. PPS А с эндианизьмом - #ifdef .... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба У Вас есть роутер? Нет, у меня нет роутера. Что это такое? :) Вы намекаете, что MIPS имеет big endian? Не знал... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба что MIPS имеет big endian? Не знал... А еще многие имеют программируемый endian. Например TI C6000, да и АРМы тоже не все little, особенно из кортексов-А Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба Господа программисты, особенно начинающие, обратите серьезное внимание на решение от Ксении. Хватит уже думать на уровне инструкций, переходите на уровень управления данными! 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 и все! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба union и struct позволяют сделать код в разы "читабельней" и "управляемей". Сильно поспорю. Читаемее то, для прочтения чего не надо искать хидер, где описан юнион, читать и разбирать этот хидер, и возвращаться к исходнику с использованием юнита (а без этого подумается, что тут просто запись в структуру, не юнион). Прямое средство запутывания следов. А прямая запись по указателю, как раз, сразу читается, без поиска концов по хидерам. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба Прямое средство запутывания следов. Соглашусь полностью. Запутывание и загромождение. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 9 марта, 2014 Опубликовано 9 марта, 2014 (изменено) · Жалоба Уважаемые форумчане, перестаньте в присутствии новичка ругаться непонятными терминами и спорить . Вопроса про оптимизацию кода я не ставил, как я уже писал, места мне вполне хватает. Я просил объяснить кусок кода и мне таки его объяснили. Возник вопрос о правильности применения того или иного типа переменной и функции и мне опять таки вежливо и подробно все объяснили. За что всем огромное спасибо. Что касается Хватит уже думать на уровне инструкций, переходите на уровень управления данными!Вы извините, я не программист и не собираюсь им становиться, это просто увлечение на уровне не особо сложных полезных поделок с простенькими МК. Так что не спорьте между собой что лучше и как лучше, просто по возможности объясняйте таким новичкам как я что нам не понятно и мы будем вам очень благодарны :a14: Изменено 9 марта, 2014 пользователем RW6MKA Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 9 марта, 2014 Опубликовано 9 марта, 2014 · Жалоба Не обращайте внимания, день сегодня такой... выходной. Вот народ и спорит от скуки :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться