<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于A(yíng)RM的LCU測試系統的設計

基于A(yíng)RM的LCU測試系統的設計

作者: 時(shí)間:2009-02-26 來(lái)源:網(wǎng)絡(luò ) 收藏

隨著(zhù)我國機車(chē)控制水平的不斷提高,微機控制已經(jīng)成為我國機車(chē)控制的重要控制方式,而邏輯控制單元(Logic Control Unit)作為主要完成機車(chē)運行邏輯控制、電路故障記錄控制等功能的控制模塊,是關(guān)系機車(chē)安全運行的重要部件。與傳統觸點(diǎn)控制電路相比,具有可靠性高、體積小、通用性好、維護簡(jiǎn)單方便等優(yōu)點(diǎn)。
  傳統的檢測包括人力檢測、單片機檢測和PC機通過(guò)串口控制開(kāi)發(fā)板檢測[1]。但是隨著(zhù)LCU生產(chǎn)制造水平的提高,傳統的檢測方法已經(jīng)不能很好地完成測試任務(wù)。
  具有開(kāi)發(fā)周期短、功耗低、性能優(yōu)越等特點(diǎn),能夠滿(mǎn)足LCU檢測的要求。Linux操作系統開(kāi)發(fā)的通用LCU檢測軟件,可以提供多層次、多場(chǎng)合的復用,可節省設備成本,具有巨大的市場(chǎng)前景和經(jīng)濟效益。
1 系統原理
  LCU檢測就是對LCU內部運行邏輯做出測試并進(jìn)行故障診斷。通過(guò)向被測試的LCU發(fā)出初始命令,并查看其輸出結果是否與參考輸出相同,從而判斷被測試的LCU邏輯是否正確。
  本文沿用傳統繼電器控制中的部分概念進(jìn)行軟件分析。傳統硬件繼電器觸點(diǎn)分為“常開(kāi)觸點(diǎn)”和“常閉觸點(diǎn)”兩類(lèi)。一條線(xiàn)路的運行結果會(huì )反映到另外一個(gè)線(xiàn)圈上,因此,繼電器控制的輸出可以用線(xiàn)圈表示。本文沿用硬件繼電器中的名稱(chēng)進(jìn)行軟件邏輯分析。在程序中以BOOL變量TRUE表示觸點(diǎn)開(kāi)狀態(tài),FALSE表示觸點(diǎn)閉狀態(tài)。
  線(xiàn)路上的信號都可以采用二進(jìn)制表達,所以測試的范圍會(huì )根據線(xiàn)路上觸點(diǎn)個(gè)數呈現指數增長(cháng)。對于要求不太嚴格的控制信號,只要求在適當的條件下,得到開(kāi)通或閉合的結果,其動(dòng)作的條件為充分不必要條件。對于要求嚴格的控制信號,不僅要求在確定的條件下得到應有的結果,而且要保證這個(gè)條件是充分必要條件。因此,很大程度上測試可能會(huì )遍歷觸點(diǎn)的所有組合,測試的總體消耗時(shí)間就會(huì )擴充到很大的時(shí)間范圍。假設一條線(xiàn)路的信號流動(dòng)經(jīng)過(guò)時(shí)間值為ns, 則計算一條包含20個(gè)觸點(diǎn)的線(xiàn)路的全部測試時(shí)間為220ns。
  可見(jiàn),測試情況的選擇十分重要。測試復雜性的主要矛盾在于:需要證明充分必要條件的線(xiàn)路的多少以及該線(xiàn)路的觸點(diǎn)的多少。工業(yè)標準反映在程序中的情況就是保留測試的選擇性,便于在后續工作中進(jìn)行選擇和修改。此外,控制程序的算法,進(jìn)行復合運算,提高測試的效率也是關(guān)鍵所在。本系統的硬件框圖如圖1所示。

本文引用地址:http://dyxdggzs.com/article/152632.htm

