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

 
 
 
Reply to this topicStart new topic
> Неявное преобразование типов IAR ARM 6.10
grv
сообщение Feb 22 2011, 11:30
Сообщение #1


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

Группа: Участник
Сообщений: 101
Регистрация: 28-04-06
Пользователь №: 16 592



Перевожу проект с меги 128 на LPC23xx
Есть такой кусок на С:

Код
                           i=((unsigned short*)&(bin_buff[1]))[0];


где
unsigned short i;
unsigned char bin_buff[18];
линкер раскидал bin_buff[] с адреса 0x4000 01e4

этой строкой хочу взять 16 бит без знака из двух байт bin_buff[2]:bin_buff[1]

проверяю на симуляторе -все ок
в железе старший байт всегда равен 0, младший - правильный

в окне дизасма в симуляторе код получился такой

Код
                           i=((unsigned short*)&(bin_buff[1]))[0];
        0x710: 0xe59f113c     LDR       r1, ??DataTable10_12   ; bin_buff
        0x714: 0xe1d110b1     LDRH      r1, [r1, #0x1]
        0x718: 0xe1cd10b0     STRH      r1, [sp]


рылся-рылся в итоге чисто случайно обращаю внимание на сообщение loga:

Tue Feb 22 13:01:20 2011: Warning: The LDRH instruction at addr: 0x00000714 made an illegal unaligned access to 0x400001E5

Ну и сразу все стало на свои места.
Теперь вопрос собственно: какого %ера компилятор в купе с линкером не выдали хотя бы варнинг по этму поводу ? Все варнинги и ероры были включены. Или иначе, где я должен был почитать о такой ситуации чтоб ее не допустить ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 22 2011, 11:58
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(grv @ Feb 22 2011, 14:30) *
Теперь вопрос собственно: какого %ера компилятор в купе с линкером не выдали хотя бы варнинг по этму поводу ? Все варнинги и ероры были включены. Или иначе, где я должен был почитать о такой ситуации чтоб ее не допустить ?

Это общепринятая практика: если в коде на языке Си программист применил явное приведение типа, то он сам понимает, что делает, и компилятору в это вмешиваться не нужно. В конце концов, легко можно себе представить намеренно сделанный невыравненный доступ с целью детектировать тип процессора.
Кстати, в компиляторе RealView есть __packed.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Feb 22 2011, 11:58
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(grv @ Feb 22 2011, 14:30) *
Или иначе, где я должен был почитать о такой ситуации чтоб ее не допустить ?


Fighting the Lemmings. Martin Husemann
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 22 2011, 12:21
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Для начала нужно почитать чем отличается неявное преобразование типов от явного sm.gif

Вот пример неявного преобразования со странностями.
В 4.хх ИАРе легко можно было написать
Код
float f;
...
int tmp = f + 0.5f;

Никаких варнингов не было.
А в 5.хх уже вылазит зачем-то варнинг. Кто бы объяснил зачем его ввели?

Сообщение отредактировал GetSmart - Feb 22 2011, 12:30


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
grv
сообщение Feb 22 2011, 12:34
Сообщение #5


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

Группа: Участник
Сообщений: 101
Регистрация: 28-04-06
Пользователь №: 16 592



Цитата(scifi @ Feb 22 2011, 14:58) *
Это общепринятая практика: если в коде на языке Си программист применил явное приведение типа, то он сам понимает, что делает, и компилятору в это вмешиваться не нужно. В конце концов, легко можно себе представить намеренно сделанный невыравненный доступ с целью детектировать тип процессора.
Кстати, в компиляторе RealView есть __packed.


Ну конечно. значит когда компилятору непонятно с какой переменной разгребать сравнение вдух волатайлов нате вам варнинг, делайте что хочете, а как компилить код который потенциально может привести к неправильной выборке памяти то нате вам ребус maniac.gif И еще ж ясным по белому написано bin_buff[1], т.е. явно попадаем на ошибку.
Ну а детектировать тип процессора это наверное можно и на уровень асма спуститься, там определять.
На счет __packet не понял, чем оно здесь поможет ?

Сообщение отредактировал grv - Feb 22 2011, 12:38
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 22 2011, 12:49
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Каждый новичёк встаёт на эти грабли. Однако большинство понимают, что "сам дурак". На форуме уже наверное десяток аналогичных тем.

О __packet.
В ИАРе можно объявить структуру или юнион с побайтовой упаковкой. Тогда доступ ко всем полям будет побайтовый. Так можно считывать и 16 и 32 битные поля с невыравненных адресов.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 22 2011, 12:57
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (grv @ Feb 22 2011, 14:34) *
а как компилить код который потенциально может привести к неправильной выборке памяти то нате вам ребус
Предполагается, что программист очень хорошо представляет зачем вставил явное приведение типа. И почему он, хорошо подумавший, должен при каждой компиляции безопасного (ибо продуманного) кода получать предупреждение, предназначенное сторонникам бездумного copy-paste, которые даже не знают что такое явное, а что неявное (см. название темы) приведение типа?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 22 2011, 13:58
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(grv @ Feb 22 2011, 15:34) *
На счет __packet не понял, чем оно здесь поможет ?

Виноват, не обратил внимание, что это не RealView, а IAR.
Совсем переносимо было бы явным образом составить short из двух char'ов.
Go to the top of the page
 
+Quote Post
grv
сообщение Feb 22 2011, 15:26
Сообщение #9


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

Группа: Участник
Сообщений: 101
Регистрация: 28-04-06
Пользователь №: 16 592



Цитата(scifi @ Feb 22 2011, 16:58) *
Виноват, не обратил внимание, что это не RealView, а IAR.
Совсем переносимо было бы явным образом составить short из двух char'ов.

Спасибо, так и сделал. Просто в авр-е совсем байтов не оставалось, пришлось извращаться.

Цитата(GetSmart @ Feb 22 2011, 15:49) *
Каждый новичёк встаёт на эти грабли. Однако большинство понимают, что "сам дурак". На форуме уже наверное десяток аналогичных тем.

О __packet.
В ИАРе можно объявить структуру или юнион с побайтовой упаковкой. Тогда доступ ко всем полям будет побайтовый. Так можно считывать и 16 и 32 битные поля с невыравненных адресов.


Ну с граблями то понятно.
По __packet. Т.е. никакого выигрыша по сравнению с short=byteh<<8 | bytel на уровне кода получено все равно не будет , так ?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 22 2011, 15:35
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(grv @ Feb 22 2011, 20:26) *
...не будет , так ?

Скорее всего не будет. Только читабельность улучшится и удобство модификации текста.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


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


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