240208

Yonggeun Park·2024년 2월 8일
0

임베디드 시스템

  • 특정한 기능, 목적을 수행하도록 마이크로 프로세서와 입출력 장치(peripheral)와, 제어하는 프로그램이(소프트웨어) 내장되어있는 전자기기, 가전제품, 제어장치
  • PC는 범용이라 임베디드가 아니고, 특정한 목적만을 수행하는 pc는 임베디드로 보기도 한다
  • 정보 가전(세탁기, 냉장고), 공장 제어분야, 정보단말기(핸드폰, 네비), 네트워크, 게임기, 항공, 군용, 물류, 차량, 사무, 의료 ... 범위가 굉장히 넓다

유비쿼터스

  • 사용자가 장소에 상관없이 최상의 서비스 제공

임베디드 시스템의 특징

  • 마이크로프로세서/컨트롤러를 비롯한 하드웨어와 소프트웨어 내장하여 특정한 기능 수행
  • 효율성 -> 소형, 경량, 저전력
  • 가격에 민감함
  • 실시간 기능(Real time system)

Real time system

  • 주어진 입력 조건을 주어진 시간 내에 처리
  • 하드 리얼타임 시스템
    - 리얼타임 보장되지 않으면 치명적 오류
    • 제어기기
    • 자동차, 공장에서 많이 사용
  • 소프트 리얼타임
    - 네트워크 장비

임베디드 시스템의 구성

  • 하드웨어
    - 프로세서, 메모리 장치(ROM, RAM)
    • 입출력 장치(GPIO)
  • 소프트웨어
    - 운영체제(OS), 시스템SW(디바이스 드라이브), 응용SW(UI)
    저전력 시스템이 잘 되어있다
    STM 보드는 핀마다 전력을 차단하고 클럭 속도 조절할 수 있음

프로세서

  • CPU(central processor unit), MCU(micro controller unit)의 코어라고도 한다
  • mcu는 주변 기기도 포함한다, one chip processor

프로세서의 구조(코어)

  • MCU는 코어+주변장치를 말한다
  • (범용)레지스터 : 16개(R0~R15)가 있다, 데이터가 저장된다
  • 산술논리 연산장치(ALU) : 레지스터에 있는 데이터만 처리(읽고 저장)할 수 있다
    - 보수기, 연산기, 쉬프터, 상태 flag
  • 제어장치
  • 버스

레지스터

  • 프로세서 내부에서 데이터를 일시적으로 보관하는 기억 장치
  • flip-flop과 latch로 구성
  • 범용 레지스터 : 프로그램 또는 데이터 처리에 필요한 작업을 수행하기 위해 사용
  • 제어용 레지스터 : 프로그램/프로세서 제어, program count
  • 상태 레지스터 : 프로세서의 상태를 나타냄

산술 논리 연산장치(ALU)

  • 산술 연산
  • 논리 연산
  • flag에 기록

제어 장치

  • 명령 해석
  • 데이터 흐름 제어

    ARM(Advanced RISC Machine) - 32비트(고속)
    A(appication용), R(realtime용), M
    thumb - 16비트(메모리 절약)
    cortex
    위 두개의 장점을 합침
    16비트와 32비트 명령어가 합쳐져 있는데 해독기가 분별해준다

프로세서 버스

  • 디지털 회로에서 시스템의 여러 장치들을 연결하는 경로
  • 내부 : 레지스터-ALU 사이 신호 교환 및 다시 레지스터에 전달하는 경로
  • 외부 : 프로세서와 외부 기억장치 사이, 프로세서와 io 장치에 존재

프로세서 종류

  • i386 : 안정성
  • ARM : 간단, 저전력
  • powerPC : 강력한 네트워크의 SoC
  • M68K : 네트워크 장비
  • MIPS : 고속

마이크로 프로세서 : 한개의 ic칩 속에 cpu의 내용을 내장
SoC : System on Chip

  • 여러개의 반도체가 하나로 집적
  • 단일 칩
    MCU, MPU : 프로세서를 내장한 SoC

프로그램 : 프로세서를 통해 어떤 결과를 얻기 위해 받아들일 수 있는 형태로 구성된 명령을 나열하여 구성된 문장

컴파일러 과정

  1. 소스코드 작성
  2. gcc : 전처리기-컴파일-어셈블러-링커 의 네 단계를 자동으로 관리
  • 전처리기 : #으로 최초에 선언하면 읽는다
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진수
어셈블리어

  • 기계어보다 이해하기 쉽다
  • 오류 수정 쉬움
  • 구조 및 하드웨어를 잘 알아야한다
  • 프로세서마다 어셈블리어가 다르다.

명령어

  • op코드 : 실제 취해야 하는 동작(연산자 / add, ...)
  • 오퍼랜드 : 피연산자(a, b, ..)
  • 수행하는 데 3개의 클럭이 필요
  1. 명령어를 읽어온다(fetch)
  2. 명령어를 해석한다(decode)
  3. 명령어를 실행한다(execute)

pipline

  • 산술 연산을 수행하는 동안 다음 명령어를 메모리에서 가져옴

명령어 Set에 따른 프로세서 종류

CISC / RISC

메모리 장치

  • 프로그램과 데이터를 저장하기 위한 공간
  • 주기억장치 : 실행되는 동안 저장 / DRAM
  • 보조기억장치 : 임베디드에서는 사용하기 힘들다
  • cache : cpu 속도를 메모리 속도가 못따라가니까 SRAM을 이용한다

ROM(Read Only Memory)
EEPROM(Electrically Erasable Programmable Read-Only Memory)
flash : 비휘발성 메모리 장치
MMU : 물리메모리와 가상메모리를 매핑해주는 것

입출력 장치

  • 메모리 맵 방식 : 메모리 주소 공간 일부를 활용, 대부분 임베디드 프로세서에서 사용
  • i/o 맵 방식

폴링 방식 : 지속적으로 검사
인터럽트 : 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번이 차례로 점등된다

ARM

1990년 설립
32-bit RISC intellectual property 제공

Programmer's 모델

  • 프로그래머가 프로그램을 작성하는데 필요한 각종 정보
  • 어셈블리어를 의미
    알아야 할 정보

    명령어, 프로세서의 동작모드, 프로세서 내부 레지스터 구성 및 사용법, 메모리 구조, 예외 처리

BSP에 u-boot, kernel을 사용하기 때문에 어셈블리어를 알아야 한다.
LDR : 메모리 값을 레지스터로 복사
STR : 레지스터 값을 메모리로 복사


어드레스 : 프로그램 카운터(pc 주소) - nor flash 메모리
명령 : 어셈블리 명령어 - linux SDRAM
메모리 : SDRAM


레지스터 bank에서는 5-5를 5+(-5)로 계산(2의 보수로 들어가기 때문에)

ASCII Code

16진수문자
0x00Null
0x20space
0x300
0x41A
0x61a

IEEE754
정수는 int형을, 소수는 double형을 기본 자료형으로 함

상수는 RO 영역에 잡힌다

메모리에 저장된 주소값을 load한다

load 상수는 주소로 주고 mov는 32비트보다 작은 값에 사용
ldr r0,=0xFE200000
mov r2, #4

PSR


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개가 순차적으로 켜진다!!!!!!

profile
Dragon_muscle

0개의 댓글

관련 채용 정보