Вопросы по языку СИ

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

А как располагаются в контроллерах с 32 битной архитектурой массивы 8 битных элементов? каждый элемент массива занимает одну 32битную ячейку, или в каждой ячейке по 4 элемента?
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Если без выравнивания то 32 бита, с выравниванием 8 бит. Для этого есть атрибут __attribute__((__packed__)) (GCC) или __packed(IAR) (зависит от компилятора)
При его использовании структура выравнивается по 1 байту, без него - по 4 байта
Ставим плюсы: )
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Сообщение optima »

И не думал ничего выравнивать, просто создал массив с нужной разрядностью const uint8_t moimassiv[] и сколько байт задал столько в программе и заняло места! ну ни как не по четыре байта!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

:facepalm: я про структуры... slavokhire5, прошу прощения. Где-то тут структуры обсуждали, вот я и ответил про них...
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 100
Зарегистрирован: Пт авг 02, 2013 07:20:04

Сообщение titoFF »

Аж как- то неудобно задавать такой вопрос, но в гугле ответа не нашел, а желание узнать зашкаливает. Что значит оператор "->" ? Сколько авр программирую- не сталкивался, а в арм вижу повсеместно.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Обращение к члену структуры(класса) через указатель.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

Народ, подскажите как в массив, для передачи по UART , запихать несколько переменных float, char, и int? Поясняю - необходимо данные с GPS преобразованные из ASCII в выше указанные форматы передать через UART.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

А передать в том же виде что принял с GPS, и парсить на конечном устройстве ?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Леша, может хочет сделать пакет короче - имеет право.

через юнионы
union
{
struct
{
uint8_t c;//1
uint16_t i;//2
float f;//4
}
uint8_t arr[7];
}un;

но обязательно, как писал предыдущий докладчик, включить выравнивание по байту и потом еще раз проверить в отладчике, что оно там заняло, а то внезапно юнион может занять вместо 7 - 10 байт. Очень популярные грабли.
Сам вчера 2 часа времени убил, почему кс не бьет с отправленной .
:)
Последний раз редактировалось urry Ср июн 25, 2014 09:22:04, всего редактировалось 1 раз.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Опередили... можно воспользоваться union, с условием соблюдения порядка следования байт.

Код: Выделить всё

union
{
  uint8_t UARTBuf[10];
  __packed struct
  {
    uint16_t a;
    float b;
    uint8_t c;
    uint16_t d;
    uint8_t e;
  }units;
}data;
пример для IAR
можно без union, передавать в функцию передачи указатель на структуру, приведенный к uint8_t и длину пакета.
выравнивание структуры нужно применять на обоих устройствах, либо не применять вовсе, но тогда результат не гарантирован.
Ставим плюсы: )
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

urry писал(а):Леша, может хочет сделать пакет короче - имеет право.
Ну да , ктож запретит велосипеды изобретать.
Того что в сети навалено видимо недостаточно . Я имею ввиду форматы пакетов ...
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

urry писал(а):может хочет сделать пакет короче - имеет право
Ну и пусть вырезает необходимое и передаёт.
Для чего эта куча преобразований туда-сюда... :dont_know:
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

ibiza11 , спасибо, про структуры тоже было полезно. я думал, что они по умолчанию занимают минимально возможное место. А сколько займут места в памяти отдельные переменные типа uint8_t и другие? :)
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Сообщение optima »

Сколько объявишь столько и займут! uint8_t один байт...
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

Аlex писал(а):
urry писал(а):может хочет сделать пакет короче - имеет право
Ну и пусть вырезает необходимое и передаёт.
Да в том то и дело что нужно сократить число байт, в чистом ASCII размер пакета получается в два раза больше, зато передфвать без проблем, просто используя функции для строк....
И разработчик сервера просит чтобы данные в НЕХе приходили
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ну тогда через union, наверное, будет самый простой и верный способ.
Можно, конечно, это всё через указатели замутить, но результат на выходе будет такой-же, и с ними чуток посложнее будет.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

+1, только обязательно надо проверить, что данные правильно приходят на сервер. А то знаете-ли BigEndian, LittleEndian... MSB, LSB....
Ставим плюсы: )
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

Это понятно и будет реализовано прицепление контрольной суммы в конец пакета. По которой сервер будет проверять валидность.
Блин у меня голова уже пухнет, спасибо за пинок в нужную сторону , пойду грызть этот union
Ответить

Вернуться в «ARM»