2024-01-24~26 idec강의 "Cortex-M 프로세서 기반의 FreeRTOS포팅 및 활용" 강의자료.
FreeRTOS를 포팅하기 전에 하드웨어에 대한 기초적인 지식을 확실하게 가져가야 한다.
컴퓨터 구조에서 배웠다시피, 우리가 사용하는 프로세서의 형태는 다음과 같다.

RISC-V 아키텍쳐 기반의 어셈블리 코드가 INPUT된다면, DECODE 작업을 통하여 OPCODE로 변환이 되고, 그 OPCODE가 processor내부의 MUX와 같은 Controll핀에 직접적으로 입력되어 적절한 동작을 하게 되는 것이다.
그러면 이렇게 구성된 processor는 CPU와 같은 의미일까?
정답은 CPU != processor이다.
먼저 ip가 무엇인지에 대하여 알아야 한다. IP는 ‘Intellectual property’의 약어로 설계 자산을 뜻한다.
반도체 IP는 소자 내에 구현되기 위해 미리 정의된 일종의 블록 기능을 한다.
IP는 건축에서 설계도와 같은 역할을 하며, 특히 시스템온칩(SoC) 설계시 핵심 요소인 중앙처리장치(CPU) IP가 주로 거래 대상 품목이다.
영국의 arm회사에서 arm아키텍쳐의 라이센스를 판매를 하고 이 회사는 직접 제조를 하지 않는다. 이렇게 구입한 arm의 라이센스를 활용하여 arm의 Cortex-M프로세서를 사용할 수 있게 되며, 이 프로세서에 제조사 본인의 IP를 설계하여 CPU를 만드는 것이다.
따라서 Coretex-M3 기반의 마이크로 컨트롤러가 stm32가 되는 것이다.

Cortex-M processer 내부를 보면 연산을 담당하는 prosessor Core(ALU)와 여러 레지스터로 이루어져 있다. mmu, systemtimer, caches...
내부에는 R0, R1~R15까지 총 16개의 내부 레지스터가 있으며 한 레지스터당 저장할 수 있는 비트수가 32비트이기 때문에 stm32는 32비트라고 할 수 있다.
각각의 레지스터에는 특정 역할이 있고 이는 interrupt vector table에 기술되어 있다.
R13 : stack pointer
R14 : pend sv
R15 : systick vector

기술한 이 세개의 레지스터가 free rtos 활용에 아주 중요한 역할을 할 것이다.
위 interrupt vector table의 index가 0~15번까지는 internal(system) interrupt라고 할 수 있어서 내부적으로 인터럽트를 발생시키지만, 16~의 인덱스는 external interrupt라고 할 수 있다.
이 부분의 인터럽트는 NVIC(Nested Vectored Interrupt Controller)에 외부 irq가 입력되어 인터럽트를 발생시키는 것이다. stm의 uart와 같은 ip에서 인터럽트를 발생시킬 수 있는 것은 외부 ip와 nvic가 bus를 통해 통신을 하고 있기 때문이다.

따라서 다음 그림과 같이 표현가능하다. Peripherals에 제조사 ip의 외부 interrupt가 irq를 통하여 NVIC로 들어간다.
또한 SYSTICK카운터의 인터럽트로 NVIC로 들어간다는 것을 볼 수 있다.
SysTick(System Tick Timer)는 cortex-M 기반에서 사용되는 24비트 시스템카운터로, 1ms가 지날때마다 인터럽트를 발생시키는 역할을 할 수 있다. 이렇게 요청된 인터럽트에 레지스터 스케줄링에 대한 조건문을 작성하여, real time system을 위한 pend sv를 호출시킬지 말지를 결정할 수 있다.