2 操作系統移植
  交叉編譯器的設置是嵌入式系統開(kāi)發(fā)的第一步。所謂交叉編譯就是在一種體系結構的機器上編譯出能夠運行于另一種體系機器上的代碼。若要開(kāi)發(fā)在目標板上運行的程序,無(wú)論是操作系統還是應用程序,都必須是體系指令的二進(jìn)制代碼[2]。但是直接在A(yíng)RM目標板上開(kāi)發(fā)程序,無(wú)論是程序運行速度還是調試手段,都嚴重制約了開(kāi)發(fā)效率,有些程序的編寫(xiě)更需要在PC機上才能完成。交叉編譯的作用,就在于在PC機上開(kāi)發(fā)程序,交叉編譯后,再放置到ARM目標板上去執行。編譯順序如圖2所示。

搭建ARM交叉編譯器的步驟:(1)編譯安裝binutils;(2)安裝linux 的頭文件;(3)編譯安裝gcc的c 編譯器;(4)編譯安裝 glibc;(5)編譯安裝gcc的c、c++編譯器。
  Boot-loader是RAM芯片的引導程序,它的作用是加載操作系統。兩個(gè)著(zhù)名的開(kāi)源Boot-loader,其中一個(gè)是U-boot,它的形式就是一個(gè)代碼包,包中按照Linux一般的編程習慣和不同的目標板,將相應的匯編和C語(yǔ)言代碼羅列在對應的文件夾下,讓開(kāi)發(fā)人員自行配置。
  修改U-boot的過(guò)程:(1)基本的硬件初始化;(2)跳轉到 Stage2 的 C 入口點(diǎn);(3)定義函數Nand_init;(4)跳轉到Kernel。
  Linux內核就是一個(gè)可執行的Linux操作系統的套件集合,簡(jiǎn)稱(chēng)內核[3]。套件的選擇,就是內核的配置。內核的配置表明了內核的可調整性。根據Linux軟件的開(kāi)發(fā)規則,可到Linux內核源碼包的路徑下,在終端使用配置命令進(jìn)行內核配置。在配置內核的時(shí)候,需要定義內核啟動(dòng)的命令行。
3 LCU檢測系統應用程序
3.1 軟件及其要素
  軟件的應用設計,就是確定軟件的各個(gè)部分及各部分之間的相互關(guān)系,信息在其中發(fā)送、傳遞和接收,以及部分運動(dòng)發(fā)展的走向和趨勢,最終得到可以預見(jiàn)的結果[4]。它應該遵循下面四個(gè)基本要素:名稱(chēng)、問(wèn)題、解決方案效果。
面向對象的軟件開(kāi)發(fā),從不同的對待問(wèn)題的層次出發(fā)能得到不同問(wèn)題的解決方案。其基本工作流程如圖3所示。

3.2 定義基本的類(lèi)和對象及人機界面的設計
  在需求分析的說(shuō)明中,最常出現的三個(gè)名詞分別是觸點(diǎn)、測試和線(xiàn)圈。每個(gè)測試包含了不同的線(xiàn)圈,每個(gè)線(xiàn)圈又分別由觸點(diǎn)組成。所以,觸點(diǎn)、線(xiàn)圈和測試能夠分別抽象出來(lái)做成單獨的類(lèi)。觸點(diǎn)必須有ID、常開(kāi)/常閉的類(lèi)型和運行中處于的值都應該在屬性中出現。測試的ID應該能夠區分是哪一次測試,并且記錄下所包含觸點(diǎn)的初始值以及標準情況下結果的預計值。線(xiàn)圈則以觸點(diǎn)和測試作為成員變量。
  首先設計用二維數組來(lái)模擬測試與觸點(diǎn)的關(guān)系。假設數組的橫向和縱向表示分別為測試和觸點(diǎn),則某個(gè)線(xiàn)圈的設計如圖4所示。

對照實(shí)際情況,可以使用二維數組進(jìn)行描述。觸點(diǎn)的加入和刪除就是列的插入和刪除運算,測試的加入和刪除就是行的插入和刪除運算。對某線(xiàn)圈的實(shí)驗就是把每行遍歷一遍,結果對照預計值進(jìn)行邏輯判斷。但這僅僅是表達了單個(gè)線(xiàn)圈的情況,多個(gè)線(xiàn)圈則呈現如圖5所示的書(shū)頁(yè)式的結構。

