0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Zynq中程序存儲位置和設置方法

CHANBAEK ? 來源:嵌入式隨筆 ? 作者:嵌入式隨筆 ? 2023-10-17 17:00 ? 次閱讀

Zynq中存儲程序的地方有QSPI Flash,SD卡,EMMC。

Zynq的程序分為三部分,上電啟動的引導程序(fsbl),FPGA的程序,arm程序。這里以arm程序存儲位置為主進行討論。

1 ARM為裸機程序

裸機程序比較小,可以將全部程序(fsbl,F(xiàn)PGA的程序,arm程序)一起存儲在QSPI Flash,SD卡,EMMC中的任何一個位置。

1.1 固化在QSPI FLASH

使用JTAG和sdk固化。

或者先運行程序,然后通過程序將可執(zhí)行文件寫入到QSPI Flash中,然后將啟動方式設置為QSPI Flash啟動,下次啟動就可以從QSPI Flash啟動了。

1.2 固化在SD卡

通過讀卡器將可執(zhí)行文件復制進SD卡,將啟動方式設置為SD卡啟動,下次啟動就可以從SD卡啟動了。

1.3 固化在EMMC中

先運行sd卡中的程序(或者通過jtag運行程序),然后通過程序將可執(zhí)行文件寫入到emmc中,然后將啟動方式設置為emmc啟動,下次啟動就可以從emmc啟動了。

2 ARM為運行linux的程序

linux跟文件系統(tǒng)一般比較大,全部固化在QSPI Flash中裝不下。可以在QSPI Flash中固化一部分。

2.1 部分固化在QSPI FLASH中

可以在QSPI Flash中固化 fsbl+uboot+FPGA的程序+linux內核+設備樹,將根文件系統(tǒng)存儲在emmc中。

fsbl+uboot本身已經可以運行,uboot運行后會將其余部分拷貝到內存繼續(xù)運行。以下是uboot中的zynq-common.h中的一部分程序。

"qspiboot=echo Copying Linux from QSPI flash to RAM... && " 
 "sf probe 0 0 0 && " 
 "sf read ${bitstream_load_address} 0x120000 ${bitstream_size} && " 
 "fpga loadb 0 ${bitstream_load_address} ${bitstream_size} && " 
 "sf read ${kernel_load_address} 0x540000 ${kernel_size} && " 
 "sf read ${devicetree_load_address} 0x520000 ${devicetree_size} && " 
 "bootz ${kernel_load_address} - ${devicetree_load_address}?"

第三行是將fpga文件拷貝到內存中,第四行是處理內存中的fpga程序,第五行是將linux內核文件拷貝到內存中,第六行是將設備樹文件拷貝到內存中。然后開始運行內核。內核運行后會去運行emmc中的根文件系統(tǒng)。

可以看出 fsbl+uboot+FPGA的程序和裸機程序是一樣的,剩下的就是uboot執(zhí)行程序的一部分。如果linux內核+設備樹存儲在別的地方,只需要將上述程序修改為從相應地方拷貝到內存就可以。

固化的話,可以在sd卡中先運行程序,然后按照設定將QSPI Flash分區(qū)并將對應的執(zhí)行程序復制進QSPI Flash中,將emmc格式化為ext4文件系統(tǒng)在將跟文件系統(tǒng)復制進emmc中。再將啟動方式設置為QSPI Flash啟動,下次啟動就可以從qspi啟動了。

Qspi存儲程序的分區(qū)大小可以自定義但是要能存的下程序,比如fpga程序3Mb不能只給個2Mb的分區(qū)。

2.2 固化在SD卡

通過讀卡器將可執(zhí)行文件復制進SD卡,將啟動方式設置為SD卡啟動,下次啟動就可以從SD卡啟動了。

2.3 固化在EMMC中

先運行sd卡中的程序,然后通過程序將可執(zhí)行文件寫入到emmc中,然后將啟動方式設置為emmc啟動,下次啟動就可以從emmc啟動了。

3 區(qū)別與聯(lián)系

可以看出帶Linux的就是多了一段跳轉,固化在QSPI Flash中的時候由于全部程序比較大需要分散放。fsbl+第一段ARM程序需要在一起并且名字是固定的為BOOT.BIN(這是芯片內部預置程序決定的)。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FlaSh
    +關注

    關注

    10

    文章

    1635

    瀏覽量

    148033
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209523
  • 程序
    +關注

    關注

    117

    文章

    3787

    瀏覽量

    81049
  • Zynq
    +關注

    關注

    10

    文章

    609

    瀏覽量

    47182
  • emmc
    +關注

    關注

    7

    文章

    216

    瀏覽量

    52745
