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

 
 
> Запись int по указателю на произвольный адрес и выравнивание
0x435641
сообщение Jul 26 2012, 05:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 26-07-12
Пользователь №: 72 908



Доброго времени суток.

начну с кода:

char arr[16];

int *pi1 = (int*)arr[0];
int *pi2 = (int*)arr[1];
int *pi3 = (int*)arr[2];
int *pi4 = (int*)arr[3];

*pi1 = 0x11223344;
*pi2 = 0x11223344;
*pi3 = 0x11223344;
*pi4 = 0x11223344;


среда IAR 6.30.1

в результате запись происходит по адресам со сдвигом влево до границы кратной размеру адресуемого типа. это смотрел через J-Link
в листинге каждая запись производится инструкцией STR R0, [Rx]... при чем в Rx лежат правильные значения с шагом в 1 байт.

тот же результат в uVision 4

если же запустить отладку в симуляторе, то при каждой записи по не кратному адресу вылетает сообщение
"STR instruction at addr: 0x40006835 made an illegal unaligned access to 0x40006835"

информации о том, что адрес должен быть выровнен для STR/LDR по 4 байтам для STRH/LDRH по 2 байта я не нашел.
пусть даже должен быть выровнен. почему компилятор не преобразует команду записи по указателю в набор инструкций с побайтовой записью, учитывая специфику адресации?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
PoReX
сообщение Jul 26 2012, 06:56
Сообщение #2


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

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



Цитата(0x435641 @ Jul 26 2012, 09:19) *
начну с кода:

char arr[16];

int *pi1 = (int*)arr[0];
int *pi2 = (int*)arr[1];
int *pi3 = (int*)arr[2];
int *pi4 = (int*)arr[3];

*pi1 = 0x11223344;
*pi2 = 0x11223344;
*pi3 = 0x11223344;
*pi4 = 0x11223344;


среда IAR 6.30.1

Вообще-то код изначально не правильный. После инициализации массива он может содержать мусор и этот мусор вы преобразуете в указатель. Например:
Код
char arr[8]={0,1,2,3,4,5,6,7};

тогда
Код
pi1 == 0x00000000;
pi2 == 0x00000001;
pi3 == 0x00000002;
pi4 == 0x00000003;

А если
Код
char arr[8]={0,0,0,0,0,0,0,0};

то и получится
Цитата
44 33 22 11 NA NA NA NA

правда в реальном контроллере это вызовет HardFault
А чтобы получить необходимый результат
Цитата
44 44 44 44 33 22 11 NA

нужно немного изменить код:
Код
int *pi1 = (int*)&arr[0];
    int *pi2 = (int*)&arr[1];
    int *pi3 = (int*)&arr[2];
    int *pi4 = (int*)&arr[3];

и никакой __packed не нужен. Проверено в Keil'e через j-tag на stm32f103.


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 26 2012, 07:27
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Я то и не заметил отсутствие взятия адреса у вопрошающего...
А насчёт того что packed не нужен - я бы не был так категоричен. Иногда он очень даже нужен.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
PoReX
сообщение Jul 26 2012, 07:32
Сообщение #4


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

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



Цитата(demiurg_spb @ Jul 26 2012, 11:27) *
А насчёт того что packed не нужен - я бы не был так категоричен. Иногда он очень даже нужен.

Имелось ввиду в данном случае не нужен. Кстати __packed это фишка Keil'a/IAR или он есть в стандарте Cи?


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post



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

 


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


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