基于優(yōu)先級調(diào)度的嵌入式實時操作系統(tǒng)內(nèi)核詳解_第1頁
基于優(yōu)先級調(diào)度的嵌入式實時操作系統(tǒng)內(nèi)核詳解_第2頁
基于優(yōu)先級調(diào)度的嵌入式實時操作系統(tǒng)內(nèi)核詳解_第3頁
基于優(yōu)先級調(diào)度的嵌入式實時操作系統(tǒng)內(nèi)核詳解_第4頁
基于優(yōu)先級調(diào)度的嵌入式實時操作系統(tǒng)內(nèi)核詳解_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第第頁基于優(yōu)先級調(diào)度的嵌入式實時操作系統(tǒng)內(nèi)核詳解

今日分享參加(瑞薩)RA(MCU)(創(chuàng)意)氛圍賽的選手項目——基于優(yōu)先級的(RTOS)內(nèi)核。本項目為基于優(yōu)先級調(diào)度的(嵌入式)實時操作系統(tǒng)內(nèi)核,其中調(diào)度部分使用固定可搶占的優(yōu)先級調(diào)度機制;提供了可移植(接口)以便適配不同架構的(cpu);重寫了更簡易更輕量級的部分庫函數(shù),比如標準輸入輸出以及字符串相關操作;除內(nèi)核外還提供部分組件,包括一個簡易的shell程序以及設備驅(qū)動框架。具體的操作我們一起來看看講解吧!

一、簡介

1.1項目簡介

(Sim)pleRTOS(catOS)是我大學實習期間為了學習RTOS編寫的一個簡單的內(nèi)核,主要調(diào)度方式基于優(yōu)先級搶占,該項目重構了兩次,故內(nèi)容和功能有所不同,(最新版)本僅保留了固定優(yōu)先級調(diào)度方式。

本次項目內(nèi)容為將該內(nèi)核對野火的瑞薩啟明6M5開發(fā)板進行適配,并編寫簡單的demo驗證正確性。如果有什么錯誤請大家批評指正。(文末有項目(資料)鏈接可供參考)

1.2開發(fā)板簡介

官網(wǎng)特性介紹如下:

支持TrustZone的200MHz(Arm)Cortex-M33

安全(芯片)功能

1MB-2MB閃存、448KB支持奇偶校驗的S(RAM)和64KBECCSRAM

具有后臺運行能力的雙區(qū)閃存,以及存儲塊交換功能

8KB數(shù)據(jù)閃存,提供與EEP(ROM)類似的數(shù)據(jù)存儲功能

100引腳封裝至176引腳封裝

帶有專用(DMA)的(以太網(wǎng))(控制器)

(電容)(觸摸按鍵)感應單元

高速和全速(USB)2.0

(CAN)FD(也支持CAN2.0B)

Qua(dSP)I和OctaS(PI)

SCI多功能串口((UART)、簡單SPI、簡單(I2C))

SPI/I2C多主接口

(SD)HI和MMC

二、適配內(nèi)核

2.1可移植接口概覽

需要實現(xiàn)的可移植接口包括以下部分

左右滑動查看

/***@brief(硬件)初始化*/voidcat_hw_init(void);/***@brief開始調(diào)度**/voidcatos_start_sched(void);/***@brief上下文切換**///voidcat_hw_con(te)xt_switch(void);/***@brief上下文切換**@param

from_task_sp_(ad)dr上一個任務tcb中堆棧指針變量的*地址**@param

to_task_sp_addr

