В языке Си есть интересная структура union (объединение). С помощью него можно, как ни странно, объединять несколько переменных в одной структуре так, чтобы они занимали общую область данных. Это позволяет использовать отдельные "части" большей по размеру переменной (например, типа int или float) или наоборот, набирать из отдельных байт большую переменную. Пример объединения для переменной для числа с плавающей запятой float, занимающей в памяти 32 бита (4 байта). union my_float { float f; struct { uint8_t byte0, byte1, byte2, byte3; }; }; А теперь покажем, как это использовать на практике. Имеется 12-битный АЦП MAX1241 с интерфейсом SPI. Формат передачи следующий: сперва передается старший байт, потом - оставшиеся 4 байта, сдвинутые на 3 влево. Можно было бы создать просто два отдельных байта, принять по очереди и объединить: unsigned int ADC_read(void){ unsigned int byte0, byte1; NSHDN = 1; // включить АЦП delay_us(5); // пауза 5 мкс для инициали
Использование union в C/C++ на примере АЦП MAX1241
14 июля 202114 июл 2021
139
1 мин