artemkad 49 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Никто не подскажет как можно в IAR заставить работать с 24 битными переменными? Что-то типа short long PIC-овского компилятора... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 1 марта, 2017 Опубликовано 1 марта, 2017 (изменено) · Жалоба Если без знака то char long24_mem_area[4]; // 24-битное число расположено в [1][2][3] long24_mem_area[0] = 0; unsigned long MyLong32 = * (long *) &long24_mem_area[0]; (только выравнивание должно быть правильным) если знаковое - то надо выполнить операцию расширения знакового разряда 24-битного целого в старшие и знаковый разряд 32-разрядного. Могу ошибится, см. операции с числами в дополнительном коде. Изменено 1 марта, 2017 пользователем k155la3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 49 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Если без знака то char long24_mem_area[4]; // 24-битное число расположено в [1][2][3] long24_mem_area[0] = 0; unsigned long MyLong32 = * (long *) &long24_mem_area[0]; (только выравнивание должно быть правильным) Не, как работать с 24 битными числами я в курсе. Но мне хотелось-бы в структуре в памяти разместить рядом четыре 24-битных числа без дырок в памяти. Там еще параллельно на эту структуру накладывается в union массив и парочка других структур. ЗЫ. Ну по факту мне там нужны 12-битные переменные, но если в структуре можно будет иметь 24-битный контейнер, разделить его на 12 бит без дырок в памяти проблем особых не составит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Но мне хотелось-бы в структуре в памяти разместить рядом четыре 24-битных числа без дырок в памяти. Там еще параллельно на эту структуру накладывается в union массив и парочка других структур. Экзотика какая-то. Не видно простых и беззаботных способов такое сделать. Следовательно, память выделять как массив uint8_t, потом данные упаковывать и распаковывать по мере надобности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Можно попробовать так, но я бы не стал так делать, т.к. по индексу не сошлешься и выравнивание отсутствует. typedef struct t_24b { union { struct { DWORD d0:24; DWORD none0d:8; BYTE none0b[8]; }; struct { BYTE none1n[3]; DWORD d1:24; DWORD none1d:8; BYTE none1b[5]; }; struct { BYTE none2n[6]; DWORD d2:24; DWORD none2d:8; BYTE none2b[2]; }; struct { BYTE none3n[8]; DWORD none3d:8; DWORD d3:24; }; }; } __attribute((packed)) t_24b; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба . . . . Ну по факту мне там нужны 12-битные переменные, но если в структуре можно будет иметь 24-битный контейнер, разделить его на 12 бит без дырок в памяти проблем особых не составит. Единственное, из-за чего стоит с этим заморачиваться - битовые поля итп, экономия одного байта - жесткое (жестокое) ограничение по RAM-FLASH. или огромное кол-во этих данных. Нескромный вопрос. Какая цель такой упаковки ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 49 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Нескромный вопрос. Какая цель такой упаковки ? Принимаю пачку данных, укладываю их в массив, а потом этот массив рассматриваю как набор полей, причем в зависимости от содержимого и режима приема там разный набор полей. Пока поля были кратны 8-ке или укладывались по границе байта/слова/двойного_слова все было более-менее, но тут захотелось "побаловаться" с помехоустойчивым кодированием.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Но мне хотелось-бы в структуре в памяти разместить рядом четыре 24-битных числа без дырок в памяти. __packed struct u24 { unsigned char m[3]; }; u24 someArray[4]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Пока поля были кратны 8-ке или укладывались по границе байта/слова/двойного_слова все было более-менее, но тут захотелось "побаловаться" с помехоустойчивым кодированием.... Понятно, цель - работать с числами в raw-принятом массиве, без копирования / присваивания с приведением типов. Если задача повысить за счет этого скорость обработки - то надо писать на ASM оптимизированные для этого ф-ии. IMHO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба __packed struct u24 { unsigned char m[3]; }; u24 someArray[4]; int x = someArray[0]; // :) :) :) упаковать и обозвать можно всяко, но работать нельзя :(. Но если контроллер поддерживает big-endian, то можно исхитриться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 49 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба __packed struct u24 { unsigned char m[3]; }; u24 someArray[4]; Попробовал, но почему-то обругалось: Error[Pe077]: this declaration has no storage class or type specifier Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба int x = someArray[0]; // :) :) :) упаковать и обозвать можно всяко, но работать нельзя :(. Ясен пень нужно ещё определить методы доступа. Не всё же за ТС делать, сам должен догадаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Попробовал, но почему-то обругалось: Error[Pe077]: this declaration has no storage class or type specifier struct u24 someArray[4]; В режиме C++ слово struct можно не писать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Попробовал, но почему-то обругалось: Error[Pe077]: this declaration has no storage class or type specifier На что? struct u24 someArray[4]; В режиме C++ слово struct можно не писать. Хммм... сто лет уже не создавал *.c файлов, только *.cpp... Вроде не раздел для начинающих - думал пишущие сюда должны знать основы.... :twak: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 49 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба На что? На "__packed struct" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться