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

 
 
 
Reply to this topicStart new topic
> Упаковка структуры данных в PIC24
west329_
сообщение Apr 4 2011, 19:56
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Контроллер PIC24FJ64GA002

Код
typedef struct PPP_Header {
  unsigned char        StartMarker;
  unsigned int         Framing;
  unsigned int              Protocol;
  unsigned char             Request;
  unsigned char             Id;
  unsigned int         Length;
  unsigned char             FirstOption;
  unsigned char             FirstOptionLength;
  unsigned char*     Data;
} T_PPP_Header;


Структура взята из 8 битных АВР, как оказывается неправильно работает на 16битных пик
Первый unsigned char StartMarker съедает 2 байта согласно архитектуре, последующие данные сдвигаются соответственено.
Можно ли как то обойти такое, и обращаться побайтно ?
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Apr 7 2011, 19:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(west329_ @ Apr 4 2011, 22:56) *
Структура взята из 8 битных АВР, как оказывается неправильно работает на 16битных пик
Первый unsigned char StartMarker съедает 2 байта согласно архитектуре, последующие данные сдвигаются соответственено.
Можно ли как то обойти такое, и обращаться побайтно ?

что значит "неправильно" ? код хакерского вида не работает? Чего именно Вы хотите?
Если просто доступаться к данным, так используйте указатели на поля, преобразуя их в char*. но гораздо лучше каждое такое поле через union объявить еще и как массив чаров , так нагляднее.
Если сохранить как массив, то размер этой структуры выясняется через sizeof().
если все-таки хотите просто упаковать- так нужно смотреть компилятор, может и получится без выравнивания.
Go to the top of the page
 
+Quote Post
testerplus
сообщение Apr 11 2011, 10:29
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 7-08-08
Из: SPb
Пользователь №: 39 471



Цитата(west329_ @ Apr 4 2011, 23:56) *
Можно ли как то обойти такое, и обращаться побайтно?

Почитайте в мануале про атрибут packed:
Код
typedef struct __attribute__((packed)) PPP_Header
{
    ...

Но в некоторых случаях при неаккуратной работе с такими структурами (например при попытке обращения к полям через указатель) можно нарваться на трап "ошибка адреса".
Go to the top of the page
 
+Quote Post

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

 


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


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