Thursday, September 26, 2019

저비용 비선점형 멀티태스킹: Part 1, 간단한 FM 수신기 만들기

  • 아래 링크의 글을 구글번역 + 다듬기 했습니다.
  • 가격은 시장에서 제품의 성공에 결정적인 영향을 미칩니다. 비용을 보는 한가지 방법은, 시스템에 존재하는 리소스의 총량에 대한 최종 제품의 필수 기능의 비율입니다. 우리 엔지니어들은 시스템 비용을 줄이면서 더 많은 기능을 제공하도록 끊임없이 노력하고 있습니다. 따라서 시스템에서 사용 가능한 모든 리소스를 효과적으로 관리해야합니다.
  • 플래시 메모리, RAM 및 CPU 처리량 (처리 능력)은 중요한 마이크로 컨트롤러 리소스입니다. 특히 마이크로 컨트롤러의 가격이 사용 가능한 리소스의 양에 관련(비례)되기 때문입니다.
  • 또한, 향후 엔지니어링 노력을 줄이고 향후 최종 제품을 향상시키는 역량을 단순화하기 위해 펌웨어는 이식 가능하고 유지 보수가 가능하며 코드를 재사용 할 수 있어야합니다. 기능이 풍부한 제품을 만들기 위해 USB, 그래픽 및 이더넷과 같은 여러 하위 시스템을 통합해야합니다.
  • 이것은 위의 과제에 대한 해결책을 제시하는 3 부로 구성된 기사 시리즈의 1 부입니다. 이 첫 번째 기사에서는 멀티 태스킹의 기본 사항을 검토하고 기존의 멀티 태스킹 접근 방식이 무엇인지 논의한 다음 매우 간단한 FM 플레이어 시스템을 만들어 state machine을 사용하는 저렴한 대안의 기본 사항을 연구합니다.
  • 2 부에서는 state machine 기반 멀티 태스킹 시스템 구축을 위한 설계 방법론을 학습합니다. USB, 파일 시스템, LCD 및 정전 식 터치 감지 기능이 통합 된 복잡한 MP3 플레이어 시스템을 구축하여 작업 설계, 작업 간 통신 및 우선 순위 지정을 다루었습니다.
  • 3 부에서는 방금 생성한(2부에서 만든) 시스템의 스케줄링 방법에 대해 논의합니다. 디자인 타임 CPU로드 밸런싱을 사용하는 시간 분할 방식이 소개되고 일부 개선 사항 및 진단 방법 / 도구가 논의됩니다.
  • RTOS를 이용한 멀티 태스킹
    • 저비용 시스템에서 멀티 태스킹의 필요성은 주로 사용자에게 가능한 빨리 응답해야 한다는 필요성에 의해 발생합니다. 백엔드 작업에 동일한 시간이 걸리더라도 사용자 입력에 빠르게 응답하는 제품이 더 빨리 실행되는 것으로 보입니다. 시스템은 백엔드 작업을 수행함과 동시에 사용자 입력을 서비스해야합니다.
    • 멀티 태스킹 시스템은 각 작업 조각을 순차적으로 실행하여 여러 작업을 동시에 수행하는 것으로 보이게 합니다. 멀티 태스킹의 두 가지 중요한 측면은 작업이 전환되는 동안 시간 간격의 규칙 성과 테스크 스위치간에 컨텍스트의 안정적인 복원입니다.
    • 일반 RTOS는 타이머 인터럽트를 통해 이를 달성합니다. 이러한 각 주기적 인터럽트에서 RTOS는 현재 실행중인 작업의 컨텍스트 정보를 저장하고 대기열에 있는 다음 작업의 컨텍스트 정보를 복원합니다. 이러한 "저장"및 "복원"에는 종종 스택 및 코드 실행 포인터와 함께 많은 CPU 상태 및 작업 레지스터가 포함됩니다. 이 저장된 컨텍스트 정보는 모두 RAM을 사용합니다.
    • RTOS는 또한 작업이 갑자기 중단되고 다른 작업이 예약 될 수 있으므로 task간 통신을 위한 복잡한 방법이 필요합니다. RTOS가 공통 리소스에 액세스하는 어러 task의 비동기 실행을 schedule하므로 상호 배제 및 세마포어가 필요합니다. 이러한 문제를 해결하기 위해 RTOS는 복잡한 메시징 및 mutual-exclusion을 구현합니다. 이것은 소중한 RAM, 플래시 메모리 및 CPU 처리량을 사용합니다.
    • 충분히 복잡한 시스템에는 이러한 모든 전략이 필요할 수 있지만 8 비트 및 16 비트 마이크로 컨트롤러에서 실행되는 대부분의 저비용 시스템에서는 최소한의 오버 헤드로 멀티 태스킹이 가능합니다.
  • 스테이트 머신 : 멀티 태스킹에 대한 다른 접근법
    • 상태 머신은 현재 상태 및 전환 기준에 따라 한 상태에서 다른 상태로 전환되는 상태 핸들러의 논리적 모음입니다. 상태 머신은 Software 상에서 다른 코드 섹션으로 전환하는 반복적으로 호출 되는 함수로 구현 될 수 있습니다. State변화는 시스템에 설계된 다양한 요소에 따라 달라집니다. 상태 머신은 일반적으로 "switch"문을 사용하여 C 프로그래밍 언어로 구현됩니다. 각 상태에는 상태 번호가 할당되며 상태 변수는 상태 머신의 어느 부분이 실행되는지 결정합니다.
    • 아래의 그림 1은 두 가지 간단한 C 언어 함수를 보여줍니다. 첫 번째는 다양한 FM 라디오 사용자 입력을 처리하는 함수입니다. Read_Buttons ()라고하는 입력 캡처 함수은 사용자 입력에 따라 5 개의 상태 중 하나를 상태 변수 "FmState"에 할당합니다. “Service_FMRadio_Inputs ()” 함수는 무한 루프에서 Read_Buttons ()와 함께 반복적으로 호출됩니다. 사용자 입력에 의해 설정된 활동에 따라 상태 머신 내의 작은 코드 세그먼트가 실행되고 원하는 시스템 동작이 달성됩니다.
    • 그림 1 : 전형적인 상태 머신. 왼쪽의 기계는 외부입력을 상태 변경 입력으로 전달합니다. 유휴 상태에서 한 번 누르면 올바른 상태의 머신이 해당 상태를 단계별로 진행합니다. (더 큰 이미지를 보려면 여기를 클릭하십시오)
    • 두 번째 함수 I2CCommStatemachine()은 다른 상태로 이동하면서 동작하는 I2C EEPROM 드라이버입니다. 함수를 호출 할 때마다 EEPROM 쓰기 절차의 일부가 수행됩니다. 그러면 상태 변수가 다음 단계로 설정되고 제어는 호출 함수로 돌아갑니다. EEPROM 쓰기가 4 단계로 나뉘며 EEPROM 쓰기를 완료하려면 함수를 4 번 호출해야함을 알 수 있습니다.
    • 보시다시피, 주어진 기능은 짧은 논리 단위나눌 수 있으며, 아주 짧은 시간에 실행될 수 있습니다. 여러 상태 머신을 생성하고 이들을 섞어서 실행함으로써 멀티 태스킹이 가능합니다.
  • 상태 머신 기반 멀티 태스킹 기초
    • 이 상태 머신 기반 멀티 태스킹 방법의 기본 개념을 살펴 보겠습니다.
      • 1) 각 작업은 짧은 시간 내에 완료 될 수있는 작은 하위 작업 또는 상태로 나뉩니다. 이 시간 간격은 일반적으로 최대 몇 밀리 초입니다.
      • 2) Task의 맥락을 저장하고 회복하는 책임은 task 자체에 있다. 이것은 상태 머신과 상태 변수에 의해 달성됩니다. 미리 정해진 실행 지점에서 task에 의해 제어권이 자발적으로 해제됩니다. 따라서 RAM 또는 CPU 레지스터는 복사되지 않습니다.
      • 3) 각 Task는 Task의 작은 부분을 수행하고 스케줄러로 제어권을 다시 돌려줍니다. 시스템은 여러 가지 Task/함수로 구성되며 반복적으로 호출됩니다. 각 호출에서 태스크는 현재 상태를 서비스하고 상태 변경이 필요한 경우 다음 상태를 결정합니다. 그런 다음 작업은 그에 따라 변수를 업데이트하고 호출자에게 제어권을 돌려줍니다. 상태 머신이 다른 상태 머신을 내부적으로 호출하는 것이 가능합니다(주.sub-state얘기인듯). 정해진 시간 내에 호출이 모두 완료되는 한, 시스템은 작동할 것입니다.
      • 4) 여러 태스크의 서로 다른 상태의 교차실행은 모든 상태 머신의 동시 실행처럼 보입니다. 따라서, 멀티 태스킹이 달성된다.
    • 매우 간단한 2 task 시스템을 고려해 봅시다. FMPlayerTask 및 EEPROMWriteTask. 이 FM 플레이어가 사전 설정 채널을 EEPROM에 저장한다고 가정 해 봅시다. 그림 1과 같이 EEPROM 쓰기 작업을 순차적으로 실행해야하는 4 가지 상태로 나눕니다. FMPlayerTask에는 그림과 같이 간단한 버튼 누름 판독기 Read_Buttons ()와 Service_FMRadio_Inputs ()의 두 가지 기능이 있습니다. Service_FMRadio_Inputs ()에는 사용자 입력에 따라 무작위로 발생하는 5 가지 상태가 있습니다.
    • 이 두 상태 머신이 무한 루프로 함께 실행되며 아래 그림 2와 같은 동작이 나타납니다. FM 플레이어 작업은 EEPROM 쓰기가 완료되기 전에도 입력 준비가 되어 있으며 FM 튜닝 및 EEPROM 쓰기를 멀티 태스킹하는 것처럼 보입니다.
    • 스케줄러는 모든 작업을 반복적으로 거르고 현재 반복에 schedule된 작업을 실행하는 무한 루프입니다 (자세한 내용은 이 기사 시리즈의 스케줄러 섹션 참조).
    • 간단한 언어 구성자은 가능한 한 많이 사용하여 오버 헤드를 최소화합니다. (주. compiler에서 제공하는 최적화 기법등을 많이 사용하라는 의미인듯..)
    • 그림 2 : 간단한 멀티 태스킹 시스템의 CPU 타임 라인
  • 간단한 Scheduling
    • 스케줄링은 이 기사 시리즈의 후반부에 자세히 설명됩니다. 이 첫 번째 기사를 위해 FM 플레이어 시스템에 충분한 간단한 scheduling 기법을 살펴 보겠습니다. Task scheduling하는 가장 간단한 형태의 C 어 구현은 아래와 같은 무한 루프입니다. 아래에 표시된 것처럼 모든 작업은 올바른 실행 순서로 호출됩니다. 마지막까지 실행하면 맨 처음으로 이동합니다.
    • 물론, 이 시스템은 task실행에 대한 주기성이 엄격하지 않으며 타이밍이 중요한 복잡한 시스템에는 적합하지 않을 수 있습니다. 그러나 단순하기 때문에 오버 헤드가 매우 적고 리소스 사용량이 적습니다. 상태 머신이 올바르게 구축되는 한 더 복잡한 스케줄링 방법이 필요없는 저비용 시스템이 많이 있습니다.
    • 여기에 제시된 예는 간단해 보이지만 이 방법은 타이밍 제약이 없고 하위 시스템이 없는 간단한 저비용 멀티태스킹 시스템을 구현하기에 충분합니다. 여러 하위 시스템과 엄격한 타이밍 요구 사항이 있는 정교한 시스템을 다룰 때에는 task 계획 및 설계에 보다 세심한주의가 필요합니다.

No comments: