본문 바로가기

Firmware/RTOS

(20)
임베디드 OS 개발 프로젝트 11(Scheduler) . ├── boot │ ├── Entry.S │ ├── Handler.c │ └── Main.c ├── hal │ ├── HalInterrupt.h │ ├── HalTimer.h │ ├── HalUart.h │ └── rvpb │ ├── Interrupt.c │ ├── Interrupt.h │ ├── Regs.c │ ├── Timer.c │ ├── Timer.h │ ├── Uart.c │ └── Uart.h ├── include │ ├── ARMv7AR.h │ ├── memio.h │ ├── MemoryMap.h │ ├── stdarg.h │ └── stdint.h ├── kernel │ ├── task.c │ └── task.h ├── lib │ ├── armcpu.c │ ├── armcpu.h │ ├..
임베디드 OS 개발 프로젝트 10(TASK) . ├── boot │ ├── Entry.S │ ├── Handler.c │ └── Main.c ├── hal │ ├── HalInterrupt.h │ ├── HalTimer.h │ ├── HalUart.h │ └── rvpb │ ├── Interrupt.c │ ├── Interrupt.h │ ├── Regs.c │ ├── Timer.c │ ├── Timer.h │ ├── Uart.c │ └── Uart.h ├── include │ ├── ARMv7AR.h │ ├── memio.h │ ├── MemoryMap.h │ ├── stdarg.h │ └── stdint.h ├── kernel │ ├── task.c │ └── task.h ├── lib │ ├── armcpu.c │ ├── armcpu.h │ ├..
임베디드 OS 개발 프로젝트 9(Timer) . ├── boot │ ├── Entry.S │ ├── Handler.c │ └── Main.c ├── hal │ ├── HalInterrupt.h │ ├── HalTimer.h │ ├── HalUart.h │ └── rvpb │ ├── Interrupt.c │ ├── Interrupt.h │ ├── Regs.c │ ├── Timer.c │ ├── Timer.h │ ├── Uart.c │ └── Uart.h ├── include │ ├── ARMv7AR.h │ ├── memio.h │ ├── MemoryMap.h │ ├── stdarg.h │ └── stdint.h ├── lib │ ├── armcpu.c │ ├── armcpu.h │ ├── stdio.c │ ├── stdio.h │ ├── stdlib..
임베디드 OS 개발 프로젝트 8(Uart Interrupt) 이제 실제 gdb를 활용하여 앞서 설명한대로 동작하는지 점검해보자. 앞서 설명했을 때 IRQ_Interrupt가 걸리면 ARM에서 PC는 강제적으로 0x18로 jump를 하게 된다고 했다. vector_start: LDR PC, reset_handler_addr //0x00 Reset LDR PC, undef_handler_addr //0x04 Undefined Instruction LDR PC, svc_handler_addr //0x08 SVC exception LDR PC, pftch_abt_handler_addr //0x0c Prefetch Abort LDR PC, data_abt_handler_addr //0x10 Data Abort B . //0x14 Not used LDR PC, irq_han..
임베디드 OS 개발 프로젝트 7(Uart Interrupt) . ├── boot │ ├── Entry.S │ ├── Handler.c │ └── Main.c ├── build │ ├── armcpu.o │ ├── Entry.os │ ├── Handler.o │ ├── Interrupt.o │ ├── Main.o │ ├── navilos.axf │ ├── navilos.bin │ ├── navilos.map │ ├── Regs.o │ ├── stdio.o │ └── Uart.o ├── hal │ ├── HalInterrupt.h │ ├── HalUart.h │ └── rvpb │ ├── Interrupt.c │ ├── Interrupt.h │ ├── Regs.c │ ├── Uart.c │ └── Uart.h ├── include │ ├── ARMv7AR.h │ ├─..
임베디드 OS 개발 프로젝트 6(UART 송수신) main에서 uart를 쓰기 위한 tree는 다음과 같다. ├── boot │ ├── Entry.S │ └── Main.c ├── build │ ├── Entry.os │ ├── Main.o │ ├── navilos.axf │ ├── navilos.bin │ ├── navilos.map │ ├── Regs.o │ ├── stdio.o │ └── Uart.o ├── hal │ ├── HalUart.h │ └── rvpb │ ├── Regs.c │ ├── Uart.c │ └── Uart.h ├── include │ ├── ARMv7AR.h │ └── MemoryMap.h ├── lib │ ├── stdio.c │ └── stdio.h ├── Makefile └── navilos.ld hal 파일과 lib 파..
임베디드 OS 개발 프로젝트 5 이전까지 각 모드마다 스택 설정, 메모리 배치가 끝났으므로 main으로 진입 해보자. C언어에서 main으로 들어가기 위해선 Entry.S 에서 main으로 점프 해야 한다. MRS r0, cpsr BIC r1, r0, #0x1F ORR r1, r1, #ARM_MODE_BIT_SYS MSR cpsr, r1 LDR sp, =USRSYS_STACK_TOP BL main 이전에 작성했던 Reset Handler 에서 마지막 Branch Main으로 점프 한다. 점프를 할려면 점프 대상 레이블이 같은 파일에 있어야한다. 다른 파일에 있다면 링커가 링킹할 수 있도록 자동으로 접근할 수 있는 전역 심벌로 만들어야한다. 전역 심벌은 어셈블리어에서는 .global, C언어에서는 extern으로 선언한다. main.c를..
임베디드 OS 개발 프로젝트 A-1 임베디드 OS 개발 프로젝트 부록 A 정리 A.1.1 익섹션 벡터 테이블 ARM은 전원이 켜지면 리셋벡터테이블을 읽는다. 그 아래 벡터테이블은 정의된 상황이 발생하면 강제적으로 PC값이 정의된 오프셋 주소로 강제 변환하게 된다. exception address에는 명령어 한개만(4Byte) 실행 할 수 있다. 따라서 exception address를 따라가면 exception을 처리하는 코드가 있는 것이 아닌 Branch 하는 명령어가 있다. Cortex-M 에서도 IRQ Interrupt가 발생하면 IRQ Vector -> IRQ Handler -> IRQ CallBack 형식으로 코드를 처리하는 걸 알 수있다. 익셉션이 발생하면 진행 중인 프로그램 흐름이 깨지므로 다시 원래 위치로 복귀할 수 있도록 ..