기본적인 OS가 아예없는 Firmware에서 모든 기능은 무한루프와 인터럽트로 이루어져 있습니다. 이번장에서는 기본적으로 무한루프를 어떻게 실행하면 관리가 좋을 지 생각해보도록 하겠습니다.
우선 우리가 알고 있는 기본적인 while 무한루프입니다.
위의 코드는 간단해보이지만 실제적으로는 훨씬 더 복잡해 질 가능성이 있습니다. 만약 설정(#ifdef)에 따른 process 유무가 들어 간다면 더욱 복잡해 집니다.
이제 소개할 scheduler는 RTOS가 없기 때문에 컨텍스트 스위칭인 일어나지 않는 것을 잘 이해해야 합니다. 그리고 순차적으로 프로세싱이 동작합니다. 따라서 하나의 프로세스나 흐름이 너무 많은 시간을 소요하면 지연 문제가 발생 할 수 있습니다.
(이상하게도 해당 소스는 에디터에서 이상하게 변하네요.. 이미지로 대신 올립니다.)
* null, bool, u32 은 다음과 같이 define하면 됩니다.
#define null (void *)0
typedef enum
{
false = 0,
true = 1
}bool;
typedef unsigned long u32;
우선 스케쥴을 등록하고, 삭제하는 기능을 넣었습니다. 스케줄은 최대 10개만 등록하도록 하였으나 늘리거나 줄여도 됩니다. 스케쥴 핸들러에는 두개의 parameter를 넣었습니다. 쓸모 없을 수도 있으나 스케줄러가 호출 하지 않더라도 혹시 다른 프로세스에서 호출 하여도 parameter를 넘길 수 있도록 했습니다. 어렵지 않으니 쉽게 이해 하실 수 있을 것입니다. 현재 스케줄과 다음 스케줄의 포인터를 가져오는 부분은 코딩하지 않았습니다. 여러분께서 구현새 보시기 바랍니다.
아래 소스는 while 루프 들어가기 전에 선언하여 실행하는 부분입니다.
#ifdef를 사용해도 가독성이 떨어지거나 하는 것이 덜합니다.
간단하게 스케쥴러를 작성해 보았습니다. main.c의 무한루프는 최대한 간단하게 유지하셔야 합니다. 그리고 코드의 흐름이 서로 약하게 연결되어야 디버깅이 좋습니다. 그러기 위해서는 메세지 흐름이 좋습니다. 추후에 기회가 되면 구성해 보도록 하겠습니다.
'▶ 이전글 > C Pattern' 카테고리의 다른 글
Message 기반 만들기 (0) | 2018.01.11 |
---|---|
Timer 만들기 (0) | 2018.01.11 |
C 언어에서 this 구현 (0) | 2015.01.20 |
Iterator 패턴 - Queue (0) | 2015.01.20 |
C로 만드는 Interface (0) | 2014.10.15 |