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

 
 
> 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
Ответов
AndryG
сообщение Feb 16 2015, 10:32
Сообщение #2


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

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



megajohn, вот и я кроме как вставлять "распорки" dummy ничего другого не придумал.

kolobok0, вот полная история.
modbus-slave
В обработке приема, подсчете CRC я работаю с буфером, как с массивом.
В с-функции обработки modbus-функции 3 этот массив должен выглядеть двояко:
(я знаю, что можно записать в rsp и затереть данные в rqs - память экономим)

Код
typedef struct{ // request
  const uint8_t addr;
  const uint8_t func;
  const mbReg16_t first;
  const mbReg16_t count;
} mbFunc3Rqs_t;

typedef struct{ // response
  const uint8_t addr;
  const uint8_t func;
  const uint8_t size;
  mbReg16_t reg[(MB_FRAME_MAX - 6) / 2];
}mbFunc3Rsp_t;

#pragma inline
mbError_t mbFunc3Handler(void *frame){
  mbFunc3Rqs_t *rqs  = frame;
  mbFunc3Rsp_t *rsp  = frame;
  return MBE_NONE;
}


Вместо этого хочу сделать одно мега-union с только необходимыми полями. Избавится от постоянных преобразований типов и плясок с указателями.
Код
union{
  uint8_t raw[MB_FRAME_MAX];
  struct{
    const mbReg16_t first;
    const mbReg16_t count;
  }f3rqs;
  struct{
    mbReg16_t reg[(MB_FRAME_MAX - 6) / 2];
  } f3rsp;
}


Я уже понял, что моя хотелка не из С.
Не зря MISRA ругнулась на union c структурами, а затем обматерила за приведение типов через указатели.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 17 2015, 21:46
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(AndryG @ Feb 16 2015, 13:32) *
...Я уже понял, что моя хотелка не из С. ...


по разному обращаться к одному и тому-же участку памяти - это нормально. Если читаете Кернигана & Ритчи (K&R), то Вы можете придерживаться именно
материала там изложенного, тут всё правильно делаете. Если компилятор не пропускает - то проверяйте всякие глобал настройки среды, должно помочь. Ну и читать мануалы на саму среду разработки.
Т.е. K&R можно воспринимать как отличное описание стандарта сей.

Только не забудьте выравнивание на байт сделать до структур. И ышо выше - сохранить выравнивание, а ниже - восстановить его обратно.

И пару слов про модбас.
Различные девайсы по разному трактуют модбас. Бывало, что даже очерёдность CRC на приёме одна (правильная согласно протоколу), а вот передача левая - перевёрнутая. Так, что танцы
с байтами - один чёрт придётся в рукопашную, согласно настройкам или заточка на конкретику. Так-же встречается не стандартная скорость обмена.
Ну и на последок можно упомянуть об важной замороте в данном протоколе - тайм ауты. ОБЯЗАТЕЛЬНО до передачи и после передачи. Тем самым увеличивая помехозащищённость канала.
Разработчики обычно страдают выключением сразу передатчика, после прерывания освобождения сдвигового регистра после передачи. А в начале передачи даже и не заморачиваются с тайм-аутом.
Это зло на длинных линиях в пром. зоне...

Если не поборете - то напишите ошибку сразу, что есть и чего хочется.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Feb 18 2015, 12:40
Сообщение #4


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

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



Цитата(kolobok0 @ Feb 18 2015, 04:46) *
И пару слов про модбас.

А что до модбаса, то при разборе его пакетов все эти манипуляции с union и struct совершенно бесполезны по двум причинам:
1. У разных функций разный формат, поэтому проще для каждой вызвать отдельную процедуру-обработчик, а там ограничиться парой-тройкой константных индексов в массиве.
2. Использовать данные из массива напрямую невозможно, из-за тупоконечности (старший байт идёт первым) их всё равно приходится сначала перепаковывать.


--------------------
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
- - SSerge   Кодtypedef union{ uint8_t raw[4]; // hea...   Feb 15 2015, 20:08
|- - scifi   Цитата(AndryG @ Feb 16 2015, 13:32) Вмест...   Feb 16 2015, 10:39
- - 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 Текстовая версия Сейчас: 29th July 2025 - 21:00
Рейтинг@Mail.ru


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