zynq平台,PS 與 PL共享記憶體的方法

2021-09-29 22:51:52 字數 1093 閱讀 3962

開發環境:ubuntu18.04

軟體環境:linux核心、uboot原始碼及fpga程式

硬體環境:zynq 開發板 mz7100

關於本文中所述問題,ps(arm linux)與(fpga) 共享的事ps端的記憶體。開發板的記憶體共有1g(0x00000000 ~ 0x40000000),其中768m(0x00000000 ~ 0x30000000)為linux作業系統所擁有,剩餘256m(0x30000000 ~ 0x40000000)作為ps與pl共用的記憶體。

這樣,就需要解決解決linux系統預留記憶體的問題,解決該問題有兩種方法:一種是通過配置uboot啟動引數,另一種是修改linux原始碼,我採用了第一種。

1、配置uboot啟動引數。

我們採用配置uboot啟動引數的方式,把linux系統可占用的記憶體空間限定到了 768m,引數如下:

optargs=mem=768m ethaddr=00:0a:35:00:01:20 cma=128m
其中,mem=768m 就是配置的啟動引數。這樣做的好處是,在不修改核心原始碼的情況下,就可以輕鬆的解決記憶體預留的問題,不足之處在於,這樣只能預留高位址段的記憶體,系統會自動把低位址段的記憶體分配至系統。

2、通過修改核心原始碼的方式

通過 memblock_free、memblock_remove兩個函式來釋放掉指定實體地址。

個人理解是,這種方式相當於先讓核心占用完整的記憶體,並建立記憶體對映表,然後通過這兩個函式,再釋放掉指定實體地址的對映關係,達到記憶體預留的目的。這種方法的好處在於可以可以靈活的實現記憶體預留,想預留那塊記憶體您做主,不便之處在於需要修改記憶體。

推薦乙個帖子:

另:申請記憶體總是失敗。經過檢視核心允許申請最大連續記憶體是16m(左圖),而我們的dma需要申請的連續記憶體是64m,因此會報錯,通過配置引數 cma=128m,把核心允許申請連續記憶體的大小改為128m(右圖),這樣就滿足了我們的需求,解決了驅動的問題。

ZYNQ 用PL按鍵通過中斷控制PS端LED亮滅

實現功能 pl端五個按鍵,可以觸發中斷,改變led燈的亮滅狀態 開發板 zedboard axi interconnect 實際是乙個開關,管理和只會axi介面之間的通訊 包括一對 一 一對多 多對 一 多對多 processing system7 0 為整個處理器系統提供復位訊號 axi gpio...

ZYNQ DMA實現PS與PL間資料傳輸通訊

一,ps到pl的資料傳輸流程 1,傳輸過程 1 向pl端查詢剩餘資料儲存長度 以byte為單位 2 通過寫暫存器設定pl端dma資料傳輸開始位址 3 通過寫暫存器設定pl端dma資料傳輸長度 以byte為單位 4 通過寫暫存器啟動pl端dma傳輸 5 通過讀暫存器查詢pl端dma是否完成資料傳輸 在...

共享記憶體 與 mmap

o 共享記憶體 可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間 程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然 由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以 ...