Битовые:
Данные:
Однобайтовые типы данных:
принимают любые, возвращают 0 или 1
если принят не 0, то вернётся 1
Целочисленные значения или символы
от -128 до 127
Беззнаковые целочисленные значения
от 0 до 255
Двухбайтовые типы данных:
от -32’768 до 32’767
В Arduino Due, тип int идентичен типу long
Беззнаковые целочисленные значения
от 0 до 65’535
В Arduino Due, тип unsigned int идентичен типу unsigned long
Четырёхбайтовые типы данных:
от -2’147’483’648 до 2’147’483’647
Беззнаковые целочисленные значения
от 0 до 4’294’967’295
Числа с плавающей точкой
от -2’147’483’648,0 до 2’147’483’647,0
Восьмибайтовые типы данных:
Числа с плавающей точкой удвоенной точности
от -9’223’372’036’854’775’808,0 до 9’223’372’036’854’775’807,0
Тип double действует как тип float, кроме Arduino Due
от -9’223’372’036’854’775’808 до 9’223’372’036’854’775’807
Беззнаковые целочисленные значения
от 0 до 18’446’744’073’709’551’615
Типы данных с определяемым размером
Нет принимаемых или возвращаемых значений
Массив A указанного размера, с элементами указанного типа
Массив А указанного типа, без прямого указания размера
Двумерный массив А указанного типа и размера
Двумерный массив А указанного типа, без прямого указания размера
Массив или строка, состоящая из указанного кол-ва символов
Массив или строка, без прямого указания количества символов
Преобразование числовых типов:
Приводит значение A к указанному типу.
Приводит результат A+B к указанному типу.
Сначала приводит A и B , к указанному типу, а потом вычисляет результат A+B .
Приводит указатель A к указанному типу указателя.
Спецификаторы памяти:
(указываются перед типом)
Объявление переменной в виде константы, её можно читать, но нельзя менять, т.к. она хранится в области flash памяти.
Объявление переменной, значение которой может быть изменено без явного использования оператора присвоения =. Используются для работы с прерываниями.
Объявление локальной переменной, значение которой не теряется, между вызовами функции. Если переменная объявлена глобально (вне функций), то её нельзя подключить в другом файле.
Объявление глобальной переменной, которая определена во внешнем файле.
Объявление локальной переменной, значение которой требуется хранить в регистрах процессора, а не в ОЗУ, для обеспечения ускоренного доступа.
Значения некоторых констант:
Ложь, используются вместо 0
Истина, используется вместо 1
Низкий уровень
Высокий уровень
Конфигурация вывода как вход
Конфигурация вывода как выход
Конфигурация вывода как вход с подтяжкой
Передача младшим битом вперёд
Передача старшим битом вперёд
Тактовая частота Arduino в Гц
Число Пи
Половина числа Пи
Два числа Пи
Число Эйлера
Префиксы:
Запись числа в 2ой системе ( 0b 10101)
Запись числа в 2ой системе ( B 10101)
Запись числа в 8ой системе ( 0 12345)
Запись числа в 16ой системе ( 0x 1234A)
Модификаторы:
Число типа long (12345 L )
Число типа long lond (12345 LL )
Число беззнакового типа (12345 U )
Комбинация модификаторов (12345 UL )
Показатель экспоненты (3 E -5 = 3•10-5)
Переменные, массивы, объекты, указатели, ссылки, . :
Это указание имени и типа переменной.
int A; // объявление переменной А
Это выделение памяти под переменную.
A =1; // определение ранее объявленной A
Действуют постоянно, в любом месте кода.
Создаются внутри функций, циклов и т.д.
удаляются из памяти при выходе из них.
Указывается в одинарных кавычках.
char A=’ Z ‘; // присвоение символа «Z»
Указывается в двойных кавычках.
String A=» Z «; // присвоение строки «XY»
Это переменная с указанием класса, вместо типа, через объект можно обращаться к методам класса
Ссылка, это альтернативное имя переменной, она возвращает значение переменной, на которую ссылается.
int A=5; // создана переменная A = 5
int & C=A; // создана ссылка C на переменную A
A++; C++; // в результате A=7 и C=7
// Ссылку нельзя переопределить: &C=Z;
Указатель, это переменная, значением которой является адрес.
int * Y1=&A; // указателю Y1, передан адрес переменной A
int ( * Y2)(int)=F; // указателю Y2, передан адрес функции F
B=Y1; // получаем адрес переменной A из указателя Y1
B= * Y1; // получаем значение A разыменовывая указатель
// Указатель можно переопределять: Y1=&Z;
Создание альтернативного имени для типа
typedef bool dbl; // создаём свой тип «dbl», как тип bool
dbl A=1; // создаём переменную A типа bool
Это переменная состоящая из нескольких однотипных элементов, доступ к значениям которых осуществляется по их индексу.
int A[5]; // объявлен массив A из 5 элементов типа int
int A[2]=<7,9>; // объявлен и определён массив A из 2 эл-тов
char A[ ]=»Hi»; // создана строка A, как массив символов
Это объединение нескольких переменных под одним именем.
struct < int A=5; float B=3; >C; // создана структура «С»
int D = C.A; // получаем значение переменной A структуры С
int Z = C.A; // присваиваем Z значение A структуры С
Значения некоторых констант:
Ложь, используются вместо 0
Истина, используется вместо 1
Arduino.ru
Битовые операции, как правильно?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
То есть операцией & 0xF0 устанавливаем биты с 3 по 0 в 0, потом сдвигаем биты 7-4 на позицию 3-0 и получем результат в byte level от 0 до 15.
Я так понимаю в этом случе просто произойдет сдвиг вправо, и биты 3-0 заместатся битами 7-4? Не будет ли каких либо проблем?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Более правильно — не использовать лишних команд.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Можно наложить маску в виде структуры и тогда не нужны «магические цифры» (3, 4, . ). Так более правильно, так как будут использоваться именованные поля, что проще в сопровождении.
По возможности нужно всегда избавляться от цифр, которые ни к чему явно не привязаны и не описаны, т.к. они делают трудной последующую отладку.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
uni, Вы всерьез считаете, что при сдвиге на полбайта будет понятнее, если вместо «4» применить именованную константу?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Я считать лучше использовать комментарий
И все. И не важно какого цвета кошка . Главное что бы она ловила мышей. А для тех кто сомнивается , то написать комментарий:»Это кошка. Она ловит тут мышей.»
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Спасибо за ответы, главное всетаки было убедится что в моем случае сдвига достаточно.
Да как вариант можно именовать переменные, например чтобы было созвучно даташиту на чип, ноя думаю это актиально если пишешь библиотеку не только для себя, так сказать соблюдения правил «хорошего тона».
В моем случае будет достаточно подробного комментирвоания кода.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Когда есть описание битовых полей, то нужно использовать структуру, в которой задать имена для этих битовых полей. Определить тип в виде этой структуры, создать указатель на структуру и присвоить ему значение указателя на буфер данных. Вот тогда у вас будут именованные поля в естественном виде без всяких ручных никому не нужных сдвигов. Сдвигами должен заниматься компилятор.
Точно так же делают, когда работают с заголовочниками bmp или wav файлов.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Дайте ссылку на используемый datasheet и я покажу как это обычно делается.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Дайте ссылку на используемый datasheet и я покажу как это обычно делается.
За пример использования буду признателен.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Спасибо отгромное, выглядит классно.
Я правильно понимаю что конструкция выше говорит о том что следующие за ней данные пишутся в новый байт?
И могу ли я использовать структуру так? То есть почему PTEA5767HN_READDATA определяется как сылка а TEA5767HN_READDATA нет?
А структуру обязательно объявлять как глобальную?
У меня беда в том что делаю под управлением NANO на ATmega168 радиоприемник, памяти всего килобайт, выбрасывать ее жалко.
Пока прикрутил только экран на ssd1306 и начал прикручивать радио на tea5767, еще на очереди esp8266.
Поэтому на счету каждый байт :-)
Попробую сегодня сделать со структурой, посмотрю что с памятью будет.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Можно использовать только указатель PTEA5767HN_READDATA pData , переменную TEA5767HN_READDATA я указал для примера. Описание типа PTEA5767HN_READDATA обычно указывают глобально, а сами переменные этого типа могут объявлятся где угодно.
Да, можно, так и было задумано. Вы как-бы накладываете описание структуры на буфер с данными и через это описание обращаетесь к нужным вам полям в этом буфере. При этом не нужно думать о самих битовых полях в буфере, компилятор разберётся, используя описание структуры.
> То есть почему PTEA5767HN_READDATA определяется как сылка а TEA5767HN_READDATA нет?
Просто пример использования и переменной, и указателя. Специально объявлять переменную не нужно. Иногда бывает удобным хранить данные в виде переменной с таким типом. Можно ведь сделать и обратную операцию. Создать такую переменную и наложить на неё маску в виде указателя на массив байт. Тогда можно обращаться к каждому отдельному байту структуры по этому указателю.
В более сложных случаях struct совмещают с union, чтобы можно было обращаться к одной и той же области памяти как к целому объекту или как к набору полей.
В данном случае — да, это делитель на байты, но в общем случае компилятор считает сколько битов использовалось до делителя и делает выравнивание на целое число байт (я не проверял, но должно быть что-то вроде этого).
Arduino.ru
Битовый массив
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
По следам давних выступлений ЕвгенияП
Взял класс битового массива, описанный Евгением вот тут
Если кратко — это структура, содержащая упакованное битовое поле, для которой перегружен оператор индекса [] позволяющий обращатся к битовому полю как к массиву.
Немного переделал под свои нужды — упаковал в байты по 4 двух-битных значения, убрал шаблон. В принципе все получилось и работает. Но у меня в программе подобных массивов будет много, как локальных, так и глобальных. Поэтому хотелось бы создавать и удалять эти массивы динамически, чтобы иметь возможность конктролировать размер доступной памяти.
Пытаюсь переделать пример Евгения для работы с динамической памятью, написал два рабочих варианта, но оба мне не нравятся.
вроде все ОК, но при попытке создать обьект оператором new к массиву байт приходится обращаться по ссылке, что полностью обесценивает всю изящность решения с перегрузкой оператора:
другой вариант — создать динамический массив для бит прямо внутри обьекта:
этот вариант тоже рабочий, но эта структура получается не совсем динамическая, да и совершенно впустую расходуется лишние 2 байта на указатель anArray
В чем вопрос. как бы к усам Иван Иваныча приставить бакенбарды Николая Платоныча. то есть типа совместить достоинства двух вариантов. Не могу понять, как создавать такую структуру динамически, не теряя возможности использовать перегруженный индекс напрямую.
Arduino.ru
DetSimen и битовые поля
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всё-таки в С я плаваю. И не просто плаваю, а плаваю как утяжеленный топор без ручки с привареным урановым ломом.
В одном праэктике есть структура с битовыми полями, один из байтиков которой описан как
enum-ы описаны как
всё компилируеца, канеш, но анажды, что-то подсказало мне включить warning-и при компиляции. Теперь битовые поля, описанные как bool, и даже enumHSLI вопросов не вызывает, а на enumSearchStopLevel канпилятор ругаеца от так
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
enum-ы описаны как
конечно too smal — ты ж enum описал размером в uint8_t
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
конечно too smal — ты ж enum описал размером в uint8_t
дак а по другому не опишешь, или опишешь? Тогда как?
если написать , допустим
то все будет намайно, без ошибок, значения будуть 0-15, хотя тип тоже описан как целый байт
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Поискал в СтекОверфлоу — пишут. что эта проблема решения не имеет?
«in C it is an undefined behavior, because a bit-field can only have signed int or unsigned int or bool types»
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Для того, чтобы тебе правильно вписаться в структуру, нужен enum в 2 бита. Но размерность enum может задаваться только базовыми типами, самый маленький из которых — 8 бит.
Так что или enum на 8 бит или 2 бита и дефайны.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Дед, во многих знаниях, много печали. Вот будь на Вашем месте кто-то, действительно плохо знающий язык (а не прибедняющийся, как Вы), у него бы не было проблем потому, что он не стал бы делать типизированный enum, а для нетипизированного этой проблемы не возникает от слова совсем — компилятор сам разбирается с его размером.
Никаких предупреждений — всё пучком. Результат
Так что всё правильно работает.
Причем, заметьте (это важно!) компилятор именно разбирается, а не просто «плюёт на возможную ошибку»! В этом легко убедиться — достаточно в строке 2 перед «>» добавить, например, «, EvenStronger=4». После этого двухбитовое поле реально окажется маленьким и сообщение, о котором Вы говорили, появится вновь. Так что он реально смотрит и предупреждает.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Спасибо за науку.
Просто чем хорош типизированный enum, тем, что его константы имеют область видимости, ограниченную внутри самого enum-а. Т.е два или три или больше enum-ов в одном файле могут иметь одинаково поименованные константы внутри себя, что в обычных enum-ах, нетипизированных, вопщем-та, не допускаеца (но это не точно). Обращение, конечно, к типизированному enum-у приходится писать дольше, зато перепутать константы, относящиеся к разным enum-ам нельзя.
В кристально чесном С, которого полно у Onkel-я, я этого не помню, памойму это уже позднее благоприобретение, слизанное с Шарпа. Но вот почему бы не сделать еще шажок, чтоб срастить эту удобную канструкцию с битовыми полями. Ну это я так, ворчу.
В любом случае, спасибо ЕвгенийП, информацию я впитал. :) Буду воспринимать это как данность, правда, с горестным недоумением. (и штозаязыктакой, и кто его только придумал, и где сечас эти люди? ну и по традиции, наданапица)