마이크로 프로세서 : 한개의 ic칩 속에 cpu의 내용을 내장
SoC : System on Chip
프로그램 : 프로세서를 통해 어떤 결과를 얻기 위해 받아들일 수 있는 형태로 구성된 명령을 나열하여 구성된 문장
gcc 옵션으로 -save-temps를 입력하면,
$ gcc main.c -o main -save-temps
다 포함된다
어셈블러가 .o 파일을 만든다
근데 아스키코드가 아니라 바이너이파일이기 때문에 읽기가 힘들다
$ hexdump main.o
명령어로 리틀엔디안 방식의 바이트데이터(기계어)를 얻을 수 있다.
링커
메모리를 재배치한다(모든 파일을 합친다)
위에서 초록색으로 표시된 실행파일이 링커를 거친 결과물이다
스타터코드가 있음(초기화)
.a(정적라이브러리) : 빠르고 크다
.so(동적라이브러리) : 느리고 작다
전역변수 int num[10000]
일 때 컴파일하면 실행파일이 만들어지는데, 초기화되지 않은 4만바이트가 메모리를 차지하면 메모리 낭비이다. 그래서 num 변수는 4만개가 있다는 정보만 표기된다
실행할 때 SDRAM 에서 메모리가 잡힌다
기계어 : 프로세서가 이해할 수 있게 0과 1로 표현되는 2진수
어셈블리어
pipline
CISC / RISC
ROM(Read Only Memory)
EEPROM(Electrically Erasable Programmable Read-Only Memory)
flash : 비휘발성 메모리 장치
MMU : 물리메모리와 가상메모리를 매핑해주는 것
폴링 방식 : 지속적으로 검사
인터럽트 : CPU sleep모드로 작동한다
펌웨어는 인터럽트 방식으로 소비전력을 줄인다
ARM은 NVIC(중첩 가능한 인터럽트 코어)레지스터를 사용
선점형으로 해서 인터럽트 발생 시 우선순위에 맞춰서 실행한다
인터럽트 발생 시 다른 인터럽트 발생하면 선점때문에 실행이 안되므로
긴급한 일만 처리하고 빠져나가야한다
Delay를 사용하면 인터럽트 인식이 되지 않는다. > timer 사용해야 할 것
폰 노이만 아키텍쳐 : 버스라인에 명령어, 데이터가 직렬로 연결
하버드 아키텍쳐 : 병렬로 연결
$ vi build.sh
2dw 하면 3단어 지우고, . 누르면 이전 명령 실행한다
그렇게
이렇게 만든 뒤
$ chmod u+x build.sh
$ ./build.sh
실행하면
금방 확인만 하고 끝난다
$ make clean 하고
다시
$ ./build.sh
하면 쭈루룩 make한다
그 뒤
$ ARCH=arm make tags
$ ls -l tags
$ vi ~/.vimrc
F -> 맨 아래에 붙여넣기 -> dd 후 P 하면 커서 위에 붙여넣기
$ vi -t board_init_r
:tj board_init_r
2 enter
따라가기 ctrl+], 복귀하기 ctrl+t
~/pi_bsp/u-boot$ vi arch/arm/cpu/armv7/start.S
:tj _start
4 enter
bl : 실행하고 다시 리턴 하라는 의미
두 사진에 있는 대로 친다
복사 해서 nfs로 보낸다
해당 위치로 옮긴다
이후 rpi4를 리부트한다(u-boot로 진입 x)
그러면 LED가 1,2,3,4번이 차례로 점등된다
1990년 설립
32-bit RISC intellectual property 제공
명령어, 프로세서의 동작모드, 프로세서 내부 레지스터 구성 및 사용법, 메모리 구조, 예외 처리
BSP에 u-boot, kernel을 사용하기 때문에 어셈블리어를 알아야 한다.
LDR : 메모리 값을 레지스터로 복사
STR : 레지스터 값을 메모리로 복사
어드레스 : 프로그램 카운터(pc 주소) - nor flash 메모리
명령 : 어셈블리 명령어 - linux SDRAM
메모리 : SDRAM
레지스터 bank에서는 5-5를 5+(-5)로 계산(2의 보수로 들어가기 때문에)
ASCII Code
16진수 | 문자 |
---|---|
0x00 | Null |
0x20 | space |
0x30 | 0 |
0x41 | A |
0x61 | a |
IEEE754
정수는 int형을, 소수는 double형을 기본 자료형으로 함
상수는 RO 영역에 잡힌다
메모리에 저장된 주소값을 load한다
load 상수는 주소로 주고 mov는 32비트보다 작은 값에 사용
ldr r0,=0xFE200000
mov r2, #4
subs : 수행 결과를 PSR에 반영하라는 뜻
bne : branch not equal - 연산 결과가 같지 않으면 delay, 같으면 다음 줄로 넘어감
LSL : logical shift left
6번 > 7번 > 8번 > 9번 GPIO
즉, 1번, 2번, 3번, 4번 LED를 약 0.7초 씩 순서대로 켰다 끈다
5~8번 LED를 키기 위해 3가지 변화
이후
$ cd ~/pi_bsp/u-boot
$ ./build.sh
$ cp u-boot.bin /srv/nfs/
pi에서
$ cd /mnt/ubuntu_nfs/
$ sudo cp u-boot.bin /boot/firmware/.
$ sudo reboot
위와 같이 실행하면 LED 8개가 순차적으로 켜진다!!!!!!