在介绍内核裁剪之前,首先介绍一下滴答定时器的实现,为什么把它放在靠前的位置呢,因为这个东西相对于RTOS来说就像我们人类的心脏,是RTOS活着的基础。那么心跳如何实现呢,对于基于ARM架构的芯片(如ATSAMD21或ATSAMD51)通常用24位的SysTick定时器来实现,也就是大家常说的系统滴答定时器,通过该定时器为系统提供一个周期性的定时信号,该定时信号就是RTOS的心跳信号,通常也称为时钟节拍或系统节拍。对于dsPIC33C系列芯片,则可以用通用定时器Timer1(Datasheet中其框图如下图,红色字体为项目工程中的实际配置情况)来实现,每个Timer1时钟节拍中断都会触发OS内核执行一些系统调用,比如进行任务管理和任务切换等。
下面结合上面Timer1的框图一起来看下Timer1的初始化代码实现,该段代码在项目目录“./src/third_party/rtos/FreeRTOS/portable/MPLAB/PIC24_dsPIC”下port.c中实现,详见函数vApplicationSetupTickTimerInterrupt(),具体细节如下:
上图红色字体中前3项配置将在下一节内核裁剪中进行说明,这里需要知道以上TIMER1初始化代码的意思就是Timer1定时器要100us中断一次,且其中断优先级设置为最低优先级。那么Timer1的中断函数里做什么事情呢,代码实现同样在port.c中。
其大概意思就是通过xTaskIncrementTick()函数进行任务管理,如果当前任务的优先级有多个任务(同时configUSE_PREEMPTION和configUSE_TIME_SLICING配置为1,即 使能了时间片调度 ),那么就需要通过portYIELD()函数进行一次任务切换。portYIELD()函数是针对不同MCU移植FreeRTOS的重中之重,在后续任务切换部分进行详细介绍。