新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 使用嵌入式處理器對可編程邏輯器件重編程

        使用嵌入式處理器對可編程邏輯器件重編程

        作者: 時間:2012-06-05 來源:網絡 收藏

         1 引言

        本文引用地址:http://www.104case.com/article/148945.htm

          在系統里除了外還會經常到可,有些可在被焊接到印制電路板上之后還可以對其程序進行更新,這種特性稱之為“在系統可重能力”(In SystemReprogrammability,ISR)。在單板開發階段,通常下載電纜通過IEEE Standard 1149.1 JTAG接口對重編程。在產品原型及制造階段,單板上的JTAG接口很可能出于產品外形及內部結構設計的考慮已經無法與下載電纜相連接,此時將無法通過下載電纜對邏輯器件重編程。基于系統的產品通常對外提供串行接口或以太網接口,這些接口由嵌入式來控制[1] ,因此可以通過這些接口將邏輯器件的更新程序發送到,由處理器對可編程邏輯器件重編程。

          2 實現方法

          2.1 軟件方面

          串行接口由于協議實現簡單、占用資源少而被嵌入式系統廣泛,只需要使用串行接口連接線將主機的串行接口與產品的串行接口相連接,通過主機上的串行接口通訊軟件將更新程序發送給處理器即可,文件傳輸協議一般采用Xmodem協議;而對于基于嵌入式系統的網絡產品而言,由于自身提供以太網接口,而且操作系統內嵌TCP/IP協議棧,因此可以使用以太網接口將更新程序發送給處理器,文件傳輸協議一般采用TFTP協議,嵌入式系統運行TFTP服務器程序,主機上運行TFTP客戶端程序[2] 。

          嵌入式處理器通過串行接口或以太網接口接收到的可編程邏輯器件的更新程序是一種Jam文件,使用類似于Altera公司Quartus II development tool的開發工具根據Jam標準和測試語言(Jam Standard Test andProgramming Language 以下簡稱Jam語言)的要求由Programmer Object File (*.pof,文件后綴名為pof)一類的目標文件轉換生成[3] 。Jam文件是一個ASCII文件,文件中包含了對可編程邏輯器件進行編程的所有信息,包括編程算法和數據,詳細介紹如下:

          (1)“注解字段”部分存儲了Jam文件的相關信息,包括可編程邏輯器件的名稱,Jam文件的創建時間,使用的Jam語言的版本等等。

          (2)“變量聲明/初始化”部分由編程/校驗的數據和Jam文件用到的一些變量聲明組成。

          (3)“算法部分”包含了對可編程邏輯器件編程需要用到的命令和代碼,包括空白檢查、擦除、編程和校驗等等所有可以在可編程邏輯器件上執行的功能。在代碼中可以使用分支或循環結構。

          嵌入式處理器在接收到Jam文件之后通過運行一個Jam Player程序來解析這個Jam文件,翻譯文件中每一條指令,并對JTAG端口進行數據的讀寫操作,從而完成對ISR可編程邏輯器件程序的更新工作。Jam Player是一個C語言程序,其main主程序執行所有的基本功能,包括對Jam文件內容的解析,指令的翻譯等,這部分內容對于所有的嵌入式系統和Jam文件來說都是一樣的。而Jam Player的I/O功能,包括I/O管腳的尋址、延時程序、文件的I/O以及操作系統相關的功能都包含在jamstub.c文件里,通過修改這個文件Jam Player可以適用于任何系統結構。當Jam Player接收數據的時候,jamstub.c能夠從Jam文件取回數據,或者從TDO管腳移位讀取數據。jamstub.c也能將處理過的JTAG數據發送到3個JTAG管腳(TDI、TMS和TCK),將出錯消息和相關信息返回給調用程序。升級ISR可編程邏輯器件的程序只需要改變Jam文件。

          Jam Player通過一個jam_jtag_io函數(int jam_jtag_io(int tms_tdi))來控制對JTAG接口的讀寫操作。每次調用這個函數的時候,JTAG的TMS和TDI輸出信號將被設定為需要的值,而TDO輸入信號將被采樣,值將被返回,之后TCK時鐘信號將產生一個下降沿。tms_tdi參數包含3比特信息,分別指示TMS信號和TDI信號的狀態以及是否需要讀取TDO的輸出(如果不需要用到TDO的值則可以跳過對TDO的讀取操作)。最低位比特代表TMS的值,第2位比特代表TDI的值,第3位比特指示是否讀取TDO:如果置位,則必須讀取TDO的值,否則不需要。如果TDO為低電平,返回零值,高電平則返回非零值。如果沒有對TDO進行讀取也將返回零值。

          2.2 硬件方面

          嵌入式處理器與JTAG 器件連接的方法有兩種,一種是直接將嵌入式處理器與JTAG 器件連接起來,這種方法處理器需要有專門四個管腳用于JTAG 接口,節省了電路板空間的同時卻占用了處理器的四個管腳;另一種方法通過一個接口邏輯將JTAG 器件連接到處理器的總線,處理器通過JTAG 器件對應的地址來對其進行讀寫操作[4] 。

          圖1 給出了接口邏輯的一個范例。當接口邏輯收到正確的地址和控制信號,它將對TDI、TCK 和TMS信號進行同步,并通過多路復用器驅動輸出管腳,下載電纜也可以通過多路復用器對JTAG 鏈進行編程或驗證[5] 。TDI、TCK 和TMS 信號的同步通過嵌入式處理器的時鐘信號和寄存器來完成,TDO 的緩沖區可以防止總線競爭,TDI、TCK 和TMS 的緩沖區在調試的時候還可以用來讀回寄存器的值。圖中的與門通過R/W 信號來控制執行讀或寫操作,而AS 和DS 信號則可以在另一個級別上對電路進行選擇和去選擇。

        接口邏輯

        圖1 接口邏輯

          2.3 內存使用情況

          下面討論使用嵌入式處理器對可編程邏輯器件重編程時內存的使用情況。為了能夠兼容沒有內存分配服務的嵌入式處理器,Jam Player 不僅需要程序存儲空間而且需要動態內存。程序存儲空間(如硬盤驅動器或ROM)用于存儲Jam Player 可執行二進制文件和Jam 文件;動態內存(如RAM)將在調用Jam Player的時候使用。

          Jam Player 按照下面的步驟來使用內存:

          (1)嵌入式處理器從ROM 中調用Jam Player;

          (2)Jam Player 從ROM 中讀取Jam 文件,然后把它存入RAM;

          (3)Jam Player 對Jam 文件中包含的壓縮程序數據解壓,并將解壓后的數據存入RAM;

          (4)Jam Player 在RAM 中初始化符號表(symbol table)、堆棧(stack)和堆(heap)。

          符號表包含Jam 文件的標記(labels)和變量(variables);堆棧用于FOR 循環,CALL 和PUSH 語句;堆作為臨時內存用于數學表達式的求值以及填充數據的存儲。在處理Jam 文件時每碰到一個命令堆棧和堆大小都將增加,可用動態內存越來越少,而Jam 文件、解壓縮后的數據以及符號表需要的動態內存空間在整個過程中則保持不變。

          Jam Player 的內存使用情況如圖2 所示。

        Jam Player 的內存使用情況

        圖2 Jam Player 的內存使用情況

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鄂温| 九龙坡区| 呼伦贝尔市| 阳信县| 达州市| 永修县| 玉溪市| 隆林| 招远市| 广汉市| 南开区| 饶平县| 达日县| 镇安县| 安国市| 卓尼县| 区。| 镇远县| 曲麻莱县| 九寨沟县| 大姚县| 万州区| 固镇县| 客服| 石家庄市| 同心县| 高唐县| 宁晋县| 巴中市| 繁峙县| 东兰县| 汾阳市| 荣昌县| 女性| 宜春市| 武汉市| 彰化县| 霞浦县| 吴川市| 夹江县| 沙田区|