直觀(guān)上看,重疊配置的線(xiàn)圈就像是檢查手冊的一封封頁(yè)面,測試整個(gè)系統的方法就是翻弄這本“書(shū)”,從頭至尾把所有的線(xiàn)圈遍歷一遍。
3.3 序列化存儲類(lèi)serial和鏈表類(lèi)
  如果延續這樣的思路,則關(guān)于數組的操作會(huì )產(chǎn)生新的問(wèn)題:C語(yǔ)言中定義數組必須先確定數組的大小才能分配合適的內存。例如,要得到一個(gè)m×n二維數組,則必須在編譯時(shí)確定m和n的大小,但實(shí)際上要求m和n是可變的。
  由于文件是內部調用的接口,應該先沿著(zhù)采用文件來(lái)登記測試項目的結論進(jìn)行分析。采用序列化技術(shù)能夠簡(jiǎn)單而方便地實(shí)現文件存儲。序列化是指將對象實(shí)例的狀態(tài)存儲到可持久保持信息的物理設備的過(guò)程,其特點(diǎn)就是線(xiàn)性存儲。序列化技術(shù)實(shí)現了文件的存儲,同時(shí)它也給出了一種思路:把所有一切都統一對待,變成一根主線(xiàn)。應用到“二維結構”上就是將二維表變成一維的大表,同時(shí)用指針來(lái)保持邏輯的連接。如圖6所示。

但序列化只提供鏈型的存儲形式,只能用一維的鏈表模擬二維數組,因為不知道二維鏈表的指針應該如何安排。
  決定采用鏈式聯(lián)系的方法:用指針來(lái)實(shí)現連接。但是指針的傳遞跨越了類(lèi),因此有必要把鏈式結構直接抽象成類(lèi),產(chǎn)生定義觸點(diǎn)鏈表類(lèi)、測試鏈表類(lèi)和線(xiàn)圈鏈表類(lèi),并將它們抽象出一個(gè)基本的鏈表類(lèi),實(shí)現鏈表基本的操作,再從它派生出上述三個(gè)鏈表類(lèi)。
3.4 計算預計值
  測試隨意地更改其所包含的觸點(diǎn),隨之變動(dòng)的是測試的預計值。這可以采取人工輸入來(lái)實(shí)現,但是如果用表達式字符串來(lái)表達測試的邏輯計算,可以通過(guò)字符替換的方法讓機器來(lái)實(shí)現。
  表達式字符串中間必須有觸點(diǎn)的ID名字,常閉觸點(diǎn)的名字前加“~”,測試線(xiàn)路的“與”邏輯用字符“*”來(lái)表示,或邏輯用字符“|”來(lái)表示(也可以選擇其他的計算字符),用括號表示優(yōu)先的線(xiàn)路邏輯,空格是人性化的適應性定義。這樣即可以表達出線(xiàn)路的邏輯。
  計算預計值的算法如下:
  (1) 輸入目標字符串。
  (2) 首先去空格。
  (3) 用觸點(diǎn)的狀態(tài)值替換觸點(diǎn)ID,如果是FALSE,替換成F,如果是TRUE,替換成T。
  (4) 開(kāi)始循環(huán): F*F 替換成F
       F*T 替換成F
   T*F 替換成F
   T*T 替換成T
   F|F 替換成F
   F|T 替換成T
   T|F 替換成T
   T|T 替換成T
   (T) 替換成T
   (F) 替換成F
  測量字符串長(cháng)度,如果和上次相比變小,則重新開(kāi)始循環(huán);如果沒(méi)有變化,則跳出循環(huán)進(jìn)行下一步。
  (5) 判斷:如果字符串==T,則說(shuō)明預計值是TRUE;如果字符串==F,則說(shuō)明預計值是FALSE;如果字符串是其他值,說(shuō)明輸入的表達式有誤,提示重新確定表達式。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>