女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導讀]0. 引言µC/OS-Ⅱ內核是一個強占式優(yōu)先級調度的系統(tǒng),能管理63個任務,支持旗語、信號量、互斥信號量、隊列和消息郵箱,是一個是典型的嵌入式實時操作系統(tǒng)。它最早由J

0. 引言

µC/OS-Ⅱ內核是一個強占式優(yōu)先級調度的系統(tǒng),能管理63個任務,支持旗語、信號量、互斥信號量、隊列和消息郵箱,是一個是典型的嵌入式實時操作系統(tǒng)。它最早由Jean J. Labrosse創(chuàng)作,源碼完全公開,已有眾多應用范例,可靠性能得到保證,內核小,移植性好。TI的C2000系列DSP處理器 TMS320LF2407A片內集成16路10位AD,4個通用定時器,8個16位PWM通道,4個CAP捕獲單元,41路I/O通道,以及SPI、 RS232、CAN等通信接口,豐富的片內資源,使得控制器不需任何擴展就能滿足所有的功能要求,且冗余很少。

DSP處理器在數(shù)學運算方面的優(yōu)勢也為智能化過程所需的數(shù)據(jù)處理提供了支持。TMS320LF2407A指令采用4級流水線操作,最高能以40M的系統(tǒng)時鐘工作,再加上合適的RTOS的調度,完全能保證系統(tǒng)的實時性。其開發(fā)系統(tǒng)TMS320C2XX Code Composer Studio滿足µC/OS-Ⅱ的移植條件,因此,它是嵌入式計算機控制系統(tǒng)主控制芯片的一個較好選擇。筆者在設計基于CAN的工程機械嵌入式智能顯示儀時,選用2407A做主控制芯片,軟件方面,將實時內核µC/OS-Ⅱ移植到該DSP 控制器TMS320LF2407A上,而應用程序是在µC/OS-Ⅱ內核基礎上的一系列任務。

1. µC/OS-Ⅱ的移植

由于µC/OS-Ⅱ在設計時就已經(jīng)充分考慮了可移植性,所以µC/OS-Ⅱ的移植相對來說比較容易。移植工作包括以下幾個內容:(1)用#define設置一個常量的值(OS_CPU.H)(2)聲明10個數(shù)據(jù)類型(OS_CPU.H)(3)用#define聲明三個宏 (OS_CPU.H)(4)用C語言編寫六個簡單的函數(shù)(OS_CPU_C.C)(5)編寫四個匯編語言函數(shù)(OS_CPU_A.ASM);即µC/OS-Ⅱ的移植要修改3個文件OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM。其中匯編語言文件OS_CPU_A.ASM是可選擇的,因為某些C編譯器允許用戶在C語言中插入?yún)R編語言,所以用戶可以將所需的匯編語言代碼直接放到OS_CPU_C.C中。CCS的C編譯器允許在 C語言中嵌入?yún)R編語言,但是由于這種方式破壞了C語言的完整性,因此只提倡在程序開始系統(tǒng)初始化部分少量采用。而在C語言中嵌入實現(xiàn)某一完整功能的多句匯編語言時,就不提倡采用這種方法。所以,移植中還是對OS_CPU_A.ASM做了修改。

2. 編寫移植代碼

移植µC/OS-Ⅱ的主要工作是聲明與硬件相關的數(shù)據(jù)類型,定義與中斷有關的宏定義,定義堆棧增長方向宏定義,編寫堆棧初始化函數(shù),HOOK接口函數(shù),任務級上下文切換函數(shù),中斷級上下文切換函數(shù)以及系統(tǒng)時鐘定時服務函數(shù)等。

2.1 移植OS_CPU.H文件

(1)一個常量值。OSInit需要知道當OS_TaskIdle() 和OS_TaskStat( ) 函數(shù)建立任務時,堆棧的頂端地址在哪里;其次調用OSTaskStkChk( )時,µC/OS-Ⅱ需要知道堆棧的底端地址在哪里。所以需要指明堆棧的增長方向。絕大多數(shù)微處理器和微控制器的堆棧是從上往下遞減的,但是也有某些處理器使用的是相反的方式。TMS320LF2407A的堆棧方向是從下往上增長的,所以: #define OS_STK_GROWTH 0;// 堆棧方向是從下往上增長

