타이머, 태스크

with MK·2020년 11월 2일
0

펌웨어

목록 보기
3/3
  • 임베디드 시스템에서는 시간에 의존해서 동작을 제어해야 하는 상황이 많아 시간을 알아야 한다. 그 기능을 하는 것이 타이머이다.
  • 타이머는 목표 카운트 레지스터와 측정 카운트 레지스터를 조합하여 사용한다.
  • 측정 카운트가 0에서 증가하여 목표 카운트와 같아지거나 목표 카운트에서 감소하여 0이 되는 경우 인터럽트가 발생한다. 각각 프리러닝 모드와 피리오딕 모드이다.
  • 타이머를 활용하기 위해서는 dela() 함수를 구현하는 것이 중요하다.
  • 타이머는 하나의 하드웨어이고 새로운 하드웨어를 추가하는 첫 작업은 하드웨어의 레지스터를 구조체로 추상화하여 hal에 추가하는 것으로 시작한다.
  • 타이머 카운터를 이용하는 코드를 만들 때는 항상 오버플로우 문제를 염두에 둬야 한다.
  • 예를들어 32비트의 최대 값을 시간으로 환산하면 약 50일 정도인데, 50일 이후에 오버플로를 일으켜 0이 된다. 50일이면 긴 시간이 아닌가?라고 할 수 있으나, 리얼타임OS의 특성상 언제나 최악의 상황에서도 동작하는 소프트웨어를 만들어야 하기 때문에, 오버플로를 항상 고려해야 한다.
  • 임베디드 시스템에서 시간을 다루는 일은 매우 중요하다. 중요한 동기화 처리를 위해 일정시간 동안 어떤 정보를 기다려야하거나, 하드웨어를 딱 정해진 시간만큼만 제어해야 하는 상황도 자주 있다.
  • RTOS를 포함한 운영체제는 한 문장으로 태스크를 관리하여 사용자가 하고 싶은 것을 할 수 있도록 도와주는 것이라고 말하고 싶다.
  • 태스크라는 용어는 범용 운영체제에서 프로그램 혹은 프로세스라 봐도 된다. RTOS에서는 일반적으로 태스크라 부른다. RTOS를 개발하는 과정에서 가장 먼저 할 일은 태스크를 추상화하고 설계하는 일이다.
  • 태스크 컨트롤 블록이란 개별 태스크 자체를 추상화하는 자료구조이다.
  • 태스크 간 전환이 생길 때, 프로그램의 흐름에 문제가 생기면 안되기 때문에, 태스크 컨트롤 블록은 현재 진행 중인 프로그램의 현재 상태 정보를 기록하고 있어야 한다. 이 상태 정보를 컨텍스트라 한다.
  • 컨텍스트 말고도 컨트롤 블록에 정보를 더 추가할 수 있다. 대표적으로 태스크의 이름이 있다. 개발자가 판단하여 태스크를 관리하는 데 필요한 부수적인 정보를 블록에 넣을 수 있다.
  • 태스크 컨트롤 블록의 구현은 커널을 만드는 첫 번째 작업이다.
  • 태스크 컨텍스트는 레지스터와 스택 포인터의 값이다.
  • 동적할당을 피해 태스크 컨트롤 블록을 객체 풀을 만들어 객체를 하나씩 가져오는 식의 배열을 만들면 좋다.
  • 태스크 컨트롤 블록에 함수 포인터를 연결해 함수를 태스크로 만든다.
  • 각 태스크 함수는 그냥 함수와 다를 바 없이 보이나, 각 태스크 함수는 스택 주소와 레지스터를 독립적으로 가지고 있다. 즉, 기능적으로 완전히 독립된 프로세스라 볼 수 있다.

0개의 댓글