Просто о структурах и объединениях в Си


Какие задачи нам позволяют решать структуры и объединения?

Для разработчика встроенных систем эффективность и компактность кода всегда на первом месте. Если программировании на Ассемблере ты сам определяешь как и где располагаются данные, то при программировании на Си надо позаботиться, что бы объяснить компилятору как ты хочешь, что бы данные были расположены. Для чего это надо, в первую очередь, для удобства обработки и обращения к данным.

Например, мне необходимо, чтобы данные были расположены последовательно в памяти. Для этого я опишу структуру, например:

Это будет гарантировано, что данные в памяти будут расположены последовательно и займут 9 байт (если система процессора микроконтроллера 8 битная) или 6 слов (если 16 битная). Один дополнительный байт будут занимать две переменные описанные как Accident и Freezing, они займут соответственно 0 – 1 байт (Accident )  и 2 байт (Freezing).

Обратиться т.е записывать данные и читать можно таким образом, например:

Со структурами struct все довольно понятно,  это расположение данных последовательно в памяти и удобный доступ к ним, особенно, если надо писать какие-то флаги управления и потом данные “скопом” передавать через какой либо интерфейс на другое устройство. Но часто возникает необходимость например иметь представление одних и тех же данных и в виде байта (или слова) и в виде бит. Как это сделать, для этого в Си есть гибкий механизм объединения union.

Например, для передачи данных через последовательный порт нам необходимо иметь доступ к данным ка к байту, а для эффективности управления флагами управления содержащимся в этом байте, и меть доступ как к биту. Вот такой фокус и позволяют делать объединения. Еще раз структуры последовательно располагать данные в памяти, объединения описывать одни и те же данные разными именами и при этом разными типа данными.

Например, мы имеем структуру данных:

Визуально это выглядит так:

Вся структура занимает 4 байта. EE.s_CLt занимает 2 байта, EE.s_SEc занимает 1 байта, переменные Accident, Freezing (два и и один байт) будут размещены в 4 байте.

Теперь нам, например, необходимо работать с битами переменной s_CLt, можно конечно использовать операциями с битами, например, нам надо контролировать состояние бита 0 в этой переменной мы, можем вычислить так, выполняем побитовое “&” с переменной и в зависимости от состояния операции выполняет если true или falce:

Но можно каждому биту присвоить свое имя, это улучшает понимание программы и не рисвоать, что нарисовано выше например писать просто так:

Где EE.FLED1 мы дали имя биту 0 переменной EE.s_CLt, как это сделать? В нашу структуру надо внедрить объединение. Структуры и объединения можно как угодно комбинировать для всевозможного описания данных в памяти для удобной последующей обработки. В нашем варианте это будет выглядеть так:

Переменную s_CLt мы помещаем, в обеднение в котором находиться эта переменная и новая внутренняя структура. Название ни объединению, ни структуре мы не даем. В этом варианте мы сможет обращаясь, например, к EE.FLED1 контролируя или изменяя состояние бита 0 переменной EE.s_CLt.

Как это выглядит визуально.

Еще раз к пониманию структур, это возможность “объяснения” компилятору, что данные надо расположить в памяти последовательно. А к пониманию объединений, что данные одни и те же могут иметь разное название. Надеюсь я смог “на пальцах” объяснить эти гибкие особенности Си.

И для окончания, например, мне необходимо обработать эти 4 байка как одно 32 битное слово, как это сделать? Это сделать просто если нашу структур поместить в объединение и добавит в ней нашу 32 битную переменную:

Теперь при необходимости можно обратиться к переменной EE.s_32bit и получить все данные или изменить одной операцией.

Визуально это можно представить так:


Файлы для загрузки

Значок

Просто о структурах и объединениях в Си 343.32 KB 165 downloads

Проект с примером организации данных ...


Это может быть интересно

  • Светодиоды со встроенным драйвером WS2812BСветодиоды со встроенным драйвером WS2812B
    Производитель http://www.world-semi.com Краткое описание продукции фирмы Каталог продукции” catcatcat_ws_19 catcatcat_ws_15 catcatcat_ws_11 catcatcat_ws_07 catcatcat_ws_03 catcatcat_ws_18 catcatcat_ws_14 catcatcat_ws_10 catcatcat_ws_06 catcatcat_ws_02 catcatcat_ws_05 catcatcat_ws_09 catcatcat_ws_13 catcatcat_ws_17 catcatcat_ws_16 catcatcat_ws_12 catcatcat_ws_08 catcatcat_ws_04 catcatcat_ws_01 This jQuery slider was …
  • LCD индикаторы на драйвере ML1001LCD индикаторы на драйвере ML1001
     ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. Описание драйвера  …
  • Arduino LCD + STONE STVI056WT-01 + Strain gaugeArduino LCD + STONE STVI056WT-01 + Strain gauge
    Author li grey email: greyli1987@outlook.com The strain assessment instrument is used to assess the degree of corresponding muscle strain by obtaining the muscle surface action potential through silver oxide electrodes …
  • APA102 – светодиоды со встроенным драйвером и SPI интерфейсомAPA102 – светодиоды со встроенным драйвером и SPI интерфейсом
    APA102 В 2014 году фирма Shenzhen Led Color Optoelectronic Co., Ltd http://www.szledcolor.com/ начала производство светодиодов на драйвере APA102. Это серия так называемых светодиодов со встроенным драйвером. Основной особенностью этих светодиодов, что …
  • LATINO – открытый проект ch-светомузыкиLATINO – открытый проект ch-светомузыки
      Проект построенный на некоторых принципах ch-светомузыка. Проект ознакомительный предназначен, для самостоятельного построения простого и эффективного светосинтезатора. Вывод осуществляется на ВОУ собранной на драйверах HL1606. Для этого была применена светодиодная …
  • Самый простой индикатор уровня звукового сигналаСамый простой индикатор уровня звукового сигнала
    Демонстрационный проект создания индикаторов уровня с использованием WS2812B. Изучив этот проект вы сможете  самостоятельно изготавливать и конструировать свои индикаторы уровня звукового сигнала. Дополнительно читайте статью Бегущие огни на WS2812B по подключению …
  • Счетчики посетителейСчетчики посетителей
    Вас сосчитали!? или счетчики посетителей.   Для чего нужны счетчики посетителей? Какие они бывают? ТОРГОВЛЯ. Подсчитайте, сколько ваш магазин посещает человек за день. Кок много человек приходит утром, какое количество вечером. …
  • MAX7219/21 и 8х8 LED дисплеиMAX7219/21 и 8х8 LED дисплеи
    MAX7219, MAX7221 предназначены для вывода информации на 8 разрядов семисегментного индикатора, но на нем легко организовать вывод на светодиодные индикаторы 8х8. продолжение следует…. Это может быть интересно Метки:MAX7219, MAX7221
  • VU Meter Tower ART – part 2VU Meter Tower ART – part 2
    Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, позволяющие улучшить …
  • Проект с использованием MCC часть 16Проект с использованием MCC часть 16
    Продолжим изучение EUSART. На этом этапе отработает передачи данных с ПК и получения эха. Для этого в основной цикл программы добавим код [crayon-61e913625c4e9853306488/] Суть его проста постоянно в главном цикле …


 

Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.