(2) 聲明數(shù)據(jù)類型。µC/OS-Ⅱ考慮到通用性,在內核中使用了自定義數(shù)據(jù)類型,與編譯器無關,這就要求移植時必須定義微處理器的數(shù)據(jù)類型與µC/OS-Ⅱ的數(shù)據(jù)類型相一致,保證移植后的µC/OS-Ⅱ在微處理器平臺上運行,在移植中應將其聲明為CCS編譯器可識別的類型。這可以由OS_CPU.h頭文件實現(xiàn),程序如下所示。

typedef unsigned char BOOLEAN;/*定義ucos里的boolean為unsigned char*/

typedef unsigned char INT8U; /*定義ucos里的INT8U為unsigned char*/

typedef signed char INT8S; /*定義ucos里的INT8S為signed char*/

typedef unsigned int INT16U; /*定義ucos里的INT16U為unsigned int*/

typedef signed int INT16S; /*定義ucos里的INT16S為signed int*/

typedef unsigned long INT32U; /*定義ucos里的INT32U為unsigned long*/

typedef signed long INT32S; /*定義ucos里的INT32S為signed long */

typedef float FP; /*定義ucos里的FP為float*/

#define OS_STK INT16U /*堆棧入口寬度為16位*/

由于系統(tǒng)沒有用到OS_CPU_SR類型數(shù)據(jù),所以沒有定義此數(shù)據(jù)類型。

(3)3個宏定義。µC/OS-Ⅱ在內核中通過禁止中斷來保護臨界區(qū),因此,需要在C語言中插入禁止和允許中斷的匯編代碼,DSP里用SETC INTM來屏蔽中斷,用CLRC INTM來使能中斷。所以移植代碼定義了下面兩條宏定義:

#define OS_ENTER_CRITICAL() asm(" SETC INTM")

#define OS_EXIT_CRITICAL() asm(" CLRC INTM")

µC/OS-Ⅱ定義了三種保護臨界區(qū)的方式,此移植版本采用的是最簡單的第一種方法。此種方法就要求中斷關閉的情況下不能調用µC/OS-Ⅱ的功能函數(shù)。這對于應用來說是可以接受的,所以就選擇了此種模式。TMS320LF2407A支持多種中斷方式,包括可屏蔽硬中斷 INT1~INT6,不可屏蔽硬中斷RESET和NMI_VECT,不可屏蔽軟中斷INT8~INT16和INT20~INT31以及中斷陷阱TRAP。因此使用INT31軟中斷來調用OSCtxSw()來從任務堆棧中恢復處理器所用的寄存器。用INT2的定時器1周期中斷來調用OSTickISR()。定義模仿INT31中斷的宏,來跳轉到INT31

#define OS_TASK_SW() asm(" INTR 31")

在中斷向量表里的定義

.include f2407regs.h

.global _c_int0, _OSTickISR, RESET, _OSCtxSw,_GRIS5,_adint,_nothing

.asect "vectors",0

……

INT2 B _OSTickISR ; B _c_int2

……

INT31 B _OSCtxSw ; task switching service vector.

2.2 移植OS_CPU_C.H文件

µC/OS-Ⅱ的移植范例要求編寫10個簡單的C函數(shù),但是真正必要的函數(shù)是OSTaskStkInit(),其他9個函數(shù)必須申明,但并不一定要包含任何代碼。OSTaskStkInit()主要是對任務堆棧的初始化。TMS320LF2407A的堆棧與一般微處理器的堆棧不同,一般微處理器的堆棧由編程定義一塊內存作為堆棧比較靈活,而TMS320LF2407A的堆棧,是在CPU內有8級深度的硬件堆棧,因此任務堆棧的初始化與一般微處理器的堆棧初始化不同。芯片本身的堆棧(以下簡稱US)只有8級,無法作為系統(tǒng)的堆棧使用,所以CCS編譯器將CPU內部的兩個寄存器AR0和AR1保留,AR1作為堆棧指針,AR0用作堆棧中臨時變量指針FP。編譯器將函數(shù)或中斷壓進US的返回地址,彈出放在SP(AR1)指向的堆棧中,并保存CPU 的工作環(huán)境,不同的是函數(shù)只保存程序要用到的寄存器,中斷要調用I$$SAVE子程序,保存CPU所有的寄存器,返回時調用I$$REST子程序,恢復 I$$SAVE和I$$REST兩個函數(shù)是µC/OS-Ⅱ操作系統(tǒng)移植到TMS320LF2407A上的基礎,一定要很清楚后才能夠成功移植 OSTaskStkInit()函數(shù)。[!--empirenews.page--]

2.3 移植OS_CPU_C.H文件