收藏 人收藏

    評論

    相關推薦

    讓STM32應用與存儲位置無關

    最近有客戶詢問,能否使用 STM32CubeIDE 在編譯時通過設置某個編譯選項,讓STM32 應用與存儲位置無關。這樣的優(yōu)勢是能使同一個固件被燒在 STM32 Flash 里的不同位置, 而在系統(tǒng)
    發(fā)表于 09-05 11:43 ?809次閱讀

    win10 IE瀏覽器無法更改臨時文件夾存儲位置

    臨時文件修改不了存儲位置的問題。這是怎么回事呢?接下來,小編就給大家介紹下win10系統(tǒng)下無法更改ie臨時文件位置的解決方案。具體方法如下: 1、每次用ie修改,注銷后還是沒有改變。2、可以通過修改注冊表
    發(fā)表于 03-08 13:46

    Keil C51 使用C語言編寫程序,怎么設置程序的起始存儲位置從0x1000開始

    使用STC 的IAP系列單片機,打算自己寫一段更新程序。求教C語言編寫的話要如何設置程序的起始存儲位置,該段程序準備
    發(fā)表于 02-09 17:27

    【求助】指定變量在各個片上存儲區(qū)域的存儲位置時出現(xiàn)...

    由于程序的運算量很大,想把L1D和L2當做普通RAM,并將指定的數(shù)組變量存儲在L1D和L2中。我的操作方法如下: 1. 先對L1DCFG和L2CFG寄存器進行操作,將L1D和L2配置為普通RAM而非
    發(fā)表于 05-13 06:40

    C語言中局部變量的存儲位置是如何分配的?

    ADS下C語言中局部變量的存儲位置是如何分配的?
    發(fā)表于 04-26 06:31

    Proteus中程序的調試及仿真的方法

    1.仿真的方法:將編譯好的程序載入單片機1雙擊繪制完電路原理圖中的單片機→在彈出的窗口中,點擊“Program File”后邊的小文件夾2找到之前編譯好的C語言程序文件(2.2中的第⑤步所在
    發(fā)表于 11-23 06:07

    存儲位元與存儲單元是什么含義

    存儲位元與存儲單元是什么含義?數(shù)據(jù)通信的方式可以分為哪幾種呢?
    發(fā)表于 01-21 07:17

    調試TMS570的F021庫時 cmd文件設置程序放到指定位置,但實際指定位置的內存卻全是FF,會是什么原因?

    在使用TMS570調試TI的F021庫時,cmd文件已經設置了代碼的存儲位置,但是在查看內存數(shù)據(jù)時,指定的存儲位置都是0xFFFFFFFF,有人遇到過同樣的問題嗎?
    發(fā)表于 04-17 10:21

    程序中內存應該如何分配?怎樣進行動態(tài)內存分配?

    程序在內存中是分段存儲的。 代碼段:存放語句轉換的數(shù)字;程序運行時不可修改; 全局段:用來記錄全局變量和靜態(tài)變量的存儲位置;不會隨著程序的運
    的頭像 發(fā)表于 08-12 10:52 ?8754次閱讀
    <b class='flag-5'>程序</b>中內存應該如何分配?怎樣進行動態(tài)內存分配?

    linux中程序調試的方法

    這是一個基本的調試問題的方法。 我們在程序中懷疑的地方插入print語句來了解程序的運行流程控制流和變量值的改變。
    發(fā)表于 06-16 09:34 ?1985次閱讀
    linux<b class='flag-5'>中程序</b>調試的<b class='flag-5'>方法</b>

    Proteus中程序的調試(Proteus與ICCAVR的聯(lián)合調試)

    1.仿真的方法:將編譯好的程序載入單片機1雙擊繪制完電路原理圖中的單片機→在彈出的窗口中,點擊“Program File”后邊的小文件夾2找到之前編譯好的C語言程序文件(2.2中的第⑤步所在
    發(fā)表于 11-15 13:21 ?11次下載
    Proteus<b class='flag-5'>中程序</b>的調試(Proteus與ICCAVR的聯(lián)合調試)

    單片機中程序和數(shù)據(jù)存放位置、與電腦內存和硬盤的類比,單片機和計算機程序啟動流程對比

    單片機中程序和數(shù)據(jù)存放位置、與電腦內存和硬盤的類比,單片機和計算機程序啟動流程對比
    發(fā)表于 11-26 17:51 ?14次下載
    單片機<b class='flag-5'>中程序</b>和數(shù)據(jù)存放<b class='flag-5'>位置</b>、與電腦內存和硬盤的類比,單片機和計算機<b class='flag-5'>程序</b>啟動流程對比

    如何開發(fā)與位置無關的 STM32 完整工程

    最近有客戶詢問,能否使用 STM32CubeIDE 在編譯時通過設置某個編譯選項,讓STM32 應用與存儲位置無關。
    的頭像 發(fā)表于 09-15 09:59 ?1648次閱讀

    如何修改邊沿存儲位的地址

    說明 使用“掃描 RLO 的信號上升沿”指令,可查詢邏輯運算結果 (RLO) 的信號狀態(tài)從“0”到“1”的更改。該指令將比較 RLO 的當前信號狀態(tài)與保存在邊沿存儲位( )中上一次查詢的信號狀態(tài)
    的頭像 發(fā)表于 06-28 16:20 ?849次閱讀
    如何修改邊沿<b class='flag-5'>存儲位</b>的地址

    如何開發(fā)與存儲位置無關的STM32應用?

    如何開發(fā)與存儲位置無關的STM32應用?
    的頭像 發(fā)表于 10-18 16:46 ?590次閱讀
    如何開發(fā)與<b class='flag-5'>存儲位置</b>無關的STM32應用?