본문 바로가기

Firmware

(38)
임베디드 OS 개발 프로젝트 11(Context Switching - 1) . ├── 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 개발 프로젝트 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를..