在介紹內(nèi)核裁剪之前,首先介紹一下滴答定時器的實現(xiàn),為什么把它放在靠前的位置呢,因為這個東西相對于RTOS來說就像我們?nèi)祟惖男呐K,是RTOS活著的基礎(chǔ)。那么心跳如何實現(xiàn)呢,對于基于ARM架構(gòu)的芯片(如ATSAMD21或ATSAMD51)通常用24位的SysTick定時器來實現(xiàn),也就是大家常說的系統(tǒng)滴答定時器,通過該定時器為系統(tǒng)提供一個周期性的定時信號,該定時信號就是RTOS的心跳信號,通常也稱為時鐘節(jié)拍或系統(tǒng)節(jié)拍。對于dsPIC33C系列芯片,則可以用通用定時器Timer1(Datasheet中其框圖如下圖,紅色字體為項目工程中的實際配置情況)來實現(xiàn),每個Timer1時鐘節(jié)拍中斷都會觸發(fā)OS內(nèi)核執(zhí)行一些系統(tǒng)調(diào)用,比如進(jìn)行任務(wù)管理和任務(wù)切換等。
下面結(jié)合上面Timer1的框圖一起來看下Timer1的初始化代碼實現(xiàn),該段代碼在項目目錄“./src/third_party/rtos/FreeRTOS/portable/MPLAB/PIC24_dsPIC”下port.c中實現(xiàn),詳見函數(shù)vApplicationSetupTickTimerInterrupt(),具體細(xì)節(jié)如下:
上圖紅色字體中前3項配置將在下一節(jié)內(nèi)核裁剪中進(jìn)行說明,這里需要知道以上TIMER1初始化代碼的意思就是Timer1定時器要100us中斷一次,且其中斷優(yōu)先級設(shè)置為最低優(yōu)先級。那么Timer1的中斷函數(shù)里做什么事情呢,代碼實現(xiàn)同樣在port.c中。
其大概意思就是通過xTaskIncrementTick()函數(shù)進(jìn)行任務(wù)管理,如果當(dāng)前任務(wù)的優(yōu)先級有多個任務(wù)(同時configUSE_PREEMPTION和configUSE_TIME_SLICING配置為1,即 使能了時間片調(diào)度 ),那么就需要通過portYIELD()函數(shù)進(jìn)行一次任務(wù)切換。portYIELD()函數(shù)是針對不同MCU移植FreeRTOS的重中之重,在后續(xù)任務(wù)切換部分進(jìn)行詳細(xì)介紹。