OSDev
http://osdev.su/

"Образцовое" решение, блин...
http://osdev.su/viewtopic.php?f=18&t=315
Страница 1 из 1

Автор:  SII [ 03 мар 2010, 21:24 ]
Заголовок сообщения:  "Образцовое" решение, блин...

Осваиваю по работе ARM. Есно, первая задача -- заставить помигать светодиодами при нажатии на кнопки. Ничего сложного в самой задаче нет, но предварительно нужно немного поплясать с бубном: перейти на нормальную частоту работы (проц стартует от "медленного" кварца на 32678 Гц, в то время как предельная частота -- 240 МГц). Понятно, что я решил взять за основу идущий в комплекте с платой (Olimex SAM9-L9261 -- почти точная копия атмеловской AT91SAM9261-EK, только в 4 раза дешевле) пример -- загрузчик AT91BOOTSTRAP (он используется в самой плате -- получает управление от намертво зашитого в ПЗУ процессора атмеловского загрузчика и грузит загрузчик U-Boot, который грузит ядро Линуха). Его стартовый код, включающий главный генератор (кварц на 18,432 МГц) и переключающий процессор на него, выглядит следующим образом:

Код:
/* Test if main oscillator is enabled */
   ldr    r0,=AT91C_PMC_SR
   ldr    r1, [r0]
   ldr    r2,=AT91C_PMC_MOSCS
   ands    r1, r1, r2
   bne     _switch_to_mosc


/* Enable the main oscillator */
_enable_mosc:
   ldr    r0,=AT91C_PMC_MOR
   mov    r1, #(0x40 << 8)
   ldr   r2,=AT91C_CKGR_MOSCEN
   orr   r1, r1, r2
   str   r1, [r0]
   ldr    r0,=AT91C_PMC_SR
1:
   ldr    r1, [r0]
   ldr    r2,=AT91C_PMC_MOSCS
   ands    r1, r1, r2
   beq   1b
   
/* Test if MCK == SLOW CLOCK */
_switch_to_mosc:
   ldr    r0,=AT91C_PMC_MCKR
   ldr    r1,=AT91C_PMC_CSS
   ldr    r2, [r0]
   and    r2, r2, r1
   mov   r1, #0
   cmp   r1, r2
   bne   _init_bss
   ldr    r1,=AT91C_PMC_CSS_MAIN_CLK
   ldr    r2,=AT91C_PMC_PRES_CLK
   orr   r1, r1, r2
   str    r1, [r0]
   ldr    r0,=AT91C_PMC_SR
1:
   ldr     r1, [r0]
   ldr   r2,=AT91C_PMC_MCKRDY
   ands    r1, r1, r2
   beq     1b


Легко увидеть, что здесь 31 команда. Кроме того, из-за особенностей АРМовской архитектуры константы в общем случае должны размещаться отдельно (как данные), занимая дополнительное слово (4 байта для АРМа). На ассемблере такие константы видны по знаку равенства перед ними (или их именами; такой способ обозначения использовался ещё на IBMовских мэйнфреймах). Здесь таких констант 9.

Я для интереса написал собственную версию того же самого кода, функционально ничем не отличающуюся (и работоспособную -- уже проверил). Вот она:

Код:
       /* Check whether the main oscillator is working */
       ldr   r0, = PMC_SR
       ldr   r1, [r0]
       ands  r1, r1, #PMC_MOSCS
       bne   _switch_to_mosc

       /* Enabling the main oscillator */
       ldr   r3, = PMC_MOR
       ldr   r4, = (PMC_MOR_MOSCEN + (64 << 8 ))
       str   r4, [r3]

       /* Waiting for the main clock to stabilize */
1:     ldr   r1, [r0]
       ands  r1, r1, #PMC_MOSCS
       beq   1b

_switch_to_mosc:

       /* Check whether the main oscillator is used */
       ldr   r3, = PMC_MCKR
       ldr   r4, [r3]
       ands  r4, r4, #PMC_CSS
       bne   _init_bss

       /* Switching to the main oscillator */
       mov   r4, #(PMC_CSS_MAIN + PMC_PRES_1 + PMC_MDIV_1)
       str   r4, [r3]

       /* Waiting for the main oscillator to be ready */
1:     ldr   r1, [r0]
       ands  r1, r1, #PMC_MCKRDY
       beq   1b


Всего 19 команд и 4 полноценных константы, остальные заменены размещающимися прямо в коде команды -- итого 23 слова памяти против 40. Вот и возникает вопрос: кто же пишет этот самый "образцовый" код, если его человек, впервые в жизни пишущий программу для этой архитектуры, легко сократил чуть ли не вдвое?..

Автор:  Himik [ 04 мар 2010, 00:34 ]
Заголовок сообщения:  Re: "Образцовое" решение, блин...

Это говорит о том, что хороших Си компиляторов для ARM нет :)

Автор:  SII [ 04 мар 2010, 00:54 ]
Заголовок сообщения:  Re: "Образцовое" решение, блин...

Ну дык... ГеЦеЦе, его и юзаю -- только на Аде пишу, а не на сях. На асме лишь стартовый модуль (большую часть которого привёл выше).

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/