需要在該文件中編寫4個匯編語言函數(shù):(1)OSStartHighRdy():這是系統(tǒng)完成初始化后啟動多任務運行時要調用的函數(shù),主要功能是:將OSRunning標志置為TRUE,然后獲取已建立的優(yōu)先級最高任務的堆棧指針,并從其堆棧中恢復處理器寄存器,最后執(zhí)行返回指令返回上述任務中運行該任務。(2)OSCtxSw():在本移植中,任務級任務切換用軟中斷intr31實現(xiàn),OSCtxSw()即為該中斷的中斷服務程序。它先要將當前處理器寄存器壓入當前任務的堆棧中,將當前堆棧指針保存到當前任務的任務控制塊中;然后用與OSStartHighRdy()相類似的方法運行當前處于就緒態(tài)中優(yōu)先級最高的任務。(3)OSIntCtxSw():該函數(shù)被OSIntExit()函數(shù)調用,用于在ISR中進行任務切換。它與OSCtxSw() 的區(qū)別在于無需對當前任務的工作現(xiàn)場進行保存,因為這一工作在進入ISR之時已經(jīng)做了。(4)OSTickISR():用定時器產(chǎn)生一個周期為恒定值的時鐘源提供給µC/OS-Ⅱ,這是µC/OS-Ⅱ時間延遲和超時功能的時間基準。OSTickISR()是該定時器周期中斷的中斷服務程序。它主要有兩個功能:一個是調用OSTimeTick()函數(shù),計算自系統(tǒng)上電以來所經(jīng)歷的時鐘節(jié)拍數(shù),并將每個處于延時等待狀態(tài)任務的OSTCBDIy項減1;另一個是調用OSIntExit()函數(shù)查看是否有更高優(yōu)先級的任務因時鐘節(jié)拍到來而延遲時間到并進入就緒態(tài),如果有,則進行中斷級的任務切換。另外,在該函數(shù)的入口處要將OSIntNesting加1;在出口處將OSIntNesting減1。其中堆棧的構造,采用了系統(tǒng)庫函數(shù)I$$SAVE和I$$RSET函數(shù)來保護/恢復現(xiàn)場、保護/恢復任務棧。時鐘節(jié)拍TICK中斷由實時時鐘完成,但是2407A中沒有此定時器,移植是采用T1的周期中斷來實現(xiàn)的,時鐘頻率為10M,4倍頻后CPU時鐘為40M。系統(tǒng)初始化代碼如下。

ldp #00e0h ;指向第224頁(0x7000~0x707F)

splk #00e8h,WDCR ;不使能看門狗

splk #080feh,SCSR1 ;時鐘4倍頻

ldp #DP_EVA ;指向第232頁(0x7400~0x747F)

splk #080h,EVAIMRA ;通用定時器1 周期中斷使能

splk #0ffffh,EVAIFRA ;清中斷標志 ;

splk #0,GPTCONA ;無控制操作

splk #4E20h,T1PER ; 定時器計數(shù)使能 ,周期為20000

splk #0,T1CNT ; 計數(shù)初值清0

splk #080Ch,T1CON ;TMODE=01 連續(xù)增/減計數(shù)模式,計數(shù)時鐘不分頻

必須在最高優(yōu)先級任務中開啟定時器,系統(tǒng)在優(yōu)先級為0的任務里開啟T1。為提高系統(tǒng)的實時性,設置T1每500us(20000/40M)產(chǎn)生一次T1周期中斷,即TICK為500us,µC/OS-Ⅱ每500us做一次任務調度。

3. 移植代碼測試

CCS是一個強大的集成開發(fā)環(huán)境,帶有源碼級的調試工具,按照Jean J.Labrosse推薦的移植代碼測試方法和步驟很快完成了函數(shù)OSTaskStkInit()、函數(shù)OSStartHighRdy()、函數(shù) OSCtxSw()、OSIntCtxSw()和OSTickISR()函數(shù)的驗證工作。證實了移植代碼是能正常工作的。為進一步測試其可靠性,又另外創(chuàng)建了15個任務,并用上了µC/OS-Ⅱ的信號量和郵箱同步機制,在每個任務里加上不同的發(fā)光二極管,經(jīng)測試其實時性和穩(wěn)定性都很好優(yōu)異。

4. 任務調度過程中優(yōu)先級翻轉問題及解決

