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

 
 
> ARM Ассемблер, программирование-искусство?
Tarkus
сообщение Mar 5 2009, 10:21
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 22-02-09
Пользователь №: 45 211



Читал heyrick.co.uk, автор - апологет принципа "код - произведение искусства" smile.gif
Например, в одну инструкцию:

BIC R0, R0, R0, ASR#31 ; IF R0 < 0 THEN R0 = 0

Или еще лучше, таблица из "N" переходов с помощью всего двух инструкций:

.swihandler
CMP R11, #((endofjumptable - startofjumptable) / 4)
ADDCC PC, PC, R11, LSL #2
B error
.startofjumptable
B swi0
B swi1
; etc...
.endofjumptable

Честно говоря, не понял принципа работы второго примера. Кто-нибудь может прояснить?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kons
сообщение Mar 9 2009, 12:55
Сообщение #2


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

Группа: Свой
Сообщений: 106
Регистрация: 28-09-05
Пользователь №: 9 035



to KRS.
Вы правы, кол-во обращений к данным не уменьшает, но (для ARM7TDMI, у Cortex и особенно ARM9 разница не столь существенна) LDR - 3 такта/слово, LDMIA - 2+1*кол-во слов. Т.е. при загрузке, скажем, 8 регистров LDRx8 = 24 такта, LDMIA - 10 тактов. Да, забыл сказать - это при выполнении из RAM. При выполнении из флэша на AT91SAM7 добавьте к каждому LDR еще по такту - флеш медленнее, однако.

Простенький пример - цикл вычисления FIR. Данные берутся из циркулярного буфера (DL_PTR, DL_BASE, DL_SIZE). Обрабатываются 4 отвода за раз. Напишите на c, скомпилируйте, посчитайте такты, сравните. А стоит или не стоит это делать на ASM - зависит от потребной частоты вычисления и длины фильтра. В моем случае (Fд=48 кГц, L=20 отводов, и кроме этого еще куча дел) - стоило однозначно. Была бы Fд 8 кГц - не стал бы заморачиваться. Что же касается реакции на прерывания - на то DMA есть.

FIR_DELAY_LOOP MACRO
LOCAL FDL_LP
FDL_LP: LDMDB DL_PTR!,{R_SMP3-R_SMP0} ;8
CMP DL_PTR,DL_BASE
ADDLS DL_PTR,DL_PTR,DL_SIZE
LDMIA SUFF_PTR!,{R_SUFF0-R_SUFF3} ;6
MLA R_ACC,R_SUFF0,R_SMP0,R_ACC ;16
MLA R_ACC,R_SUFF1,R_SMP1,R_ACC
MLA R_ACC,R_SUFF2,R_SMP2,R_ACC
MLA R_ACC,R_SUFF3,R_SMP3,R_ACC
SUBS SUFF_CNT,SUFF_CNT,#4 ;4
BNE FDL_LP
ENDM

P.S. А как тут код нормальный вставлять? Что с цитатой, что без - все одно каша...

to Pasha:
Цитата
Это квадратные советы. Они не учитывают задачи портирования, коих большинство, когда об алгоритме уже известно почти все, надо чтобы оно красиво влезло и не мешало жить наращиваемой функциональности. В таких случаях я лично начинаю с проверки и оптимизации именно узких мест.

+500. Особенно для DSP, и особенно на этапе выбора процессора.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 9 2009, 14:28
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(kons @ Mar 9 2009, 15:55) *
Простенький пример - цикл вычисления FIR. Данные берутся из циркулярного буфера (DL_PTR, DL_BASE, DL_SIZE)...

конечно компилер так не сможет скомпилировать, потому что у вас куча допущений: например длина циклического буфера кратна 4 словам! и соотвественно STUFF_CNT тоже кратно 4. Если вы сумеете объяснить это компилятору...
По поводу раскрутки циклов IAR это делать умеет простой пример:
Код
unsigned test(unsigned *dl, unsigned *suff)
{
    unsigned r;
    unsigned cnt;
    r = 0;
    cnt = 16;
    do {
        r += (*(dl++)) * (*(suff++));
    }while(--cnt);
    return r;
}

получаем листинг
Код
      1          unsigned test(unsigned *dl, unsigned *suff)
      2          {
   \                     test:
   \   00000000   00402DE9           PUSH     {LR}
   \   00000004   04D04DE2           SUB      SP,SP,#+4
      3              unsigned r;
      4              unsigned cnt;
      5              r = 0;
   \   00000008   0020A0E3           MOV      R2,#+0
      6              cnt = 16;
   \   0000000C   0430A0E3           MOV      R3,#+4
      7              do {
      8                  r += (*(dl++)) * (*(suff++));
   \                     ??test_0:
   \   00000010   04C090E4           LDR      R12,[R0], #+4
   \   00000014   04E091E4           LDR      LR,[R1], #+4
   \   00000018   9E2C22E0           MLA      R2,LR,R12,R2
      9              }while(--cnt);
   \   0000001C   04C090E4           LDR      R12,[R0], #+4
   \   00000020   04E091E4           LDR      LR,[R1], #+4
   \   00000024   9E2C22E0           MLA      R2,LR,R12,R2
   \   00000028   04C090E4           LDR      R12,[R0], #+4
   \   0000002C   04E091E4           LDR      LR,[R1], #+4
   \   00000030   9E2C22E0           MLA      R2,LR,R12,R2
   \   00000034   04C090E4           LDR      R12,[R0], #+4
   \   00000038   04E091E4           LDR      LR,[R1], #+4
   \   0000003C   9E2C22E0           MLA      R2,LR,R12,R2
   \   00000040   013053E2           SUBS     R3,R3,#+1
   \   00000044   F1FFFF1A           BNE      ??test_0
     10              return r;
   \   00000048   0200A0E1           MOV      R0,R2
   \   0000004C   04D08DE2           ADD      SP,SP,#+4       ;; stack cleaning
   \   00000050   0080BDE8           POP      {PC}            ;; return
     11          }

