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