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

실행 과정 (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장

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장

  • 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회차

취업동아리

창업동아리

팀명

  • 핀아 - "오랜 정성과 사랑으로 핀 꽃같은 아이"라는 뜻으로 순우리말

아이템(어플리케이션) 디자인

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 소속대학 재학생 (대학원생포함)