優(yōu)先級翻轉是即當一個高優(yōu)先級任務通過信號量機制訪問共享資源時,該信號量已被一低優(yōu)先級任務占有,而這個低優(yōu)先級任務在訪問共享資源時可能又被其它一些中等優(yōu)先級的任務搶先,因此造成高優(yōu)先級任務被許多具有較低優(yōu)先級的任務阻塞,實時性難以得到保證。解決優(yōu)先級翻轉問題有優(yōu)先級天花板和優(yōu)先級繼承兩種辦法。優(yōu)先級天花板是當任務申請某資源時,把該任務的優(yōu)先級提升到可訪問這個資源的所有任務中的最高優(yōu)先級,這個優(yōu)先級稱為該資源的優(yōu)先級天花板。這種方法簡單易行,不必進行復雜的判斷,不管任務是否阻塞了高優(yōu)先級任務的運行,只要任務訪問共享資源都會提升任務的優(yōu)先級。在µC/OS-Ⅱ中,可以通過 OSTaskChangePrio()改變任務的優(yōu)先級,但是改變任務的優(yōu)先級是很花時間的。如果不發(fā)生優(yōu)先級翻轉而提升了任務的優(yōu)先級,釋放資源后又改回原優(yōu)先級,則無形中浪費了許多CPU時間,也影響了系統(tǒng)的實時性。優(yōu)先級繼承是當任務A申請共享資源S時,如果S正在被任務C使用,通過比較任務C與自身的優(yōu)先級,如發(fā)現(xiàn)任務C的優(yōu)先級小于自身的優(yōu)先級,則將任務C的優(yōu)先級提升到自身的優(yōu)先級,任務C釋放資源S后,再恢復任務C的原優(yōu)先級。這種方法只在占有資源的低優(yōu)先級任務阻塞了高優(yōu)先級任務時才動態(tài)的改變任務的優(yōu)先級,如果過程較復雜,則需要進行判斷。µC/OS-Ⅱ不支持優(yōu)先級繼承,而且其以任務的優(yōu)先級作為任務標識,每個優(yōu)先級只能有一個任務,因此,不適宜在應用程序中使用優(yōu)先級繼承。

在µC/OS-Ⅱ中,為解決優(yōu)先級翻轉影響任務實時性的問題,可以借鑒優(yōu)先級繼承的方法對優(yōu)先級天花板方法進行改進。對µC/OS-Ⅱ的使用,共享資源任務的優(yōu)先級不是全部提升,而是先判斷再決定是否提升。即當有任務A申請共享資源S時,首先判斷是否有別的的任務正在占用資源S,若無,則任務A繼續(xù)執(zhí)行,若有,假設為任務B正在使用該資源,

則判斷任務B的優(yōu)先級是否低于任務A,若高于任務A,則任務A掛起,等待任務B釋放該資源,如果任務B的優(yōu)先級低于任務 A,則提升任務B的優(yōu)先級到該資源的優(yōu)先級天花板,當任務B釋放資源后,再恢復到原優(yōu)先級。在µC/OS-Ⅱ中,每個共享資源都可看作一個事件,每個事件都有相應的事件控制塊 ECB。在ECB中包含一個等待本事件的等待任務列表,該列表包括OSEventTbl[]和OSEventGrp兩個域,通過對等待任務列表的判斷可以很容易地確定是否有多個任務在等待該資源,同時也可判斷任務的優(yōu)先級與當前任務優(yōu)先級的高低,從而決定是否需要用 OSTaskChangePio()來改變任務的優(yōu)先級。這樣,僅在優(yōu)先級有可能發(fā)生翻轉的情況下才改變任務的優(yōu)先級,而且利用事件的等待任務列表進行判斷,比用OSTaskChangePio()來改變任務的優(yōu)先級速度快,并占用較少的CPU時間,有利于系統(tǒng)實時性的提高。

參考文獻:

[1]鄔可軍,朱銘鋯等.DSP實時多任務操作系統(tǒng)設計與實現(xiàn)[M]. 北京:電子工業(yè)出版社, 2005.

[2]鐘堅文,蔡旭.基于μC/OS-II的CAN總線驅動程序設計[J].微計算機信息,2005,7-2:35-37.[!--empirenews.page--]

[3]Jean J.Labrosse著.邵貝貝等譯.嵌入式實時操作系統(tǒng)µC/OS-Ⅱ[M]第2版.北京,北京航空航天大學出版社,2003.5

[4]劉和平,王維俊等. TMS320LF240X DSP C語言開發(fā)應用[M]. 北京:北京航空航天大學出版社, 2003.

[5]TI.Code Composer User\'s Guide.SPRU509C.pdf

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