2021 동아리 활동
IVIS wiki
목차
청출어람 멘토링
1회차
2회차
- Entry.S를 어셈블러로 컴파일한 후 바이너리 덤프
$ arm-none-eabi-as -march=armv7-a -mcpu=cortex-a8 -o Entry.o ./Entry.S $ arm-none-eabi-objcopy -O binary Entry.o Entry.bin $ hexdump Entry.bin
- 링커로 실행 파일 만들기
$ arm-none-eabi-ld -n -T ./navilos.ld -nostdlib -o navilos.axf boot/Entry.o $ arm-none-eabi-objdump -D navilos.axf
- QEMU로 실행하기
$ qemu-system-arm -M realview-pb-a8 -kernel navilos.axf -S -gab tcp::1234,ipv4
- gdb와 QEMU 연결하기
$ arm-none-eabi-gdb (중략) (gdb) target remote:1234
- 빌드 자동화하기
- Makefile을 통해 빌드를 자동화한다. (실행할 때 마다 명령어를 하나하나 다 쓸 필요가 없음)
-
- ARM 레지스터에 대한 설명
- ARM 아키텍처 어셈블리
실행 과정 (mac 기준)
- 터미널1 실행
$ cd Downloads/Navilos-51c9..... $ make clean $ make all $ make debug (실행하면 QEMU 창이 뜸)
- 터미널2 실행
$ cd Downloads/Navilos-51c9.....(터미널1과 같은 경로로 들어가기) $ make gdb $ (gdb) target remote:1234 $ (gdb) file build/navilos.axf $ (gdb) list (list 결과로 잘 실행되었는지 확인) $ (gdb) i r (info register와 같은 뜻) $ (gdb) s (step임) $ (gdb) i r (반복하면서 순차적으로 변하는 결과값 확인할 수 있음)
4장
- 소스 코드
- 4.2절 https://github.com/navilera/Navilos/archive/51c9cd9.zip
- Entry.S 파일에 vector_end: .space 1024, 0 으로 수정
- 4.3.1절 https://github.com/navilera/Navilos/archive/fa4510c.zip
- 4.2절 https://github.com/navilera/Navilos/archive/51c9cd9.zip
- 코드 4.6 Makefile을 수정해서 헤더 파일 경로 지정
INC_DIRS = include ... $(CC) -march=$(ARCH) -mcpu=$(MCPU) -I $(INC_DIRS) -g -o $@ $<
- 코드 4.7 메인함수로 점프하는 코드 추가
BL main
- boot/Main.c 파일을 만들고 코드 4.8의 내용을 Main.c 파일에 채워넣는다.
- 코드 4.8 Main.c 파일 초기 코드
# include "stdint.h" void main(void) { uint32_t* dummyAddr = (uint32_t*)(1024*1024*100); *dummyAddr = sizeof(long); }
- 코드 4.9 C언어 파일을 컴파일하기 위한 수정된 Makefile
// Makefile 수정된 부분만 옮겨적음 MAP_FILE = build/navilos.map . C_SRCS = $(wildcard boot/*.c) C_OBJS = $(patsubst boot/%.c, build/%.o, $(C_SRCS)) . $(C_OBJS) . $(C_OBJS) -Map=$(MAP_FILE) . build/%.o: $(C_SRCS) mkdir -p $(shell dirname $@) $(CC) -march=$(ARCH) -mcpu=$(MCPU) $(INC_DIRS) -c -g -o $@ $<
- Makefile 수정!!!!!
ARCH = armv7-a MCPU = cortex-a8 CC = arm-none-eabi-gcc AS = arm-none-eabi-as LD = arm-none-eabi-ld OC = arm-none-eabi-objcopy LINKER_SCRIPT = ./navilos.ld MAP_FILE = build/navilos.map ASM_SRCS = $(wildcard boot/*.S) ASM_OBJS = $(patsubst boot/%.S, build/%.os, $(ASM_SRCS)) C_SRCS = $(wildcard boot/*.c) C_OBJS = $(patsubst boot/%.c, build/%.o, $(C_SRCS)) INC_DIRS = -I include navilos = build/navilos.axf navilos_bin = build/navilos.bin .PHONY: all clean run debug gdb all: $(navilos) clean: @rm -fr build run: $(navilos) qemu-system-arm -M realview-pb-a8 -kernel $(navilos) debug: $(navilos) qemu-system-arm -M realview-pb-a8 -kernel $(navilos) -S -gdb tcp::1234,ipv4 gdb: arm-none-eabi-gdb $(navilos): $(ASM_OBJS) $(C_OBJS) $(LINKER_SCRIPT) $(LD) -n -T $(LINKER_SCRIPT) -o $(navilos) $(ASM_OBJS) $(C_OBJS) -Map=$(MAP_FILE) $(OC) -O binary $(navilos) $(navilos_bin) build/%.os: $(ASM_SRCS) mkdir -p $(shell dirname $@) $(CC) -march=$(ARCH) -mcpu=$(MCPU) $(INC_DIRS) -c -g -o $@ $< build/%.o: $(C_SRCS) mkdir -p $(shell dirname $@) $(CC) -march=$(ARCH) -mcpu=$(MCPU) $(INC_DIRS) -c -g -o $@ $<
3회차
5장
- 5.1절 https://github.com/navilera/Navilos/tree/6c43617d1cd004da3c4af8a52e0dc0f2e62832ac
- 5.2절 https://github.com/navilera/Navilos/tree/ebe633ef48342bb9bb856d5a930662a23ba1a616
- 5.3절 https://github.com/navilera/Navilos/tree/d245167799798f7709eadfab43673254b771358d
- 5.4절 https://github.com/navilera/Navilos/tree/223722b767150601b78c74ee51c37c8d8ac85144
- 5.5절 https://github.com/navilera/Navilos/tree/c484d81dbc1e7cbc8651b2f9ac1993ea215c09ea
- lib 디렉토리를 만들고 그 안에 stdio.c와 stdio.h라는 두 파일을 생성한다.
- 코드 5.7 stdio.h의 초기 코드
#ifndef LIB_STDIO_H_ #define LIB_STDIO_H_ uint32_t putstr(const char* s); #endif /* LIB_STDIO_H */
- stdio.c에는 putstr() 함수의 구현이 있음
- 코드 5.8 stdio.c의 초기 코드
#include "stdint.h" #include "HalUart.h" #include "stdio.h" uint32_t putstr(const char* s) { uint32_t c = 0; while(*s) { Hal_uart_put_char(*s++); c++; } return c; }
- 코드 5.9 lib을 포함해 빌드 가능하도록 수정한 Makefile
// 수정된 부분만 작성 lib . C_SRCS += $(notdir $(wildcard lib/*.c)) . -I lib
- 코드 5.10 "Hello World"를 출력하는 main() 함수
#include "stdint.h" #include "HalUart.h" #include "stdio.h" // 수정된 부분 static void Hw_init(void); void main(void) { Hw_init(); uint32_t i = 100; while(i--) { Hal_uart_put_char('N'); } Hal_uart_put_char('\n'); // 수정된 부분 putstr("Hello World!\n"); // 수정된 부분 } static void Hw_init(void) { Hal_uart_init(); }
- "Hello World!"가 출력되는지 확인 !
// 오브젝트 파일을 역어셈블하여 어셈브리어 코드를 뽑는 명령어 $ arm-none-eabi-objdump -d Uart.o
- 코드 5.12 최적화한 Hal_uart_get_char() 함수
// 수정 된 부분 if (Uart->uartdr.all & 0xFFFFFF00) . Uart->uartrsr.all = 0xFF;
- 코드 5.13 한 번 더 최적화한 Hal_uart_get_char() 함수
// 수정 된 부분 data = Uart->uartdr.all; . if (data & 0xFFFFFF00) . return (unit8_t)(data & 0xFF);
- 코드 5.14 UART 입력을 받는 main() 함수
void main(void) { Hw_init(); uint32_t i = 100; while(i--) { Hal_uart_put_char('N'); } Hal_uart_put_char('\n'); putstr("Hello World!\n"); /* 수정된 부분 */ i = 100; while(i--) { uint8_t ch = Hal_uart_get_char(); Harl_uart_put_char(ch); } }
- 'Hello World!' 출력 테스트
$ qemu-system-arm -M realview-pb-a8 -kernel build/navilos.axf -nographic
- debug_printf() 함수 테스트
$ qemu-system-arm -M realview-pb-a8 -kernel build/navilos.axf -nographic
6장
4회차
5회차
6회차
7회차
8회차
취업동아리
창업동아리
팀명
- 핀아 - "오랜 정성과 사랑으로 핀 꽃같은 아이"라는 뜻으로 순우리말
아이템(어플리케이션) 디자인
- https://ovenapp.io/view/5rIUDMQrJvdFnqgsFvk0jKMbDSti7y0O/9up7T
- https://ovenapp.io/view/5rIUDMQrJvdFnqgsFvk0jKMbDSti7y0O/SIJ8W
OT
- 2021년 5월 11일
심사 발표
- 2021년 6월 1일(화) 13:40
- 장소 : 부산
2021년도 SW창의캠프 해커톤 대회
- 2021년 04월 30일 ~ 2021년 05월 01일
- 핀아팀 - '씽씽아 달려라'
- Mobile-X팀 - '저녁 메뉴 뭐먹지?'
USG AI-데이터 문제해결 제조혁신 경진대회
- http://aifactory.space/gntp
- 주최/주관 및 참가 대상
- 주최 : 경남지역혁신플랫폼
- 주관 : 경남테크노파크
- 운영 : AIFactory
- 참가 대상 : USG 소속대학 재학생 (대학원생포함)