да LDMIA конечно не задействован, но раскрутка на лицо.

А если взять такую функцию (раскрутить цикл вручную)
Код
unsigned test(unsigned *dl, unsigned *suff, unsigned cnt)
{
    unsigned r;
    r = 0;
    do {
        unsigned d1,d2,d3,d4;
        unsigned s1,s2,s3,s4;

        d1 =  *(dl++);
        d2 =  *(dl++);
        d3 =  *(dl++);
        d4 =  *(dl++);

        s1 = *(suff++);
        s2 = *(suff++);
        s3 = *(suff++);
        s4 = *(suff++);

        r += s1*d1 + s2*d2 + s3*d3 + s4*d4;
    }while(cnt-=4);
    return r;
}

и взять компилер помощнее ( RVCT 4.0)
то получим такой asm
Код
; generated by ARM C/C++ Compiler, RVCT4.0 [Build 471]
; commandline armcc [-S -O3 -Otime test.c]
        ARM
        REQUIRE8
        PRESERVE8

        AREA ||.text||, CODE, READONLY, ALIGN=2

test PROC
        PUSH     {r4-r10}
        MOV      r3,#0
|L1.8|
        LDR      r12,[r0],#4
        LDM      r1!,{r7,r8,r10}
        LDM      r0!,{r4-r6}
        MUL      r12,r7,r12
        MUL      r5,r10,r5
        MLA      r12,r8,r4,r12
        LDR      r9,[r1],#4
        SUBS     r2,r2,#4
        MLA      r4,r9,r6,r5
        ADD      r12,r12,r4
        ADD      r3,r3,r12
        BNE      |L1.8|
        POP      {r4-r10}
        MOV      r0,r3
        BX       lr
        ENDP

так что умеют компиляторы и LDMIA использовать smile.gif

я конечно не утверждаю что надо без asm обходится! действительно многие вещи приходится писать на нем, но часто в силу того что на С не объснить компилеру некоторые ньюансы. Но не стоит недооценивать современные компиляторы.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Tarkus   ARM Ассемблер   Mar 5 2009, 10:21
- - _Pasha   Код.swihandler ; На вход R11 - индекс в таблице ...   Mar 5 2009, 10:49
|- - Tarkus   Цитата(_Pasha @ Mar 5 2009, 12:49) .swiha...   Mar 5 2009, 11:23
- - scifi   Цитата(Tarkus @ Mar 5 2009, 13:21) CMP ...   Mar 5 2009, 10:55
- - KRS   да в этих примерах ничего удивительного нет! а...   Mar 5 2009, 10:59
|- - _Pasha   Цитата(KRS @ Mar 5 2009, 13:59) Современн...   Mar 5 2009, 11:04
|- - KRS   Цитата(_Pasha @ Mar 5 2009, 14:04) А вот ...   Mar 5 2009, 11:19
|- - _Pasha   Цитата(KRS @ Mar 5 2009, 14:19) Так вот в...   Mar 5 2009, 11:32
- - kons   ЦитатаЭтот принцип для досужей потехи хорош, а для...   Mar 8 2009, 07:00
|- - ar__systems   Цитата(kons @ Mar 8 2009, 02:00) Немного ...   Mar 8 2009, 13:53
||- - zltigo   Цитата(ar__systems @ Mar 8 2009, 16:53) ....   Mar 8 2009, 14:00
||- - scifi   Цитата(ar__systems @ Mar 8 2009, 16:53) О...   Mar 9 2009, 10:50
|- - KRS   Цитата(kons @ Mar 8 2009, 10:00) Но (по о...   Mar 9 2009, 11:46
- - sergeeff   Почти в каждой современной книге по С/С++ написано...   Mar 9 2009, 11:15
|- - _Pasha   Цитата(sergeeff @ Mar 9 2009, 15:15) 1. П...   Mar 9 2009, 11:27
- - MALLOY2   расчет CRC32, ЦФ, свертка, FFT, практически все ма...   Mar 9 2009, 12:40
|- - ar__systems   Цитата(MALLOY2 @ Mar 9 2009, 07:40) расче...   Mar 9 2009, 13:37
|- - aaarrr   Цитата(kons @ Mar 9 2009, 15:55) P.S. А к...   Mar 9 2009, 13:39
- - kons   Да, хорошая штука RVCT. Мой IAR так не умеет - про...   Mar 9 2009, 15:36
- - KRS   Цитата(kons @ Mar 9 2009, 18:36) А для то...   Mar 9 2009, 16:22


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

 


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


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