下一個任務tcb中堆棧指針變量的*地址**/voidcat_hw_context_switch(cat_uint32_tfrom_task_sp_addr,cat_uint32_tto_task_sp_addr);/***@brief切換到第一個任務的上下文**@param

fi(rs)t_task_sp_addr

要切換的任務tcb中堆棧指針變量的*地址**/voidcat_hw_context_switch_to_first(cat_uint32_tfirst_task_sp_addr);/***@brief關中斷進臨界區(qū)**@returncat_uint32_t*/cat_uint32_tcat_hw_irq_disable(void);/***@brief開中斷出臨界區(qū)**@paramstatus*/voidcat_hw_irq_enable(cat_uint32_tstatus);/***@brief棧初始化**@paramtask_entry

任務入口函數(shù)地址*@paramparameter

參數(shù)*@paramst(ac)k_addr

棧起始地址*@paramexit

任務退出函數(shù)地址*@returncat_uint8_t*

初始化后的棧頂?shù)刂?/cat_uint8_t*cat_hw_stack_init(void*task_entry,void*parameter,cat_uint8_t*stack_addr,void*exit);

2.2硬件初始化

在硬件初始化中主要是設置系統(tǒng)(時鐘)中斷頻率,初始化時設置時鐘中斷為關閉狀態(tài)。

左右滑動查看

/***@brief硬件初始化*/voidcat_hw_init(void){/*設置系統(tǒng)時鐘中斷頻率為100Hz(每秒100次)*/cat_set_syst(ic)k_period(CATOS_SYSTICK_MS);}/***@brief初始化時鐘中斷**@paramms每個(ti)ck的時間(ms)*/staticvoidcat_set_systick_period(cat_uint32_tms){cat_uint32_terr=0;cat_uint32_tIT_Period=0;IT_Period=ms*SystemCoreClock/1000;//err=SysTick_Config(IT_Period);/*如果設定的周期太離譜就停在這*/if((IT_Period-1UL)>SysTick_LOAD_RELOAD_Msk){err=1;}assert(0==err);SysTick->LOAD=(uint32_t)(IT_Period-1UL);/*設置重裝載(寄存器)*/NVIC_SetPriority(SysTick_IRQn,(1ULVAL=0UL;/*設置計數(shù)器裝載值*/SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|/*設定為內(nèi)核時鐘FCLK*/SysTick_CTRL_TICKINT_Msk|/*設定為systick計數(shù)器倒數(shù)到0時觸發(fā)中斷*/~SysTick_CTRL_ENABLE_Msk;/*關閉(定時器)中斷,若創(chuàng)建任務則在catos_start_sched()中開啟該中斷*/}

2.3開始調(diào)度與切換到第一個任務的上下文

開始調(diào)度需要從就緒表中獲取最高優(yōu)先級任務并設置為當前任務,并且在恢復第一個任務上下文之前需要打開時鐘中斷并初始化pendsv中斷以保證調(diào)度的正常工作。

注:這里暫時沒有對不使用fpu的情況適配,參考(FreeRTOS)的可移植接口實現(xiàn)。

左右滑動查看

/***@brief開始調(diào)度**/voidcatos_start_sched(void){cat_uint32_ttmp_reg=0;struct_cat_task_t*first_task=NULL;/*獲取最高優(yōu)先級任務*/first_task=cat_sp_task_highest_ready();/*因為是第一個任務,不用像調(diào)度時判斷是否和上一個任務一樣,直接賦值給當前任務就行*/cat_sp_cur_task=first_task;/*允許調(diào)度(打開調(diào)度鎖,并且不在該處進行調(diào)度)*/cat_sp_task_sched_enable_without_sched();/*開啟時鐘中斷*/SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;/*設置pendsv中斷優(yōu)先級*/tmp_reg=MEM32(NVIC_SHPR3);tmp_reg|=NVIC_PENDSV_PRI;MEM32(NVIC_SHPR3)=tmp_reg;/*切換到第一個任務*/cat_hw_context_switch_to_first((cat_uint32_t)}/***@brief切換到第一個任務的上下文**/voidcat_hw_context_switch_to_first(void){__enable_irq();__ISB();/*各個寄存器地址*/__asmvolatile(".equSCB_ICSR,0xE000ED04"http://中斷控制寄存器".equSCB_VTOR,0xE000ED08"http://中斷向量表偏移寄存器".equICSR_PENDSVSET,0x10000000"http://pendsv觸發(fā)值".equSHPR3_PRI_14,0xE000ED22"http://系統(tǒng)異常handler優(yōu)先級寄存器3(PendSV).".equPRI_LVL_PENDSV,0xFF"http://pendsv優(yōu)先級(最低).".equSHPR3_PRI_15,0xE000ED23"http://系統(tǒng)異常handler優(yōu)先級寄存器3(Systick)."ldrr1,=cat_context_to_task_sp_ptr""strr0,[r1]"#if__FPU_USED//#error"__FPU_USED"/*清除control寄存器的(FPC)A*/"mrsr2,control"/*read*/"bicr2,r2,#0x04"/*modify*/"msrcontrol,r2"/*write-back*/#else#error"mustusefpu"#endif/*將變量cat_context_from_task_sp_ptr設置為0*/"ldrr1,=cat_context_from_task_sp_ptr""movr0,#0""strr0,[r1]""movr4,#0x1234"/*觸發(fā)pendsv中斷,允許中斷后會立即進入pendsv切換*/"ldrr0,=SCB_ICSR""ldrr1,=ICSR_PENDSVSET""strr1,[r0]"/**(SCB_ICSR)="ICSR_PENDSVSET*//*不會到達這里*/"dsb""isb""svc0");}

2.4上下文切換

上下文切換使用pendsv中斷進行,主要工作為保存當前任務堆棧和寄存器以及恢復下一個任務的堆棧和寄存器。

左右滑動查看

/***voidcat_hw_context_switch(void)*觸發(fā)pendsv中斷進行任務切換(pendsv的優(yōu)先級在開始第一個任務時已經(jīng)設置)*/

.globalcat_hw_context_switch

.typecat_hw_context_switch,%functioncat_hw_context_switch:

/*將兩個任務的堆棧指針變量的*地址*加載到臨時變量中*/

/*cat_context_from_task_sp_ptr=}

2.5臨界區(qū)的開關中斷

開關中斷主要是對primask的操作,和cortex-m3差不多,比較簡單。

左右滑動查看

/***cat_uint32_tcat_hw_irq_disable(void)*關中斷方式進入臨界區(qū)*primask-->r0*/

.globalcat_hw_irq_disable

.typecat_hw_irq_disable,%functioncat_hw_irq_disable:

mrsr0,primask

/*ret=primask*/

cpsidI

/*disableirq*/

bxlr

/*returnret*//***voidcat_hw_irq_enable(cat_uint32_tstatus)*開中斷方式出臨界區(qū)*r0-->status*/

.globalcat_hw_irq_enable

.typecat_hw_irq_enable,%functioncat_hw_irq_enable:

msrprimask,r0

/*primask=status*/

bxlr

2.6任務棧初始化

在任務創(chuàng)建時需要根據(jù)任務的相關信息對任務棧幀中各項進行初始化,包括設置psr寄存器、任務入口地址、退出函數(shù)地址和任務參數(shù)。

需要特別注意的是cortex-m33還需要正確設置psplim等寄存器。

左右滑動查看

/***@brief棧初始化**@paramtask_entry

任務入口函數(shù)地址*@paramparameter

參數(shù)*@paramstack_addr

棧起始地址*@paramexit

任務退出函數(shù)地址*@returncat_uint8_t*

初始化后的棧頂?shù)刂?/cat_uint8_t*cat_hw_stack_init(void*task_entry,void*arg,cat_uint8_t*stack_addr,void*exit_func){

struct_stack_frame*stack_frame;

cat_uint32_t

*stack;

cat_uint32_t

i;

/*先加上4字節(jié)再8字節(jié)向下取整對齊(相當于四舍五入)*/

stack=stack_addr+sizeof(cat_uint32_t);

stack=(cat_uint8_t*)CAT_ALIGN_DOWN((cat_uint32_t)stack,8);

/*taskcontextsaved/*xPSR:EPSR.T=1,thumbmode

*/

*(--stack)=(cat_uint32_t)task_entry;

/*EntryPoint*/

*(--stack)=(cat_uint32_t)exit_func;/*R14(LR)

*/

*(--stack)=(cat_uint32_t)0x12121212L;/*R12

*/

*(--stack)=(cat_uint32_t)0x03030303L;/*R3

*/

*(--stack)=(cat_uint32_t)0x02023202L;/*R2

*/

*(--stack)=(cat_uint32_t)0x01010101L;/*R1

*/

*(--

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論