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

 
 
> IAR ARM 4.41, Слишком умный :)
MALLOY2
сообщение Jul 20 2007, 11:18
Сообщение #1


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Не могу заставить компилятор генерить нужный код.
Есть такая структура
Код
#pragma pack(1)
typedef  
          {
            uint8     a8_0;
            uint8     a8_1;
            uint8     a8_2;
            uint8     a8_3;
            uint32   data_1;    
            uint32   data_2;
          } rtp_heder_t;


далее имеем массив 32 битных значений.

Код
uint32 my_buff[BUFF_SIZE];   //он тоже выровнен к границе 32 битных слов


далее идет функция
Код
void rtp_process(uint32 data)
{
   rtp_heder_t *ptr;                        //указатель на структуру  

   ptr = (rtp_heder_t*)&my_buff;    //берем указатель буфера ввода
  
   if (ptr->data_1 == data) ...         //вот здесь и порылась собака, сравнение происходит побайтово.  

}


Если my_buf объявить как rtp_heder_t тогда при сравнении используется чтение 32 бит, если дело касается каких либо указателей он начинает читать побайтово. Как обойти эту проблему ?, я понимаю что компилер сделал так что код никогда в дата аборт не попадет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Jul 20 2007, 12:35
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Да не надо ничего говорить!
Внутри структуры байты не выраниваются! их размер кратен 1!
16 - бит врыаниваются по 16 бит
32 - бит по 32.
если убрать pack - структура будет абсолютно такая же!


Я наверное многих ввл в заблуждение стуруктурой
Код
#pragma pack(1)
typedef  
          {
            uint8     a8_0;
            uint8     a8_1;
            uint8     a8_2;
            uint8     a8_3;
            uint32   data_1;    
            uint32   data_2;
          } rtp_heder_t;


Эта структура просто как пример, давайте расмотримтакую структуру, она более наглядно докажет что pack убрать нельзя.
typedef
{
uint8 a8_0;
uint16 x;
uint8 a8_1;
uint32 data_1;
uint32 data_2;
} rtp_heder_t;

[/code]

Вопрос стоит не втом чтобы изменить структуры, можно и протокол переделать smile.gif, это не проблема, вопрос стоит как заставить компилятор smile.gif, и я нашел решение smile.gif

вот так
Код
   rtp_heder_t *ptr;                        //указатель на структуру    
   uint32 *t;                                   //дополнительная переменная без нее никак

   ptr = (rtp_heder_t*)&my_buff;    //берем указатель буфера ввода
   t = (uint32*)(&ptr->data_1);      
  
   if (*t == data) ...         //вот теперь работает как надо


Приэтом компилятор выдал варниг
Warning[Pa039]: use of address of unaligned structure member

P.S. Этот вопрос несет спортивный характер smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MALLOY2   IAR ARM 4.41   Jul 20 2007, 11:18
- - scifi   Дык ведь pragma pack(1) и говорит компилятору, что...   Jul 20 2007, 11:26
- - _artem_   Может быть проблем с align ? То есть структуа не р...   Jul 20 2007, 11:26
- - MALLOY2   ЦитатаДык ведь pragma pack(1) и говорит компилятор...   Jul 20 2007, 11:47
|- - KRS   Цитата(MALLOY2 @ Jul 20 2007, 15:47) Pack...   Jul 20 2007, 12:05
- - MALLOY2   ЦитатаНе совсем так! если в даном случае убрат...   Jul 20 2007, 12:13
|- - KRS   Цитата(MALLOY2 @ Jul 20 2007, 16:13) Если...   Jul 20 2007, 12:16
- - IgorKossak   В определении структуры забыли написать слово stru...   Jul 20 2007, 12:28
|- - KRS   Цитата(MALLOY2 @ Jul 20 2007, 16:35) Эта ...   Jul 20 2007, 13:19
|- - Сергей Борщ   Цитата(KRS @ Jul 20 2007, 16:19) Да здесь...   Jul 20 2007, 17:32
- - zltigo   Цитата(MALLOY2 @ Jul 20 2007, 14:18) Не м...   Jul 20 2007, 12:36
|- - lebiga   Цитата(zltigo @ Jul 20 2007, 16:36) Увы, ...   Jul 22 2007, 19:28
- - mdmitry   Возможно в структуре поменять поля: поставить перв...   Jul 20 2007, 20:07
- - KRS   Цитата(mdmitry @ Jul 21 2007, 00:07) Возм...   Jul 22 2007, 09:43


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

 


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


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