Страница 4 из 4
Re: Вопросы по языку СИ
Добавлено: Вт июн 24, 2014 15:14:59
slavokhire5
А как располагаются в контроллерах с 32 битной архитектурой массивы 8 битных элементов? каждый элемент массива занимает одну 32битную ячейку, или в каждой ячейке по 4 элемента?
Re: Вопросы по языку СИ
Добавлено: Вт июн 24, 2014 15:53:04
ibiza11
Если без выравнивания то 32 бита, с выравниванием 8 бит. Для этого есть атрибут __attribute__((__packed__)) (GCC) или __packed(IAR) (зависит от компилятора)
При его использовании структура выравнивается по 1 байту, без него - по 4 байта
Re: Вопросы по языку СИ
Добавлено: Вт июн 24, 2014 17:59:04
optima
И не думал ничего выравнивать, просто создал массив с нужной разрядностью const uint8_t moimassiv[] и сколько байт задал столько в программе и заняло места! ну ни как не по четыре байта!
Re: Вопросы по языку СИ
Добавлено: Вт июн 24, 2014 18:06:56
ibiza11

я про структуры...
slavokhire5, прошу прощения. Где-то тут структуры обсуждали, вот я и ответил про них...
Re: Вопросы по языку СИ
Добавлено: Вт июн 24, 2014 21:40:46
titoFF
Аж как- то неудобно задавать такой вопрос, но в гугле ответа не нашел, а желание узнать зашкаливает. Что значит оператор "->" ? Сколько авр программирую- не сталкивался, а в арм вижу повсеместно.
Re: Вопросы по языку СИ
Добавлено: Вт июн 24, 2014 21:50:22
Аlex
Обращение к члену структуры(класса) через указатель.
Re: Вопросы по языку СИ
Добавлено: Ср июн 25, 2014 08:45:03
Pavel_1978
Народ, подскажите как в массив, для передачи по UART , запихать несколько переменных float, char, и int? Поясняю - необходимо данные с GPS преобразованные из ASCII в выше указанные форматы передать через UART.
Re: Вопросы по языку СИ
Добавлено: Ср июн 25, 2014 09:08:48
dosikus
А передать в том же виде что принял с GPS, и парсить на конечном устройстве ?
Re: Вопросы по языку СИ
Добавлено: Ср июн 25, 2014 09:15:56
urry
Леша, может хочет сделать пакет короче - имеет право.
через юнионы
union
{
struct
{
uint8_t c;//1
uint16_t i;//2
float f;//4
}
uint8_t arr[7];
}un;
но обязательно, как писал предыдущий докладчик, включить выравнивание по байту и потом еще раз проверить в отладчике, что оно там заняло, а то внезапно юнион может занять вместо 7 - 10 байт. Очень популярные грабли.
Сам вчера 2 часа времени убил, почему кс не бьет с отправленной .

Re: Вопросы по языку СИ
Добавлено: Ср июн 25, 2014 09:18:47
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 и длину пакета.
выравнивание структуры нужно применять на обоих устройствах, либо не применять вовсе, но тогда результат не гарантирован.
Re: Вопросы по языку СИ
Добавлено: Ср июн 25, 2014 09:34:55
dosikus
urry писал(а):Леша, может хочет сделать пакет короче - имеет право.
Ну да , ктож запретит велосипеды изобретать.
Того что в сети навалено видимо недостаточно . Я имею ввиду форматы пакетов ...
Re: Вопросы по языку СИ
Добавлено: Ср июн 25, 2014 09:43:43
Аlex
urry писал(а):может хочет сделать пакет короче - имеет право
Ну и пусть вырезает необходимое и передаёт.
Для чего эта куча преобразований туда-сюда...

Re: Вопросы по языку СИ
Добавлено: Ср июн 25, 2014 09:53:32
slavokhire5
ibiza11 , спасибо, про структуры тоже было полезно. я думал, что они по умолчанию занимают минимально возможное место. А сколько займут места в памяти отдельные переменные типа uint8_t и другие?

Re: Вопросы по языку СИ
Добавлено: Ср июн 25, 2014 13:41:09
optima
Сколько объявишь столько и займут! uint8_t один байт...
Re: Вопросы по языку СИ
Добавлено: Чт июн 26, 2014 10:53:15
Pavel_1978
Аlex писал(а):urry писал(а):может хочет сделать пакет короче - имеет право
Ну и пусть вырезает необходимое и передаёт.
Да в том то и дело что нужно сократить число байт, в чистом ASCII размер пакета получается в два раза больше, зато передфвать без проблем, просто используя функции для строк....
И разработчик сервера просит чтобы данные в НЕХе приходили
Re: Вопросы по языку СИ
Добавлено: Чт июн 26, 2014 11:08:33
Аlex
Ну тогда через union, наверное, будет самый простой и верный способ.
Можно, конечно, это всё через указатели замутить, но результат на выходе будет такой-же, и с ними чуток посложнее будет.
Re: Вопросы по языку СИ
Добавлено: Чт июн 26, 2014 11:10:51
ibiza11
+1, только обязательно надо проверить, что данные правильно приходят на сервер. А то знаете-ли BigEndian, LittleEndian... MSB, LSB....
Re: Вопросы по языку СИ
Добавлено: Чт июн 26, 2014 11:43:15
Pavel_1978
Это понятно и будет реализовано прицепление контрольной суммы в конец пакета. По которой сервер будет проверять валидность.
Блин у меня голова уже пухнет, спасибо за пинок в нужную сторону , пойду грызть этот union