ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 용어 정리
    공부/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-6

     

    [STM32] NVIC & EXTI

    NVIC란 Nested Vectored Interrupt Controller의 줄임말로 Cortex-M MCU 내부에서 인터럽트를 받아들이고 처리하기 위해 사용되는 인터럽트 컨트롤러를 말한다.EXTI란 External Interrupt의 줄임말로, MCU 외부에 있는

    velog.io

     

    Nested 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

    전이중 방식 통신

    https://shek.tistory.com/41

     

    UART 통신 이론

    UART(범용 비동기화 송수신기: Universal asynchronous receiver/transmitter)는 병렬 데이터의 형태를 직렬 방식으로 전환하여 데이터를 전송하는 컴퓨터 하드웨어의 일종이다. UART는 일반적으로 EIA RS-232, RS-4

    shek.tistory.com


    BSP

    Board 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 _ 실습  (2) 2024.05.07
    STM32 - Firmware LED / Timer  (0) 2024.04.24
    SPI 통신  (0) 2024.04.22
Designed by Tistory.