日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

王超的小站
認(rèn)證:VIP會(huì)員
所在專題目錄 查看專題
FreeRTOS移植詳解1-專題概覽(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植詳解2-滴答定時(shí)器實(shí)現(xiàn)(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植詳解3-內(nèi)核裁剪(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植詳解4-中斷配置(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植詳解5-臨界段處理(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植詳解6-任務(wù)堆棧初始化和啟動(dòng)(基于Microchip dsPIC33C系列芯片)
作者動(dòng)態(tài) 更多
PIC24 & dsPIC33 MCU Bootloader開發(fā)
2021-11-08 15:12
PIC16 & PIC18 MCU Bootloader開發(fā)
2021-11-08 15:00
Python開發(fā)環(huán)境搭建(for Bootloader)
2021-11-08 14:58
Python開發(fā)環(huán)境搭建 (for Control)
2021-01-27 18:43
MCU擴(kuò)展CAN/CAN FD接口方案-MCU軟件動(dòng)手實(shí)驗(yàn)
2020-11-25 14:11

FreeRTOS移植詳解5-臨界段處理(基于Microchip dsPIC33C系列芯片)

      臨界段代碼也叫臨界區(qū),是指那些必須完整運(yùn)行、不能被打斷的代碼段,比如有的外設(shè)的初始化需要嚴(yán)格的時(shí)序,初始化過程中不能被打斷。FreeRTOS在進(jìn)入臨界段代碼的時(shí)候需要關(guān)閉中斷,處理完臨界段代碼以后再打開中斷。FreeRTOS系統(tǒng)本身就有很多的臨界段,這些代碼都加了臨界段代碼保護(hù),寫自己用戶程序的時(shí)候有些地方也需要添加臨界段代碼保護(hù)。

      FreeRTOS與臨界段代碼保護(hù)有關(guān)的函數(shù)有4個(gè),在task.h中定義,分別是:taskENTER_CRITICAL()、taskEXIT_CRITICAL() 、taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR( x )。其中前2個(gè)是任務(wù)級(jí)的臨界段代碼保護(hù),后2個(gè)是中斷級(jí)的臨界段代碼保護(hù),無論哪種情況臨界段的代碼都要盡量短小,下面分別來看。

      1. 任務(wù)級(jí)臨界段代碼保護(hù)

      taskENTER_CRITICAL()和taskEXIT_CRITICAL()是任務(wù)級(jí)的臨界段代碼保護(hù),一個(gè)是進(jìn)入臨界段,一個(gè)是退出臨界段,這2個(gè)函數(shù)是成對(duì)使用的,這函數(shù)的定義如下:

      而portENTER_CRITICAL()和portEXIT_CRITICAL()也是宏定義,在portmacro.h中有定義,如下:

      函數(shù)vPortEnterCritical()和vPortExitCritical()在文件port.c中,函數(shù)如下:

      可以看出,進(jìn)入函數(shù)vPortEnterCritical()以后首先調(diào)用函數(shù)portDISABLE_INTERRUPTS()來關(guān)閉中斷,然后給變量uxCriticalNesting加1。uxCriticalNesting是一個(gè)全局變量,用來記錄臨界段嵌套次數(shù)。函數(shù)vPortExitCritical()是退出臨界段調(diào)用,函數(shù)每次將uxCriticalNesting 減1,只有當(dāng)uxCriticalNesting 減到0才會(huì)調(diào)用函數(shù)portENABLE_INTERRUPTS()來使能中斷。這樣保證了在有多個(gè)臨界段代碼的時(shí)候不會(huì)因?yàn)槟骋粋€(gè)臨界段代碼的退出而打亂其他臨界段的保護(hù),只有所有的臨界段代碼都退出以后才會(huì)使能中斷。

      2. 中斷級(jí)臨界段代碼保護(hù)

      函數(shù)taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR( x )為中斷級(jí)臨界段代碼保護(hù)函數(shù),用在中斷服務(wù)程序中,而且這個(gè)中斷的優(yōu)先級(jí)一定要小于等于configMAX_SYSCALL_INTERRUPT_PRIORITY。這2個(gè)函數(shù)在task.h中有如下定義:

      接下來看portSET_INTERRUPT_MASK_FROM_ISR()和portCLEAR_INTERRUPT_MASK_FROM_ISR( x ),這2個(gè)函數(shù)在文件portmacro.h中有如下定義:

      函數(shù)usPortRaiseCpuIPL()和vPortSetCpuIPL( x )在文件port.c中,函數(shù)如下:

      可以看出,進(jìn)入函數(shù)usPortRaiseCpuIPL()實(shí)現(xiàn)的功能為首先保存當(dāng)前CPU的優(yōu)先級(jí)IPL[2:0] 到變量usOldIPL中,作為函數(shù)返回值用于vPortSetCpuIPL( x ) 的形參在退出臨界段時(shí)恢復(fù)IPL[2:0] 。另一個(gè)usPortRaiseCpuIPL() 的操作就是將CPU的優(yōu)先級(jí)IPL[2:0]賦值configMAX_SYSCALL_INTERRUPT_PRIORITY,使優(yōu)先級(jí)小于等于configMAX_SYSCALL_INTERRUPT_PRIORITY的中斷被屏蔽。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 5
收藏 4
關(guān)注 43
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