-
용어 정리공부/Embedded 2024. 4. 28. 16:21
Bootloader : 부팅 시 동작되는 프로그램
Disk에 저장되어 있는 운영체제를 실행 시키는 역할. -> RaspberryPi는 자체 부트로더를 사용
- 다중 OS 부팅 기능
- 장치 제어 및 테스트 기능
- 부팅 옵션 관리
- hw 초기화
Ubuntu : GPUP2
Window : Bootmgr
ARM : U-Boot
OS는 App가 메모리에 직접 접근하는 것을 막음
-> 부트로더 단계에서는 메모리에 직접 접근 가능
CMOS : H/W chip
- 비휘발성 메모리, 컴퓨터의 설정 정보를 저장, 배터리 전원을 사용
BIOS : S/W
- 기본적인 I/O를 위한 펌 웨어, 컴퓨터 부팅 시 바로 BIOS가 동작 시작
- CMOS에 저장된 부팅 설정 정보를 읽어와서 부팅
- CMOS의 설정 값들을 변경 가능
- 요즘은 UEFI로 대체됨
UEFI, Unified Extensible Firware Interface, 통일 확장 인터페이스
- BIOS를 대체하고, 화려한 UI/ 2.2TB 이상의 디스크 사용을 위한 GPT(GUID Partition Table) 지원
POST : Power on self test, BIOS에서 Power를 켜자마자 주변 장치들을 검사하는 과정.
ROM -> SPL -> U-BOOT -> KERNEL
ARM 부트로더의 U-boot 동작 상세
--
Device Driver
- Firmware
Firmware에서는 Memory Mapped I/O 를 사용해 Application이 H/W 직접 제어
- OS
리눅스와 같은 OS 환경에서는 App는 H/W 영역에 직접 접근이 불가능 하기 때문에, Kernel의 도움을 받아야 함
디바이스 드라이버 필요성
테스트마다 매번 커널을 빌드할 필요가 없어서 개발 시간이 단축됨.
App - Device Driver - Kernel(API) - H/W
커널 모듈 : 커널 내부에 삽입될 수 있는 Build 된 Binary 파일을 의미
- .ko 확장자
- insmod / rmmod
커널 모듈 : 커널에 집어 넣을 수 있는 덩어리
디바이스 드라이버 : H/W 를 제어할 수 있는 프로그램
App 는 Kernel 안에서 동작 중인 디바이스 드라이버에 직접 접근이 불가
-> Device Driver와 연결된 Device File(장치 파일)을 만들고, App이 장치 파일에 신호를 보내서 Device Driver가 H/W를 제어하도록 한다.
chrdev : 캐릭터 디바이스 드라이버
- Byte 단위로 값 전달
blkdev : 블록 디바이스 드라이버
- kb 이상의 '블록' 단위로 값 전달
- Disk 장치에 사용되는 DD
netdev : 네트워크 다비이스 드라이버
- socket을 열고 ioctl이라는 System call로 장치를 제어
Makefile
2.6 커널 이후부터 kbuild 시스템 사용, gcc 를 사용한 모듈 빌드 불가
커널 헤더에 있는 Makefile로 make 후 현재 디렉토리로 결과물들을 가지고 옴.
커널 로그 레벨
- 0 ~ 7의 레벨로 메시지의 중요도를 나타냄
pr_emerg()
pr_alert()
pr_crit()
pr_err()
pr_notince()
pr_info()
pr_debug()
Device File.
/dev/ 에 등록되는 파일을 디바이스 노드 라고 함.
주번호 : 기기 종류, 같은 기능을 하는 디바이스가 여러 개 있으면, 같은 주번호
부번호 : 같은 종류 Device 구분 용도
mknod : 디바이스 파일을 만드는 유틸리티
mknod 파일명 파일종류 주번호 부번호
<linux/fs.h> : 파일 시스템 접근을 위한 헤더, fops 구조체 사용을 위한 헤더
static struct file_operations fops = {
.owner = THIS_MODULE,
.open = deviceFile_open,
.release = deviceFile_release,
};
접근 순서
syscall(open()) -> .open -> deviceFile_open()
cat 명령어 : 특정 파일 내용을 읽어서 출력함
내부적으로 특정 파일에 open(), close(), system call을 보냄
int register_chrdev() : 등록, major / 장치 파일 이름 / fops
void unregister_chrdev() : major / 장치 파일 이름
open / read / write / close
Device File을 Device Node라 하며, app 개발자는 syscall을 이용해 Device file에 접근해 장치를 제어한다.
<linux/device.h> : device file 관리용 header
device_create() / class_create()
NOD_MAJOR : 디바이스 파일의 주 번호
class 구조체 변수 생성 : 디바이스 파일을 관리하는 구조체 변수
dev 변수 : 장치 구분을 위한 번호 보관
// major num을 0 으로 할당하면 커널이 동적으로 주 번호를 할당하여 return 함
NOD_MAJOR = register_chrdev(0, NOD_NAME, &fops);
// 주번호와 부번호를 조합하여 dev_t 타입으로 return 함
dev = MKDEV(NOD_MAJOR, 0);
// device 파일 생성
cls = class_create(NOD_NAME);
// device 파일 삭제
dive_destroy(cls, dev);
유저 공간과 커널 공간의 데이터 공유
<linux/uaccess.h>
copy_to_user() : kernel -> user
copy_from_user() : user -> kernel
put_user() : 1 byte 단위로 데이터를 전송
get_user() : 1 byte 단위로 데이터를 복사
<sys/ioctl.h>
int ioctl(int fd, unsigned long request, unsigned long arg)
파일 디스크립터, cmd para 규칙, arg
read/write만으로는 장치와 통신을 할 수 없음 -> ioctl을 사용
ex. ioctl(fd, _IO(0, 3), 16);
fops 등록
.unlocked_ioctl = ~~~~
cmd para
명령 코드 작성 규격, 커널에서의 안전한 명령 코드 작성을 위해 만들어짐 (32bit)
-> 일일히 지키기는 시간이 많이 들기 때문에, 매크로를 사용
_IO(type, number)
_IO(0, 3) 부터 사용 //1, 2는 시스템 예약
main
char buf[30] = "THIS IS APP DATA!"; int main(){ int fd = open(NOD_NAME, O_RDWR); if( fd<0 ){ printf("ERROR\n"); exit(1); } ioctl(fd, _IO(0,3), buf); printf("Transfer Data!\n"); close(fd); return 0; }
copy_from_user((void*)buf, (void*)arg, sizeof(buf));
static ssize_t deviceFile_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ pr_alert("command number : %d\n", cmd); char buf[30]; int ret; switch(cmd){ case _IO(0,3): ret = copy_from_user((void*)buf, (void*)arg, sizeof(buf)); pr_info("app data : %s\n", buf); break; } return 0; }
copy_to_user((void*)arg, (void*)buf, sizeof(buf));
static ssize_t deviceFile_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ pr_alert("command number : %d\n", cmd); char buf[30] = "THIS IS KERNEL DATA!"; int ret; switch(cmd){ case _IO(0,3): ret = copy_to_user((void*)arg, (void*)buf, sizeof(buf)); pr_info("Trasfer Data!\n"); break; } return 0; }
구조체를 통한 데이터 전송
static ssize_t deviceFile_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ pr_alert("command number : %d\n", cmd); struct Node readData; struct Node writeData = {255, "Kernel Struct Data"}; int ret; switch(cmd){ case _IO(0,3): ret = copy_to_user((void*)arg, &writeData, sizeof(struct Node)); pr_info("Trasfer Data!\n"); break; case _IO(0,4): ret = copy_from_user(&readData, (void*)arg, sizeof(struct Node)); pr_info("Read Struct Data : %c %s\n", readData.n, readData.buf); break; } return 0; }
sleep 1 s
usleep -> 마이크로 초 , 1,000,000 = 1 s
proc 파일 시스템 => ...
SCI 인터페이스 : 르네사스에서 제공하는 시리얼 통신용 인터페이스
- 총 6 개의 채널
- SPI / I2C / UART 등 유선통신을 지원
DS3231의 레지스터 맵.
Slave Address
Timer 4
4 개의 타이머 존재, 8MHz 가 기본
Prescaler : 8000-1 //0.001에 한 번 카운팅
Counter Period : 1000-1 //1000 회 = 1 초
ADC : 아날로그 to Digital
NVIC
https://velog.io/@pikamon/STM32-6Nested Vectored Interript Controller, 중첩된 벡터 인터럽트 컨트롤러
Arm에서 제작한 MCU에 있는 인터럽트 처리기
IRQ : 인터럽트 리퀘스트, 주변 장치에 의해 발생된 인터럽트에 대응하는 신호
ISR : 인터럽트 서비스 루틴, 인터럽트 처리 작업 수행, 우선순위를 고려하여 재귀적 처리
Vector Table : 인터럽트 시 callback()에 대한 위치 정보가 저장된 표
0에 가까울 수록 높은 우선순위
EXTI : 0
Time base : 15 - HAL_Delay(100); //0.1초 sleep
EXTI 컨트롤러 : 외부 인터럽트 이벤트 컨트롤러
EXTI 컨트롤러를 통해 NVIC로 전달된다.
Port가 다른 인터럽트 핀 설정 불가 : 같은 EXTI 레지스터를 사용하기 때문에 동시 설정이 불가하다.
(PA8 과 PC 8 은 동시 인터럽트 설정 불가.)
UART
전이중 방식 통신
BSPBoard Support Package 로 보드를 동작 시키기 위해 필요한 소프트웨어 묶음
시스템 별 BSP
- Firmware, RTOS System : Firmware, User app
- Non-RTOS System : User app, OS(Kernel), Firmware
- 부트로더, 커널 이미지, 파일 시스템 이미지
startup.s- 어셈블리로 작성
- IDE에서 반자동으로 작성해줌
- 메모리 초기화
- C언어가 구동되기 위한 준비
- C언어로 작성된 Firmware의 Main 함수 호출
팹리스팹 : 반도체 공장
팹 없이 IC 설계를 하는 업체, ARM 퀼컴, Apple, 삼성 등
브링업(Bring up)한번도 부팅이 안된 디바이스를 살리는 작업
시스템 소프트웨어 개발의 첫 단계
부트 로더, 리눅스 드라이버 코드 수정
페리페럴 . 주변 장치
반도체
실리콘 -> 잉곳 -> 웨이퍼 -> IC
패키징 : 플라스틱으로 감싸는 것
칩셋과 소자들을 고정 시키는 기판 : PCB
ST/Renesas 보드 스펙- 평가보드, FPB 평가보드 (빠른 프로토타이핑 보드)
- 아두이노 호환
- 우노보드 지원
- 5 핀 USB 케이블
반도체 공장 : 팹
팹이 없는 회사들에게 회로만 받아 생산해주는 사업 : 파운드리 사업
팹 리스 업체
IC설계 능력 + 팹 : IDM
Core + Ram + Flash : MUC
RA6E1 MCU
Core : Arm Cortex-M33
RAM : 256KB
Flash : 1MB- STM32F103RBT6 칩셋.
(XT, XR 을 본다면 선택) < 이게 답임'공부 > Embedded' 카테고리의 다른 글
[PyQT] PiCamera + OpenCV (0) 2024.05.09 PyQT _ 실습 (2) 2024.05.07 STM32 - Firmware LED / Timer (0) 2024.04.24 SPI 통신 (0) 2024.04.22 [라즈베리파이] senseHat LED Controller (0) 2024.04.17