色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于μC/OS-Ⅱ的1553B和ARINC429總線實(shí)時(shí)協(xié)議轉(zhuǎn)換系統(tǒng)的設(shè)計(jì)

          基于μC/OS-Ⅱ的1553B和ARINC429總線實(shí)時(shí)協(xié)議轉(zhuǎn)換系統(tǒng)的設(shè)計(jì)

          作者: 時(shí)間:2011-09-19 來(lái)源:網(wǎng)絡(luò) 收藏
          3.2 控制器模塊的

          本文引用地址:http://cafeforensic.com/article/150204.htm

            控制器模塊的結(jié)構(gòu)原理圖如圖3所示。整個(gè)控制器模塊主要由控制器、422通信電路、電路、隔離變壓器電路、FPGA控制邏輯及電平電路等組成。

            

          控制器模塊的結(jié)構(gòu)原理圖

            FPGA控制邏輯用Verilog HDL在QuartusII環(huán)境下編程實(shí)現(xiàn),主要完成以下功能:(1)產(chǎn)生對(duì)芯片BU61580操作的所有控制信號(hào);(2)產(chǎn)生對(duì)接收模塊和發(fā)送模塊操作的所有控制信號(hào); (3)為芯片BU61580、ARINC429接收模塊和ARINC429發(fā)送模塊產(chǎn)生各自的工作時(shí)鐘,其中分頻數(shù)N可通過(guò)軟件進(jìn)行賦值,實(shí)現(xiàn)可編程時(shí)鐘模塊;(4)建立FIFO模塊,在數(shù)據(jù)傳輸中緩沖和存儲(chǔ)數(shù)據(jù);(5)實(shí)現(xiàn)ARINC429信號(hào)接收和發(fā)送,包括同步處理、字頭檢驗(yàn)、奇偶校驗(yàn)、串并和并串轉(zhuǎn)換等。

            4 操作的移植、構(gòu)建和優(yōu)化

            將嵌入式內(nèi)核μII移植到DSP控制器TMS320LF2407上構(gòu)建一個(gè)低成本的通用嵌入式軟件平臺(tái),以進(jìn)行軟件的開(kāi)發(fā)。引入μII實(shí)時(shí)內(nèi)核的目的是要以很小的代價(jià),大大降低DSP系統(tǒng)軟件開(kāi)發(fā)的難度,同時(shí)使系統(tǒng)的實(shí)時(shí)性得到保證。

            4.1 μII移植的可行性分析

            所謂移植,就是使一個(gè)實(shí)時(shí)內(nèi)核能在某個(gè)處理器上運(yùn)行[7]。因?yàn)镃語(yǔ)言是跨平臺(tái)的,各種編譯器都支持,所以μC/OS-II和其他嵌入式操作系統(tǒng)一樣,和處理器無(wú)關(guān)的代碼主要用C語(yǔ)言寫(xiě)。雖然μC/OS-II系統(tǒng)的大部分源代碼都是用C 語(yǔ)言實(shí)現(xiàn)的,但仍需要使用X86 匯編語(yǔ)言來(lái)完成一些與處理器、寄存器相關(guān)的代碼[8]。這是因?yàn)?mu;C/OS-II在讀寫(xiě)處理器寄存器時(shí)只能通過(guò)匯編語(yǔ)言來(lái)實(shí)現(xiàn)。

            要順利移植μC/OS-II,處理器必須滿(mǎn)足以下要求:(1)處理器的C編譯器能產(chǎn)生重入代碼,利用C語(yǔ)言就可以打開(kāi)和關(guān)閉中斷;(2)處理器支持中斷,并能產(chǎn)生定時(shí)中斷;(3)處理器支持足夠的RAM(可能是幾千字節(jié))作為數(shù)據(jù)存儲(chǔ)的硬件堆棧; (4)處理器有將堆棧指針和其他CPU寄存器讀出和存儲(chǔ)到堆?;騼?nèi)存中的指令。

            顯然,采用的控制器TMS320LF2407及編譯器CCS均可滿(mǎn)足要求,因此完全可以在TMS320LF2407上移植嵌入式實(shí)時(shí)內(nèi)核μC/OS-II。

            4.2 μC/OS-II的代碼結(jié)構(gòu)和移植步驟

            μC/OS-II的代碼結(jié)構(gòu)以及它與硬件的關(guān)系如圖4所示,其全部代碼可以分為三個(gè)部分[9]:

            (1)與處理器無(wú)關(guān)的代碼。包括SOFTWAREμC/OS-IISOURCE目錄下的文件,主要提供μC/OS-II的系統(tǒng)服務(wù)、任務(wù)管理、任務(wù)間通信與內(nèi)存管理等。這部分代碼可完全移植到處理器上。

            

          μC/OS-II的代碼結(jié)構(gòu)以及它與硬件的關(guān)系

            (2)與應(yīng)用相關(guān)的代碼。包括OS_CFG.H和INCLUDES.H頭文件。OS_CFG.H文件包含μC/OS-II的初始化配置項(xiàng),由一系列#define constant語(yǔ)句構(gòu)成。INCLUDES.H是一個(gè)頭文件,在所有.C文件的第一行被包含。用戶(hù)可以通過(guò)編輯INCLUDES.H來(lái)增加自己的頭文件,但是用戶(hù)的頭文件必須添加在頭文件列表的最后。

            (3) 與處理器相關(guān)的代碼。即OS_CPU.H、OS_CPU_A.ASM及OS_CPU_C.C,絕大部分的移植工作都集中在這里。

            移植μC/OS-II的具體步驟是:(1)在OS_CPU.H中設(shè)置一個(gè)常量來(lái)標(biāo)識(shí)堆棧增長(zhǎng)方向;(2)在OS_CPU.H中聲明幾個(gè)用于開(kāi)關(guān)中斷和任務(wù)切換的宏;(3)在OS_CPU.H中針對(duì)具體處理器的字長(zhǎng)重新定義一系列數(shù)據(jù)類(lèi)型;(4)在OS_CPU_A.ASM中改寫(xiě)4個(gè)匯編語(yǔ)言的函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR();(5)在OS_CPU_C.C中用C 語(yǔ)言重新編寫(xiě)6個(gè)簡(jiǎn)單的C函數(shù): OSTaskStk Init()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()和OSTimeTick Hook();(6)修改主頭文件INCLUDES.H,將上面的三個(gè)文件和其他的頭文件加入。

            4.3 實(shí)時(shí)操作系統(tǒng)軟件平臺(tái)的優(yōu)化

            移植后的實(shí)時(shí)操作系統(tǒng)可根據(jù)具體硬件和性能需求進(jìn)行優(yōu)化,以獲得更高的執(zhí)行效率。

            (1) 裁剪[9]

            μC/OS-II具有源代碼開(kāi)放的優(yōu)點(diǎn),是一個(gè)可裁剪的操作系統(tǒng)。在實(shí)際應(yīng)用時(shí)可根據(jù)需要對(duì)源代碼進(jìn)行取舍,去掉不需要的服務(wù)以及不需要的變量和函數(shù),甚至可以根據(jù)需要改寫(xiě)相關(guān)函數(shù)。代碼的削減可通過(guò)設(shè)置OS_CFG.H中的#define OS_×××_EN為0來(lái)實(shí)現(xiàn)。本系統(tǒng)中取消了不需要的郵箱服務(wù)、任務(wù)掛起等功能,使得代碼非常簡(jiǎn)練,可靠性更好。此外,在μC/OS-II的源代碼中,函數(shù)執(zhí)行中有許多條件判斷,作用是防止參數(shù)的錯(cuò)誤傳遞。作為通用系統(tǒng),這些條件判斷是完全必要的,避免出現(xiàn)錯(cuò)誤時(shí)系統(tǒng)崩潰。但作為具體的應(yīng)用,只要在程序時(shí)保證參數(shù)傳遞的正確性,完全可以不用條件判斷,所以在本系統(tǒng)程序時(shí),取消了全部的條件判斷,從而提高了函數(shù)的執(zhí)行速度。

            (2) 改進(jìn)內(nèi)存管理

            μC/OS-II在內(nèi)存管理上顯得過(guò)于簡(jiǎn)單,其任務(wù)棧空間和內(nèi)存分區(qū)的創(chuàng)建采用了定義全局?jǐn)?shù)組的方法,即定義一維或二維的全局?jǐn)?shù)組,在創(chuàng)建任務(wù)或內(nèi)存分區(qū)時(shí),將數(shù)組名作為內(nèi)存地址指針傳遞給生成函數(shù)。這樣實(shí)現(xiàn)起來(lái)固然簡(jiǎn)單,但是不夠靈活有效。

            編譯器會(huì)將全局?jǐn)?shù)組作為未初始化的全局變量,放到應(yīng)用程序映像的數(shù)據(jù)段。數(shù)組大小是固定的,生成映像后不可能在使用中動(dòng)態(tài)地改變。對(duì)于任務(wù)??臻g來(lái)說(shuō),數(shù)組定義大了會(huì)造成內(nèi)存浪費(fèi),定義小了任務(wù)棧溢出會(huì)造成系統(tǒng)崩潰。對(duì)于內(nèi)存分區(qū),在不知道系統(tǒng)初始化后給用戶(hù)留下了多少自由內(nèi)存空間的情況下,很難定義內(nèi)存分區(qū)所用數(shù)組的大小??梢?jiàn),利用全局?jǐn)?shù)組來(lái)分配內(nèi)存空間是不合理的。另外,目前的μC/OS-II只支持固定大小的內(nèi)存分區(qū),容易造成內(nèi)存浪費(fèi)。所以應(yīng)該改進(jìn)以支持可變大小的內(nèi)存分區(qū)。

            因此,在本系統(tǒng)中采用如下方法來(lái)對(duì)內(nèi)存進(jìn)行管理:①系統(tǒng)初始化時(shí),正確安排代碼段和數(shù)據(jù)段的位置,從而確定用戶(hù)自由空間的起始地址;②用目標(biāo)板(LF2407)內(nèi)存最高端地址減去起始地址得到用戶(hù)自由空間的大小;③在自用空間中建立和使用內(nèi)存分區(qū),分配好任務(wù)堆棧、事件控制塊和消息隊(duì)列等各自?xún)?nèi)存大小。

            (3) 堆棧的使用和管理

            在μC/OS-II中,各任務(wù)的堆棧在邏輯上是相互獨(dú)立的,這樣在分配每一個(gè)任務(wù)堆棧區(qū)的大小時(shí),不但要考慮本任務(wù)中的局部變量和函數(shù)嵌套所需要的堆棧空間,還要考慮系統(tǒng)中所可能發(fā)生的最大層數(shù)的中斷嵌套所需的堆??臻g,從而要占用較多的RAM空間,在系統(tǒng)中有多個(gè)任務(wù)同時(shí)存在時(shí)尤其嚴(yán)重。如果對(duì)此考慮不足,則可能會(huì)出現(xiàn)運(yùn)行中的任務(wù)堆??臻g不足、溢出的情形,從而導(dǎo)致系統(tǒng)崩潰。

            針對(duì)上述問(wèn)題,本系統(tǒng)采用以下方法使用和管理堆棧:各任務(wù)棧相互分離,且不考慮中斷使用;另外分配一個(gè)工作棧,可滿(mǎn)足所需堆??臻g最大的任務(wù)在最大可能層數(shù)的中斷嵌套下使用。運(yùn)行時(shí),將當(dāng)前任務(wù)的任務(wù)堆棧內(nèi)容拷貝至工作棧中,在工作棧中運(yùn)行;當(dāng)發(fā)生任務(wù)切換時(shí),先將工作棧中的有用內(nèi)容保存到當(dāng)前任務(wù)棧,然后將待運(yùn)行任務(wù)的任務(wù)棧調(diào)入工作棧,在工作棧中運(yùn)行。在此過(guò)程中,堆棧指針始終指在工作棧區(qū)域內(nèi)。



          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