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

 
 
> Odd address trap и LPC23xx, А что, LPC не генерит unaligned access exeption?
VslavX
сообщение Jan 15 2009, 18:43
Сообщение #1


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



У меня в тестовой прошивке есть такой небольшой чудный кусочек кода:
Код
{
    ungigned long *p;
    dprintf("\r\nNon aligned DWORD read.. ");
    dflush();
    p = (unsigned long*)(0x209 + LPC_ISRAM);
    dprintf("%08X", *p);
}


Назначение этого кусочка - протестировать работу соответствующего обработчика исключения. Код прекрасно отработал на S3C44BOX, S3C2410, IXP42x, SAM7xx, PXA2xx/3xx и много лет все было чудесно. И вот, "понимаете, в машине в которой мы ехали, случайно, совершенно случайно, оказался цемент" ©. Я "совершенно случайно" запустил этот код на LPC2388, и... не увидел свой любимый "ODD ADDRESS TRAP".
Смотрим документацию, "усер мануал" на LPC23xx вообще не содержит слова "unaligned". В-общем, красота - при невыравненном адресе - на LPC23xx читается/пишется переставленный мусор, и все это МОЛЧА. Такая низость в самом деле имеет место, или я чего-то недопонимаю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Jan 18 2009, 13:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата
Имхо, это уж совсем клиническая ситуация - "невыровненный кольцевой буфер 16-битных слов" - такого я еще не встречал.

