RTOS를 사용하지 않는 베어메탈 Firmware에서는 각각의 기능 프로세스의 처리 시간을 적당히 잘 분배 해야 합니다. 처리 시간이 긴 프로세스는 여러개로 쪼개야 하며, 특히 인터럽트 발생시 인터럽트 인터럽트 루틴에 긴 처리시간을 요구하는(지연이 발생하는)코드를 넣으면 절대 안됩니다. 더욱이 애매한 처리 시간을 요구하는 코드를 넣는 경우는 더욱 위험합니다. 왜냐하면 불규칙적으로 에러를 발생되며 디버깅을 위해 많은 시간이 소요될 수도 있습니다. 인터럽트 서비스 루틴에서는 입력된 데이터를 적당한 자료구조에 적재해놓던가, 특정 플래그를 set하는 수준 혹은 메시지 큐에 쌓는 수준의 처리가 가장 좋습니다. 만약 전체 시스템이 1초단위로 어떠한 처리가 끝나야 한다면, 각각의 프로세스들이 최대 처리되는 시간의 합..
this는 객체지향 언어에서 class instance 자신을 나타냅니다. 자기 자신이기 때문에 별도의 이름을 갖는 다는 것도 좀 이상하기 때문에 this라는 키워드는 정말 잘 정한 것 같습니다. C언어 에서 this라는 것을 활용해서 사용해보도록 하겠습니다. 다음과 같은 main.c 코드가 있습니다. uart 드라이버 포인터를 얻어와 uart를 open하고 read, write, close하는 일을 절차적으로 진행하고 있습니다. /* main.c */ void main(void) { driver_t *uart = set_uart(); char value; uart->open(); uart->read(0, &value); uart->write(0, &value, 1); uart->close(); } 사용..
자바의 Class와 C의 typedef는 많이 비슷해보입니다. 그러나 실제로 좀 차이가 있습니다. 자바 Class는 생산성과 효율성을 높이기 위해, 궁극적으로 객체지향을 목표로 만든 것이기 때문에 typedef보다 훨씬 사용하기 편리합니다. 가장 큰 차이점은 동적인 할당과 해제를 JVM에서 자동으로 해준다는 것이지요. 자바에서는 궁극적으로 Class를 통해 instance를 만들어 냅니다. 자바에서 다음 구문 Class class = new Class(); 는 무엇을 의미할까요? 이것은 class라는 이름의 메모리를 확보한 후 포인터를 넘겨준것과 같은 효과를 냅니다. new와 동시에 memory allocation이 발생한 것입니다. 메모리를 확보했으니 사용 후 반환을 해야 하는데, 자바는 가비지 콜렉션..
지난 포스팅에서 Interrupt 발생시 Core 에서 어떻게 Stacking하는지에 대해 알아보았습니다. 이번 포스팅에서는 Task Context 스위칭시 R4 ~ R11 까지 Core Register들을 Stack에 쌓기 위해 기본적으로 알아야 할 ASM(assembler) 코드에 대해서 알아보겠습다. Task Context 스위칭시 사용되는 ASM 코드는 크게 아래와 같습니다. MRS : 레지스터의 값을 읽는다. mrs r0, msp : msp의 내용을 읽어 r0에 로드 STMDB : 여러개의 레지스터 값을 읽어 메모리의 위치에 저장한다. stmdb r0!, {r4-r11} : r0의 포인터에 r4 ~ r10의 내용을 내림차순으로 저장 MSR : 레지스터에 값을 저장한다. msr msp, r0 : ..
RTOS를 사용하는 이유는 여러가지 업무(Task)를 동시에 처리하기 위해서입니다. MP3 플레이어를 예를 들어 보겠습니다. MP3 플레이어의 기본적인 기능은 다음과 같습니다. MP3 파일 입/출력 처리 MP3 파일 Decoding Decoding 음원 출력 Button 입력 처리 GUI 화면 처리 배터리 모니터링 기타등등 간단한 MP3 플레이어라고 해도 꽤 많은 업무를 동시에 처리해야 합니다. 위의 업무중에서는 파일 입/출력, Decoding 과 같은 CPU의 로드가 상당히 많이 필요한 업무들이 있습니다. 이러한 업무들을 순차처리 할 경우에 CPU의 리소스를 하나의 업무에서 독점하므로 음원이 끊어지는 상황이나 Button이 간헐적으로 동작하지 않는 상황, GUI 업데이트 되지 않는 등의 문제가 발생할 ..