본문 바로가기

Embedded Engineer

(92)
임베디드 OS 개발 프로젝트 1 http://www.yes24.com/Product/Goods/84909414 임베디드 OS 개발 프로젝트 무작정 따라하기(저자:이만우) 책 구매후 시작.. 책에서 쓰는 QEMU는 ARM64 리눅스 분석에 사용한적 이 있음 다만 여기선 QEMU-SYSTEM-AARCH64 -> QEMU-SYSTEM-ARM 으로 사용함. RTOS를 만들기 위해 처음으로 제작하는 파일은 ENTRY.S 파일이다. WHY?? ARM 코어에 전원이 들어가면 리셋 벡터에 있는 명령을 실행한다. 0x00000000 주소 시작한다. 현재 작성된 Entry.S 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 .text ...
stm32cubeIDE (Eclipse) Import Project Header: 프로젝트 폴더를 옮기거나 github에서 다운 받은 프로젝트를 import 방법. 우선 프로젝트를 다운 받는다. 다운 받으면 위 그림과 같이 STM32CUBEMX 와 .PROJECT 파일이 있다 여기서 문제는 IDE를 바로 실행 시키면 ECLIPSE에서 PROJECT를 인식을 못하기 때문에 몇가지 작업이 필요하다 먼저 CUBEMX를 실행 시킨다. Project Name을 복사한다. 다운받은 프로젝트가 바로 실행되지 않는 이유는 상위 디렉토리와 프로젝트 이름이 일치하지 않아 발생한 문제이다. (실제로는 동일하게 수정하지 않아도 문제 없이 실행 된다 하지만 향 후 CubeMX로 프로젝트를 수정 할 경우 CubeMX가 열리지 않는 문제가 발생한다.) 다운받은 폴더 또는 프로젝트 상위폴더 이름을 ..
arch_local_irq_disable() arch_local_irq_disable 분석 boot_cpu_init에 앞서서 먼저 local interrupt requst 모두 disable 시킨다. (문c 블로그 참조: http://jake.dothome.co.kr/alternative/) 1 2 3 4 5 6 7 8 9 10 11 static inline void arch_local_irq_disable(void) { asm volatile(ALTERNATIVE( //조건에 따라 1번 명령어(초기 부팅 할 때), 2번 "msr daifset, #2 // arch_local_irq_disable", //processor state 에서 DAIF 중 I를 1로 setting 하여 irq_disable 함 "msr_s " __stringify(SYS..
boot_cpu_init() boot_cpu_init 분석 cpu 러닝 상태로 만들기 위해 online, active, present, possible 각각 4개 기능을 true 로 설정해 준다. (문c블로그 참조: http://jake.dothome.co.kr/boot_cpu_init/) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 __attribute__((optimize("-O0"))) void __init boot_cpu_init(void) { int cpu = smp_processor_id(); /* Mark the boot cpu "..
smp_setup_processor_id() smp_setup_processor_id 함수 분석 리눅스는 기본적으로 물리적 id를 사용하지 않고 부트된 물리 cpu를 logical id 0번으로 배치하여 사용한다고 한다. (문c 블로그 참조:http://jake.dothome.co.kr/smp_setup_processor_id/) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 __attribute__((optimize("-O0"))) void __init smp_setup_processor_id(void) { u64 dbg_x1, mpidr; mpidr = read_cpuid_mpidr(..
early_ioremap_init(void) early I/O 매핑을 위해 fixmap 영역에 0~6개의 256k 의 가상 주소 영역을 매핑한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 __attribute__((optimize("-O0"))) void __init early_ioremap_setup(void) { int i; u64 dbg_x1,dbg_x2,dbg_x3; for (i = 0; i
5장(프로시저) 6판에서는 5장 처음에 라이브러리가 나오지만 7판에서는 바로 스택이 나온다. ​ ​ ​ 스택 연산 ​ 스택은 LIFO 구조라고도 부른다. ​ 스택은 스택 포인터 레지스터라고 하는 ESP 레지스터를 사용하여 CPU가 직접 관리하는 메모리 배열이다. ​ ESP 레지스터는 스택에 있는 어떤 위치에 대한 32비트 오프셋을 저장한다. ​ ESP는 항상 스택의 맨 위에 추가된, 즉 PUSH 된 마지막 정수를 가리킨다. ​ Push 연산 32비트 Push 연산은 스택 포인터를 4씩 감소시키고 값을 스택 포인터가 가리키는 스택 위치로 복사한다. ​ 16비트면 2씩 감소하겠네 ​ POP 연산 ​ POP 연산은 스택에서 값을 제거한다. ​ 값이 스택에서 팝된 후에 스택 포인터는 스택의 그 다음 높은 주소를 가리키도록 증가..
4장(데이터 전송, 주소지정과 산술연산) 피연산자 유형 ​ 직접 오프셋 피연산자 ​ .data ​ arrayB BYTE 10h,20h,30h,40h,50h ​ .code ​ mov al, arrayB ;10h ​ mov al.[arrayB+1] ;20h ​ arrayB+1 과 같은 수식은 상수를 변수의 오프셋에 더하여 유효 주소 라고 하는 것을 계산해낸다. ​ 유효 주소를 대괄호로 둘러쌓은 것은 그 주소의 메모리 내용을 얻기 위하여 주소 수식을 역참조 함을 나타낸다. ​ MASM 에서는 대괄호가 필수 사항은 아니다. ​ mov al, arrayB+1 = mov al,[arrayB+1] ​ ​ .data ​ arrayW WORD 100h, 200h, 300h ​ .code ​ Mov ax, arrayW ;100h ​ Mov ax, [arrayW+..