реклама на сайте
подробности

 
 
> iar struct union как указать смещение?
AndryG
сообщение Feb 14 2015, 20:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Имеем, для примера, вот такой тип данных, в котором хотим обеспечить к массиву данных доступ к нужным полям по разному "подходу".

Код
typedef union{
  uint8_t raw[4]; // head, bodyA, bodyB, tail
  struct{
    uint8_t b;
  } body;
  uint8_t bodyA;
  uint8_t tail;
} my_t


Понятно, что всё работает неверно. Вопрос: возможно ли указать полям дополнительно смещение? Если да, то как ?

Совет "расположи поля в объединении в нужном порядке" не предлагать. Это лишь пример для обяъснения проблемы. В моем случае необходимо именно указать смещение.

Единственный вариант вижу в объявлении дополнительным полей-проставок, которые будут смещать на нужное место поля. Но и то сработает не везде.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SSerge
сообщение Feb 15 2015, 20:08
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Код
typedef union{
  uint8_t raw[4]; // head, bodyA, bodyB, tail
  struct{
    uint8_t head;
    uint8_t bodyA;
    uint8_t bodyB;
    uint8_t tail;
  } body;
} my_t;

union делает так, что cтруктура body и массив raw размещаются в одном и том же куске памяти.
поэтому my_t.body.head будет совпадать с my_t.raw[0],
а my_t.body.bodyA будет совпадать с my_t.raw[1]

Но так просто только пока у Вас типы uint8_t, потому что компилятор вообще-то не гарантирует размещение полей структуры разного размера строго друг за другом.
В общем случае придётся прибегнуть к упакованным структурам (#pragma pack(1) для IAR).

Если компилятор понимает анонимные структуры, то можно сделать проще.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AndryG   iar struct union как указать смещение?   Feb 14 2015, 20:10
- - kolobok0   Цитата(AndryG @ Feb 14 2015, 23:10) ...По...   Feb 15 2015, 10:28
- - SSerge   Цитата(AndryG @ Feb 15 2015, 03:10) Вопро...   Feb 15 2015, 10:45
- - megajohn   Цитата(AndryG @ Feb 14 2015, 23:10) Понят...   Feb 15 2015, 17:58
- - AndryG   ЦитатаОпишите почему вам понятно "что работае...   Feb 15 2015, 19:11
|- - megajohn   Цитата(AndryG @ Feb 15 2015, 22:11) У мен...   Feb 16 2015, 07:32
||- - Сергей Борщ   Цитата(megajohn @ Feb 16 2015, 09:32) дык...   Feb 16 2015, 07:57
|- - scifi   Цитата(AndryG @ Feb 15 2015, 22:11) У мен...   Feb 16 2015, 08:23
|- - kolobok0   Цитата(AndryG @ Feb 15 2015, 22:11) ...Ра...   Feb 16 2015, 09:26
- - AndryG   megajohn, вот и я кроме как вставлять "распор...   Feb 16 2015, 10:32
|- - scifi   Цитата(AndryG @ Feb 16 2015, 13:32) Вмест...   Feb 16 2015, 10:39
|- - kolobok0   Цитата(AndryG @ Feb 16 2015, 13:32) ...Я ...   Feb 17 2015, 21:46
|- - SSerge   Цитата(kolobok0 @ Feb 18 2015, 04:46) И п...   Feb 18 2015, 12:40
- - AndryG   scifi, да я ради интереса включил MISRA посмотреть...   Feb 16 2015, 10:55
|- - scifi   Цитата(AndryG @ Feb 16 2015, 13:55) Вот я...   Feb 16 2015, 11:17
- - AndryG   SSerge, именно из-за разных форматов я хочу переда...   Feb 18 2015, 12:58


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 22:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016