도와주세요!!
글 수 15,339
2005.03.15 17:24:40 (*.219.166.96)
6706
.globl OSTimerInit
OSTimerInit:
ldr r0, =TMR_BASE
ldr r1, =0x00
str r1, [r0, #TMR_OSCR]
ldr r1, =36864
str r1, [r0, #TMR_OSMR0]
ldr r1, =0x01
str r1, [r0, #TMR_OIER]
ldr r1, =0x00
str r1, [r0, #TMR_OWER]
ldr r1, =0x01
str r1, [r0, #TMR_OSSR]
ldr r1, =0x02
str r1, [r0, #TMR_OSSR]
ldr r1, =0x04
str r1, [r0, #TMR_OSSR]
ldr r1, =0x08
str r1, [r0, #TMR_OSSR]
mov pc, lr
.globl OSTimerIrqEnable
OSTimerIrqEnable:
ldr r0, =INT_BASE
ldr r1, =0x00
str r1, [r0, #INT_ICCR]
ldr r1, =0x00
str r1, [r0, #INT_ICLR]
ldr r1, =0x04000000
str r1, [r0, #INT_ICMR]
ldr r1, =0x00
str r1, [r0, #INT_ICIP]
mov pc, lr
이상이 제가 사용하던 ostimer 초기화 함수와 ostimer 인터럽트 인에이블
함수입니다. 도움이 되었으면 좋겠습니다.
c 언어로도 같은 방법으로 작성하면됩니다. 아마도 ezboot의 time.c와
비슷할 겁니다.
아울러 xscale도 arm이기 때문에 arm의 cpsr에 irq를 사용할수 있도록
바꿔줘야 할겁니다. 그리고 irq handler에서는 사용하는 레지스터에 대해
저장을 해야합니다. 그렇지 않으면 인터럽트 처리후 문제가 발생할 수
있습니다.
또 한 가지 irq를 처리해서 처리하는 동안에 레지스터등을 저장하기 위해서
irq stack을 정의해 주어야 할 겁니다. 방법은 ezboot의 start.S에
보시면 svc 모드에서 stack을 설정하는 부분이 있습니다. 그 부분을 참고
하시어 irq 모드로 바꾸고 irq stack을 정의 한후 다시 svc 모드로 돌아와주
면 됩니다. 아마도 svc 모드로 전환하는 부분위에서 해 주면 안전할 겁니다.
저는 이렇게 해서 사용했습니다. uCOSII를 올릴때 사용했었거든요.
도움이 되셨으면 좋겠습니다.
그럼 수고하세요
궁금 wrote..
: 안녕하세요.
: 이번엔 ez-x5를 가지고 인터럽트 관련한 실험을 하고 있습니다.
: 저의 목적은 PXA255의 OS Timer Interrupt를 사용하는 것인데요.
:
: 전체적으로 인터럽트를 사용하려면(OSTIMER나 GPIO)
: 어떤 레지스터를 설정해주어야 하나요?
: PXA255 데이타쉬트를 보고 있는데 잘 안되는군요.
:
:
: 제 프로그램의 플로우는 다음과 같습니다.
:
: start.S에서 CPSR의 I비트 0으로 클리어하고 SVC모드
: mrs r0,CPSR
: bic r0,r0,#0x80
: orr r0,r0,#0x13
: msr CPSR,r0
:
: main으로 점프 후 c언어로 인터럽트 관련 레지스터 설정
: ICLR = 0 (IRQ enable)
: ICIP = 0xffffffff; (all enable)
: ICFP = 0; (FIQ disable)
: ICMR = 0xffffffff; (all enable)
: ICCR = 0;
:
: OSCR = 0; (OS타이머 = 0으로 설정)
: OIER = 0x01; (CHAANEL 0(=OSMR0) 설정)
: OSMR0 = 0x7fffffff; (OSMR0 값 설정)
:
: 위와 같은 플로우로 진행하고
: IRQ인터럽트 벡터에는
: B LED_OUT
:
: LED_OUT:
: some codes to turn on the leds..
:
: 위와 같은 코드를 넣었습니다.
:
: 일단 인터럽트 관련 레지스터가 맞는지 모르겠는데
: IRQ인터럽트 루틴과 LED_OUT 루틴으로 점프를 하지
: 않는 것 같습니다.
:
: 그리고 이지부트에 보면 time.c 파일이 있는데 이지부트
: 인터럽트 벡터에는 모두 error_loop로 뛰도록 되어있는걸로
: 알고 있습니다. time.c와 관련 헤더파일은 어떤 기능을
: 하는 건가요?
:
: 긴 글 읽어주셔서 감사합니다. 답변 부탁드립니다.
OSTimerInit:
ldr r0, =TMR_BASE
ldr r1, =0x00
str r1, [r0, #TMR_OSCR]
ldr r1, =36864
str r1, [r0, #TMR_OSMR0]
ldr r1, =0x01
str r1, [r0, #TMR_OIER]
ldr r1, =0x00
str r1, [r0, #TMR_OWER]
ldr r1, =0x01
str r1, [r0, #TMR_OSSR]
ldr r1, =0x02
str r1, [r0, #TMR_OSSR]
ldr r1, =0x04
str r1, [r0, #TMR_OSSR]
ldr r1, =0x08
str r1, [r0, #TMR_OSSR]
mov pc, lr
.globl OSTimerIrqEnable
OSTimerIrqEnable:
ldr r0, =INT_BASE
ldr r1, =0x00
str r1, [r0, #INT_ICCR]
ldr r1, =0x00
str r1, [r0, #INT_ICLR]
ldr r1, =0x04000000
str r1, [r0, #INT_ICMR]
ldr r1, =0x00
str r1, [r0, #INT_ICIP]
mov pc, lr
이상이 제가 사용하던 ostimer 초기화 함수와 ostimer 인터럽트 인에이블
함수입니다. 도움이 되었으면 좋겠습니다.
c 언어로도 같은 방법으로 작성하면됩니다. 아마도 ezboot의 time.c와
비슷할 겁니다.
아울러 xscale도 arm이기 때문에 arm의 cpsr에 irq를 사용할수 있도록
바꿔줘야 할겁니다. 그리고 irq handler에서는 사용하는 레지스터에 대해
저장을 해야합니다. 그렇지 않으면 인터럽트 처리후 문제가 발생할 수
있습니다.
또 한 가지 irq를 처리해서 처리하는 동안에 레지스터등을 저장하기 위해서
irq stack을 정의해 주어야 할 겁니다. 방법은 ezboot의 start.S에
보시면 svc 모드에서 stack을 설정하는 부분이 있습니다. 그 부분을 참고
하시어 irq 모드로 바꾸고 irq stack을 정의 한후 다시 svc 모드로 돌아와주
면 됩니다. 아마도 svc 모드로 전환하는 부분위에서 해 주면 안전할 겁니다.
저는 이렇게 해서 사용했습니다. uCOSII를 올릴때 사용했었거든요.
도움이 되셨으면 좋겠습니다.
그럼 수고하세요
궁금 wrote..
: 안녕하세요.
: 이번엔 ez-x5를 가지고 인터럽트 관련한 실험을 하고 있습니다.
: 저의 목적은 PXA255의 OS Timer Interrupt를 사용하는 것인데요.
:
: 전체적으로 인터럽트를 사용하려면(OSTIMER나 GPIO)
: 어떤 레지스터를 설정해주어야 하나요?
: PXA255 데이타쉬트를 보고 있는데 잘 안되는군요.
:
:
: 제 프로그램의 플로우는 다음과 같습니다.
:
: start.S에서 CPSR의 I비트 0으로 클리어하고 SVC모드
: mrs r0,CPSR
: bic r0,r0,#0x80
: orr r0,r0,#0x13
: msr CPSR,r0
:
: main으로 점프 후 c언어로 인터럽트 관련 레지스터 설정
: ICLR = 0 (IRQ enable)
: ICIP = 0xffffffff; (all enable)
: ICFP = 0; (FIQ disable)
: ICMR = 0xffffffff; (all enable)
: ICCR = 0;
:
: OSCR = 0; (OS타이머 = 0으로 설정)
: OIER = 0x01; (CHAANEL 0(=OSMR0) 설정)
: OSMR0 = 0x7fffffff; (OSMR0 값 설정)
:
: 위와 같은 플로우로 진행하고
: IRQ인터럽트 벡터에는
: B LED_OUT
:
: LED_OUT:
: some codes to turn on the leds..
:
: 위와 같은 코드를 넣었습니다.
:
: 일단 인터럽트 관련 레지스터가 맞는지 모르겠는데
: IRQ인터럽트 루틴과 LED_OUT 루틴으로 점프를 하지
: 않는 것 같습니다.
:
: 그리고 이지부트에 보면 time.c 파일이 있는데 이지부트
: 인터럽트 벡터에는 모두 error_loop로 뛰도록 되어있는걸로
: 알고 있습니다. time.c와 관련 헤더파일은 어떤 기능을
: 하는 건가요?
:
: 긴 글 읽어주셔서 감사합니다. 답변 부탁드립니다.