Ну маленько не так написал sad.gif - буфер само-собой выровненный, а слова лежащие в нем, естественно, уже нет. Буфера обслуживают 16bit SPI, протокол старинный и тоже 16bit - пришел из 70x годов с машины которая про 8bit вобще не знала smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jan 18 2009, 13:30
Сообщение #3


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Мне правда интересно. На ARM-е можно любой невыравненный USHORT (16-битное целое) загрузить за 3 инструкции
Код
ldrb R1, [R0, #0]
ldrb R2, [R0, #1]
orr  R1, R1, R2, shl #8

Как можно грузить быстрее - ума не приложу laughing.gif . Если даже воспользоваться изращенным способом загрузки от NXP - то все равно нужна проверка, что 16-битное не пересекает границу 32-битного слова.
Вот я такой тестик запустил:
Код
{
    BYTE a[8];
    DWORD i;
    for(i=0; i<sizeof(a); i++) a[i] = (BYTE)(i+1);
    dprintf("\r\n%08X %08X %08X %08X",
                *((PDWORD)&a[0]),
                *((PDWORD)&a[1]),
                *((PDWORD)&a[2]),
                *((PDWORD)&a[3]));
}

Результат: 04030201 01040302 02010403 03020104
То есть, действительно имеет место циклический сдвиг - так еще (дополнительно к проверке вмещения в одно слово) и старшие биты чистить надо. Не понимаю, где тут можно выиграть blink.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 18 2009, 13:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(VslavX @ Jan 18 2009, 15:30) *
Не понимаю, где тут можно выиграть blink.gif


У меня память под буфера внешняя и замена одного из двух ldrb из внешней памяти банальным tst регистр,#0x3 мне и понравилась, хотя и те-же "три инструкции", как понравилось и использование (кусочек на ASM) только одного регистра вместо 2 ( у Вас даже 3x ).


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jan 18 2009, 14:29
Сообщение #5


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(zltigo @ Jan 18 2009, 15:53) *
У меня память под буфера внешняя и замена одного из двух ldrb из внешней памяти банальным tst регистр,#0x3 мне и понравилась, хотя и те-же "три инструкции", как понравилось и использование (кусочек на ASM) только одного регистра вместо 2 ( у Вас даже 3x ).

Ну, допустим, доступ к внешней памяти медленный. Но ведь если, например, младшие два бита адреса равны 0x03, то все равно надо читать два раза из памяти - два последовательных DWORD/WORD-a. И дополнительная проверка на равенство этих битов адреса на 0x03 с последующим ветвлением/пропуском тоже нужна. Где собак зарыт?
P.S. Переписал свой тестик на использование 16-битных невыравненных слов - там еще результаты мрачней. Ну никак за одно обращение два слова (16 или 32-битных) не читается.
P.P.S. "Листинг, сестра, листинг" smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 18 2009, 15:32
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(VslavX @ Jan 18 2009, 16:29) *
Ну, допустим, доступ к внешней памяти медленный. Но ведь если, например, младшие два бита адреса равны 0x03, то все равно надо читать два раза из памяти - два последовательных DWORD/WORD-a.


В этом моем случае - нет - все двухбайтовое. 0x3 я просто так использовал. Ну а в случае реального смещения на байт речь уже идет о той-же двухкратно разнице - 2 или 4 обращения.

Цитата
И дополнительная проверка на равенство этих битов адреса на 0x03


Одна команда

Цитата
с последующим ветвлением/пропуском тоже нужна. Где собак зарыт?


Для ARM без ветвления smile.gif

Цитата
P.P.S. "Листинг, сестра, листинг" smile.gif

Код
tst      R0,#0x3
ldrh     R0,[R0, #+0]
lsrne    R0,R0,#+8

вместо
Код
ldrb     R1,[R0, #+0]
ldrb     R0,[R0, #+1]
orr      R0,R1,R0, lsl #+8


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 18 2009, 16:28
Сообщение #7


.
******

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



Цитата(zltigo @ Jan 18 2009, 21:32) *
Код
lsrne    R0,R0,#+8

Это что за команда? IAR ругается. Может это movne ...,lsr #8 ?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 18 2009, 17:27
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(GetSmart @ Jan 18 2009, 18:28) *
Это что за команда? IAR ругается. Может это movne ...,lsr #8 ?

С чего-бы это вдруг? обычный сдвиг при условии.

вот аж листинг из  сишного исходника


Код
    108          int test_b( BYTE *buff )
    109          {
    110              if( (ulong)buff & 0x3 )
   \                     test_b:
   \   00000000   030010E3           TST      R0,#0x3
   \   00000004   B000D0E1           LDRH     R0,[R0, #+0]
    111                  return( *(ushort *)buff>>8 );
   \   00000008   2004A011           LSRNE    R0,R0,#+8
    112              else
    113                  return( *(ushort *)buff );
   \   0000000C   0EF0A0E1           MOV      PC,LR           ;; return
    114          }


Другое дело, что все это бред - что-то переклинило sad.gif. В моем примере это просто ldrh вне зависимости от смещения.

Код
BYTE tbuff[8] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };

int test( BYTE *buff )
{
 return( *(ushort *)buff );
}

void test_short(void)
{
 xprintf( "%04X %04X %04X %04X\r", test(tbuff), test(tbuff+2), test(tbuff+4), test(tbuff+6) );
}
 

Результат: 


0201 0403 0605 0807

Листинг суперфункции:

Код
    114          int test( BYTE *buff )
    115          {
    116              return( *(ushort *)buff );
   \                     test:
   \   00000000   B000D0E1           LDRH     R0,[R0, #+0]
   \   00000004   0EF0A0E1           MOV      PC,LR           ;; return
    117          }


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jan 18 2009, 19:32
Сообщение #9


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Код
BYTE tbuff[8] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };

int test( BYTE *buff )
{
 return( *(ushort *)buff );
}

void test_short(void)
{
 xprintf( "%04X %04X %04X %04X\r", test(tbuff), test(tbuff+2), test(tbuff+4), test(tbuff+6) );
}
 
А чего Вы хотели, если у Вас буфер выравнен (как стековая переменная) на 32-битную границу?
(сорри, пропустил, это у меня стековая, а у Вас - глобальная. Но, на 99% уверен, что буфер таки выравнен -
надо для 100% гарантии еще &tbuff[0] посмотреть бы).
Так что, это - не фокус, попробуйте написать так:

Код
BYTE tbuff[9] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 };

int test( BYTE *buff )
{
 return( *(ushort *)buff );
}

void test_short(void)
{
 xprintf( "%04X %04X %04X %04X\r", test(tbuff+1), test(tbuff+3), test(tbuff+5), test(tbuff+7) );
}
 

Думаю, результат будет: 1000002 3000004 5000006 7000008
А должен бы быть: 0302 0504 0706 0908.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 18 2009, 20:06
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(VslavX @ Jan 18 2009, 21:32) *
А чего Вы хотели, если у Вас буфер выравнен (как стековая переменная) на 32-битную границу?


Писал об этом несметное число раз.

Цитата(VslavX @ Jan 18 2009, 21:32) *
Думаю, результат будет: 1000002 3000004 5000006 7000008


Я где-то для этих условий утверждал обратное?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- VslavX   Odd address trap и LPC23xx   Jan 15 2009, 18:43
- - aaarrr   Цитата(VslavX @ Jan 15 2009, 21:43) Такая...   Jan 15 2009, 19:37
|- - VslavX   Цитата(aaarrr @ Jan 15 2009, 21:37) Имеет...   Jan 15 2009, 20:08
|- - abcdefg   Цитата(VslavX @ Jan 15 2009, 23:08) P.S. ...   Jan 16 2009, 07:35
|- - VslavX   Цитата(abcdefg @ Jan 16 2009, 09:35) в ко...   Jan 16 2009, 07:56
- - amw   Цитата(VslavX @ Jan 15 2009, 20:43) У мен...   Jan 16 2009, 07:43
- - meister   Цитата(VslavX @ Jan 15 2009, 22:43) В-общ...   Jan 16 2009, 08:33
|- - VslavX   КодIf the memory address is not word-aligned, the ...   Jan 16 2009, 09:02
|- - meister   Цитата(VslavX @ Jan 16 2009, 13:02) В люб...   Jan 16 2009, 09:04
|- - zltigo   Цитата(VslavX @ Jan 16 2009, 12:02) Очень...   Jan 16 2009, 09:58
|- - defunct   Цитата(zltigo @ Jan 16 2009, 11:58) (кста...   Jan 16 2009, 10:20
||- - zltigo   Цитата(defunct @ Jan 16 2009, 13:20) Комп...   Jan 16 2009, 10:30
||- - defunct   Цитата(zltigo @ Jan 16 2009, 12:30) Отнюд...   Jan 16 2009, 13:27
||- - zltigo   Цитата(defunct @ Jan 16 2009, 16:27) Это ...   Jan 16 2009, 13:38
|||- - defunct   Цитата(zltigo @ Jan 16 2009, 15:38) В дан...   Jan 16 2009, 13:49
|||- - GetSmart   Цитата(defunct @ Jan 16 2009, 19:49) Не, ...   Jan 16 2009, 14:16
|||- - defunct   Цитата(GetSmart @ Jan 16 2009, 16:16) Ещё...   Jan 16 2009, 18:01
|||- - GetSmart   Цитата(defunct @ Jan 17 2009, 00:01) Да н...   Jan 17 2009, 05:12
|||- - VslavX   Цитата(GetSmart @ Jan 17 2009, 07:12) А в...   Jan 17 2009, 06:46
|||- - defunct   Цитата(GetSmart @ Jan 17 2009, 07:12) Пар...   Jan 17 2009, 17:00
|||- - zltigo   Цитата(defunct @ Jan 17 2009, 19:00) В та...   Jan 17 2009, 17:13
|||- - defunct   Цитата(zltigo @ Jan 17 2009, 19:13) Вы, э...   Jan 17 2009, 18:25
|||- - aaarrr   Цитата(defunct @ Jan 17 2009, 21:25) т.к....   Jan 17 2009, 18:41
|||- - abcdefg   Цитата(defunct @ Jan 17 2009, 21:25) О то...   Jan 17 2009, 18:47
|||- - zltigo   Цитата(defunct @ Jan 17 2009, 20:25) О то...   Jan 17 2009, 19:46
||||- - defunct   Цитата(zltigo @ Jan 17 2009, 21:46) Ну и ...   Jan 18 2009, 00:44
||||- - GetSmart   Цитата(defunct @ Jan 18 2009, 06:44) Согл...   Jan 18 2009, 06:15
||||- - defunct   Цитата(GetSmart @ Jan 18 2009, 08:15) Дам...   Jan 18 2009, 21:46
|||- - VslavX   Цитата(defunct @ Jan 17 2009, 20:25) на L...   Jan 17 2009, 19:58
||- - GetSmart   Цитата(defunct @ Jan 16 2009, 19:27) Код*...   Jan 16 2009, 13:43
|- - VslavX   Цитата(zltigo @ Jan 16 2009, 11:58) Вообщ...   Jan 16 2009, 11:03
|- - meister   Цитата(zltigo @ Jan 16 2009, 13:58) Тут с...   Jan 16 2009, 11:11
|- - zltigo   Цитата(VslavX @ Jan 16 2009, 14:03) Самый...   Jan 16 2009, 12:07
|- - VslavX   Цитата(zltigo @ Jan 16 2009, 14:07) Все в...   Jan 16 2009, 16:23
|- - zltigo   Цитата(VslavX @ Jan 16 2009, 19:06) Чему ...   Jan 16 2009, 16:38
|- - VslavX   Цитата(zltigo @ Jan 16 2009, 18:24) проек...   Jan 16 2009, 16:39
|- - zltigo   Цитата(VslavX @ Jan 16 2009, 19:39) А мож...   Jan 16 2009, 17:01
|- - VslavX   Цитата(zltigo @ Jan 16 2009, 19:01) memcp...   Jan 16 2009, 18:06
|- - zltigo   Цитата(VslavX @ Jan 16 2009, 21:06) Ну и ...   Jan 16 2009, 18:52
|- - VslavX   Цитата(zltigo @ Jan 16 2009, 20:52) Посме...   Jan 16 2009, 20:28
|- - zltigo   Цитата(VslavX @ Jan 16 2009, 22:28) Гы, я...   Jan 16 2009, 21:45
- - GetSmart   Прямо скажу, я за 3 года об АРМах столько всего на...   Jan 17 2009, 08:52
|- - zltigo   Цитата(GetSmart @ Jan 17 2009, 10:52) А н...   Jan 18 2009, 11:17
|- - aaarrr   Цитата(zltigo @ Jan 18 2009, 14:17) Если ...   Jan 18 2009, 12:10
||- - zltigo   Цитата(aaarrr @ Jan 18 2009, 14:10) генер...   Jan 18 2009, 12:14
|- - VslavX   Имхо, это уж совсем клиническая ситуация - "н...   Jan 18 2009, 13:06
|- - VslavX   Кодtst R0,#0x3 ldrh R0,[R0, #+0] lsrne ...   Jan 18 2009, 15:47
|- - VslavX   Цитата(zltigo @ Jan 18 2009, 22:06) Писал...   Jan 18 2009, 20:37
|- - zltigo   Цитата(VslavX @ Jan 18 2009, 22:37) Я так...   Jan 18 2009, 20:55
- - Rst7   Цитатаtst R0,#0x3 ldrh R0,[R0, #+0] lsrne...   Jan 18 2009, 15:43
|- - zltigo   Цитата(Rst7 @ Jan 18 2009, 17:43) Простит...   Jan 18 2009, 16:05
|- - VslavX   Цитата(zltigo @ Jan 18 2009, 18:05) Я НЕ ...   Jan 18 2009, 16:28
- - GetSmart   Понятно, хочется переложить на процессор собственн...   Jan 19 2009, 06:00
- - defunct   Цитата(GetSmart @ Jan 19 2009, 08:00) Пон...   Jan 19 2009, 11:39
- - GetSmart   Цитата(defunct @ Jan 19 2009, 17:39) Два ...   Jan 19 2009, 12:28


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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 10:24
Рейтинг@Mail.ru


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