Luminary Micro LM3S608 GPIO Toggle 속도 테스트
외부 8Mhz 입력하여 PLL/4 = 50Mhz로 구동시 GPIO Toggle 속도는 240ns(2Mhz)정도 측정된다. 옵티마이즈 했을때 180ns(2.5Mhz)단순 페리속도 비교는 좀 그렇지만 AVR과 속도비교(16Mh에서 360ns(1.6Mhz))하면 조금 빠르다. 50Mhz 시스템 클럭인데도 페리가 이리 느린지? 좀더 알아볼 필요가 있다.
DSP28335와 GPIO Toggle 속도( 60ns(15Mhz) 비교하면 쫌....
그리고 같은 [Cortex-M3 STM32 속도] 에 비교하면 좀 더 느린것 같다.
//-------------------------------------------------
//Set the system clock to run at 50MHz from the PLL.
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_8MHZ);
//GPIO Init
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
Sbi(GPIO_PORTD_DIR_R, BIT0);
Sbi(GPIO_PORTD_DEN_R, BIT0);
while(1)
{
//GPIO Toggle
GPIO_PORTD_DATA_R ^= BIT0;
}
옵티마이즈 옵션을 바꾸니 코드가 좀더 간결해 진다.
25 {
26 GPIO_PORTE_DATA_R ^= BIT0;
\ ??main_1:
\ 00000052 0548 LDR.N R0,??main_0+0x8 ;; 0x400243fc
\ 00000054 0068 LDR R0,[R0, #+0]
\ 00000056 90F00100 EORS R0,R0,#0x1
\ 0000005A 0349 LDR.N R1,??main_0+0x8 ;; 0x400243fc
\ 0000005C 0860 STR R0,[R1, #+0]
\ 0000005E F8E7 B.N ??main_1
\ ??main_0:
옵티마이스 사용시 180n/2.5Mhz
24 while(1)
25 {
26 GPIO_PORTE_DATA_R ^= BIT0;
\ 00000050 3068 LDR R0,[R6, #+0]
\ 00000052 80F00100 EOR R0,R0,#0x1
\ 00000056 FAE7 B.N ??main_1
\ ??main_0:
하지만 그래도 뭔가 원하는 속도가 나오지 않는다.
클럭을 오버 클럭 해보자
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
코드 수정하니 130ns/3.4Mhz 까지 출력된다.
비트제어 레지스터로 테스트 해 보니 8.5Mhz까지 나오지만 그래도 STM32보다는 느리다.
#define sbi(Port, Bit) HWREG(Port + (GPIO_O_DATA + (Bit << 2))) = Bit
#define cbi(Port, Bit) HWREG(Port + (GPIO_O_DATA + (Bit << 2))) = 0
while(1)
{
sbi(GPIOC, GPIO_PIN_6);
cbi(GPIOC, GPIO_PIN_6);
}
21 while(1)
22 {
24 sbi(GPIOC, GPIO_PIN_6);
\ ??main_1:
\ 00000062 4021 MOVS R1,#+64
\ 00000064 0160 STR R1,[R0, #+0]
25 cbi(GPIOC, GPIO_PIN_6);
\ 00000066 0021 MOVS R1,#+0
\ 00000068 0160 STR R1,[R0, #+0]
\ 0000006A FAE7 B.N ??main_1
\ ??main_0:
\ 0000006C 04000020 DC32 0x20000004
\ 00000070 00600040 DC32 0x40006000
\ 00000074 00610040 DC32 0x40006100
28 }
참고로 Luminary에서 제공하는 함수를 이용하면 2.5Mhz 밖에 나오지 않는다.
17 {
21 GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, GPIO_PIN_6);
\ ??main_1:
\ 00000050 4022 MOVS R2,#+64
\ 00000052 4021 MOVS R1,#+64
\ 00000054 2800 MOVS R0,R5
\ 00000056 ........ BL GPIOPinWrite
22 GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, 0);
\ 0000005A 0022 MOVS R2,#+0
\ 0000005C 4021 MOVS R1,#+64
\ 0000005E 2800 MOVS R0,R5
\ 00000060 ........ BL GPIOPinWrite
\ 00000064 F4E7 B.N ??main_1
\ 00000066 00BF Nop
\ ??main_0:
\ 00000068 04000020 DC32 0x20000004
\ 0000006C 00600040 DC32 0x40006000
\ 00000070 FC630040 DC32 0x400063fc
23 }
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
-> 400k