Типа отчет, о том что получилось. Тестовая программка:
Код
while (1) {
AT91C_BASE_PIOA -> PIO_SODR = AT91C_BASE_PIOA -> PIO_SODR | 0x00000800; // PA11 = 1
AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800; // PA11 = 0
}
Мне удалось разогнать процессор (at91sam7s256) до 100 Мгц.
При выполнении программы из ОЗУ период меандра на ножке PA11 был примерно 200 нс.
И это при тактовом цикле 10нс!
Дизассемблер показал, что изменение состояния ножки занимает 4-5 команд:
Код
319: while (1) {
0x00102CE0 EA000008 B 0x00102D08
320: AT91C_BASE_PIOA -> PIO_SODR = AT91C_BASE_PIOA -> PIO_SODR | 0x00000800; // PA11 = 1
0x00102CE4 E3A00000 MOV R0,#0x00000000
0x00102CE8 E5100BD0 LDR R0,[R0,#-0x0BD0]
0x00102CEC E3800B02 ORR R0,R0,#0x00000800
0x00102CF0 E3A01000 MOV R1,#0x00000000
0x00102CF4 E5010BD0 STR R0,[R1,#-0x0BD0]
321: AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800; // PA11 = 0
0x00102CF8 E3A00000 MOV R0,#0x00000000
0x00102CFC E5100BCC LDR R0,[R0,#-0x0BCC]
0x00102D00 E3800B02 ORR R0,R0,#0x00000800
0x00102D04 E5010BCC STR R0,[R1,#-0x0BCC]
319: while (1) {
0x00102D08 EAFFFFF5 B 0x00102CE4
Если каждая команда будет выполняться ровно 2 такта, то все складывается. Но, если я не ошибаюсь, у армов большинство команд выполняется за один такт. Может кто-нибудь подскажет, в чем дело?