FPGA----基于ZYNQ 7020實現EPICS通信系統

1、本實驗過程來自博b站大神《神電測控》,原文地址:

EPICS實戰(上位機篇):基于LV ZYNQ實現的EPICS通信系統(大物理) - 嗶哩嗶哩https://www.bilibili.com/opus/933476043369480224EPICS實戰(下位機篇):基于LV ZYNQ實現的EPICS通信系統(重點) - 嗶哩嗶哩https://www.bilibili.com/opus/933487674120994835/?from=readlist2、CA下載地址,選擇32位的,安裝過程見b站大神的上位機篇。

Downloads - Helmholtz-Zentrum Berlin (HZB)Downloads of CA Labhttps://www.helmholtz-berlin.de/zentrum/organisation/it/calab/downloads_en.html3、SD卡分區。這個是Alinx產品自帶的,自帶debian8操作系統,有需要的聯系我即可。

4、測試安裝

a、使用筆記本給7020聯網(全網唯一)

(1)在筆記本上將無線和網口建立網橋;

(2)將網線把筆記本和另一臺電腦連起來;

(3)拔掉網線,將網線插入7020,7020即可聯網。

注意:直接給7020插入網線,7020可能會因為ip配置錯誤,導致無法聯網。

b、安裝EPICS

下載epics 3.16.2,也可以去官網直接下載,然后通過winscp傳上去

#下載epics
cd /.mkdir epicscd /epics/wget https://epics.anl.gov/download/base/base-3.16.2.tar.gz
#解壓并重命名為 basetar vxfz base-3.16.2.tar.gzmv base-3.16.2 base
#配置系統環境變量,vi模式下新建一個.bash_profil
cd ~vi .bash_profile

輸入內容:export EPICS_HOST_ARCH=$(/epics/base/startup/EpicsHostArch)

按下esc鍵盤,然后:wq!退出

#激活設置,執行source指令激活剛剛寫入的環境變量配置source .bash_profile
#查看設置,出現linux-arm則配置成功echo $EPICS_HOST_ARCH#返回:linux-arm
#進入base目錄下進行編譯(大約20min)cd /epics/basemake

出現下圖則為編譯成功

向bash_profile添加linux-arm的路徑

cd ~vi .bash_profile

輸入內容:export PATH=$PATH:/epics/base/bin/linux-arm

按下esc鍵盤,然后:wq!退出

#然后激活一下:source .bash_profile
cd /epics/base/bin/linux-arm softIoc#返回:epics>

出現下圖說明安裝成功

c、利用caget或者caput或者camonitor測試EPICS base環境是否正常

5、建立一個epics例子程序

# 導入環境
cd ~
source .bash_profile# 建立測試工程,在/epics/APP 目錄下
cd ~
cd /epics
mkdir APP
cd APP
# 創建工程
mkdir myApp1
cd myApp1
makeBaseApp.pl -t example myApp
makeBaseApp.pl -i -t example myApp# 編譯工程
make

?不出意外的話,成功如下圖所示

然后啟動epics例子程序

# 進入iocmyApp文件夾
cd iocBoot/iocmyApp
ls
# 啟動st.cmd
../../bin/linux-arm/my st.cmd

不出意外。成功的話是這樣的

?輸入? dbl 可以看到所有的管道

經過上述的操作,相信大家已經對epics有了一個大致的了解,下面我們將編寫aiRecord的驅動程序,包括dbd文件和C語言源代碼,然后編譯并啟動IOC,最后通過通道訪問查看運行結果,實現每秒生成0-999隨機數的功能,此教程來自博客:

EPICS aiRecord記錄的驅動程序開發實例_epics ioc 驅動開發-CSDN博客文章瀏覽閱讀1k次。本文詳細介紹了如何在EPICS(ExperimentalPhysicsandIndustrialControlSystem)環境中創建一個IOC(Input/OutputController),編寫aiRecord的驅動程序,包括dbd文件和C語言源代碼,然后編譯并啟動IOC,最后通過通道訪問查看運行結果,實現每秒生成0-999隨機數的功能。 https://blog.csdn.net/yuyuyuliang00/article/details/1182283446、aiRecord的程序編寫(需要3.15版本以上的epics)

cd ~source .bash_profilecd /epics/APP

創建aiDriver文件夾

mkdir aiDriver
cd aiDriver

創建名為aiDriver的例子程序

makeBaseApp.pl -t ioc aiDriver
makeBaseApp.pl -i -t ioc aiDriver# 名字寫 aiDriver

查看生成例子程序內容

root@zynq:/epics/APP/aiDriver# ls -R
.:
aiDriverApp  configure  iocBoot  Makefile./aiDriverApp:
Db  Makefile  src./aiDriverApp/Db:
Makefile./aiDriverApp/src:
aiDriverMain.cpp  Makefile./configure:
CONFIG  CONFIG_SITE  Makefile  RELEASE  RULES  RULES_DIRS  RULES.ioc  RULES_TOP./iocBoot:
iocaiDriver  Makefile./iocBoot/iocaiDriver:
Makefile  st.cmd

編寫驅動程序devAiDriver.c,在aiDriverApp/src目錄下 。注意,如果按照博主的代碼,在本環境下無法編譯。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>#include "alarm.h"
#include "dbDefs.h"
#include "dbAccess.h"
#include "epicsMath.h"
#include "recGbl.h"
#include "devSup.h"
#include "aiRecord.h"
#include "epicsExport.h"
#include "dbLink.h"/* Create the dset for devAiRandom */
static long init_record(void *precord);
static long get_ioint_info(int cmd, dbCommon *prec, IOSCANPVT *ppvt);
static long read_ai(aiRecord *prec);struct {long        number;DEVSUPFUN   report;DEVSUPFUN   init;DEVSUPFUN   init_record;DEVSUPFUN   get_ioint_info;DEVSUPFUN   read_ai;
} devAiDriver= {6,NULL,NULL,init_record,get_ioint_info,read_ai
};// 導出這個驅動程序,名稱為devAiDriver
epicsExportAddress(dset, devAiDriver);static long init_record(void *precord)
{aiRecord *prec = precord;srand((unsigned)time(NULL));prec->udf = FALSE;printf("init_record_ai called for %p\n", precord);return 0;
}static long readLocked(struct link *pinp, void *userPvt)
{aiRecord *prec = (aiRecord *)userPvt;if (!prec) {return S_db_badField; // 或其他適當的錯誤碼}// 產生一個0-999之間的隨機數prec->rval = rand() % 1000;if (dbLinkIsConstant(&prec->tsel) &&prec->tse == epicsTimeEventDeviceTime)dbGetTimeStamp(pinp, &prec->time);return 0;
}static long get_ioint_info(int cmd, dbCommon *prec, IOSCANPVT *ppvt) {printf("get_ioint_info called cmd=%d, prec=%p\n", cmd, prec);return 0;
}static long read_ai(aiRecord *prec)
{long status = dbLinkDoLocked(&prec->inp, readLocked, prec);if (status == S_db_noLSET)status = readLocked(&prec->inp, prec);printf("read_ai called, prec=%p\n", prec);return status;
}

同級目錄下創建devAiDriver.dbd文件:(如果你看過第5步驟生成的myApp例子文件可以知道,每個c文件都會有一個dbd文件與之對應,并且都在src文件夾下)

# 與devAiDriver.c中的DSET的devAiDriver對應
# 起一個叫 Random Ai 的名字
device(ai,INST_IO,devAiDriver, "Random Ai")

?修改同一級目錄下的Makefile文件,添加以下兩行:(注意,一定要在對應位置添加)

aiDriver_DBD += devAiDriver.dbd
aiDriver_SRCS += devAiDriver.c

進入目錄aiDriver/aiDriverApp/Db中創建aiTest.db文件

record(ai, "$(TEST):AiRandom")# 起一個叫 $(TEST):AiRandom 的PV
{field(DESC, "Test Ai Driver")field(SCAN, "1 second")    # 1 秒掃描一次field(DTYP, "Random Ai") # 指定設備驅動,與前文起的名字一致field(ASLO, "1.0")field(LINR, "NO CONVERSION")
}

相同路徑下的Makefile中添加以下一行:

DB += aiTest.db

?切換目錄并且編譯

cd ~cd /epics/APP/aiDriver# 將所有文件時間設置為當前時間
find . -type f -exec touch {} +make cleanmake

出現下圖則是編譯成功了

進入啟動目錄aiDriver/iocBoot/iocaiDriver,修改啟動腳本st.cmd

#!../../bin/linux-arm/aiDriver#- You may have to change aiDriver to something else
#- everywhere it appears in this file< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/aiDriver.dbd"
aiDriver_registerRecordDeviceDriver pdbbase## 裝載記錄實例
dbLoadRecords("db/aiTest.db","TEST=Random")cd "${TOP}/iocBoot/${IOC}"
iocInit

啟動程序

cd /epics/APP/aiDriver/iocBoot/iocaiDriver
# debug模式下進行
gdb --args ../../bin/linux-arm/aiDriver st.cmd
# 輸入run即可執行,如果代碼有錯,會自動停止

正常情況下,再啟動一個putty,即可看到這些輸出?

#命令,Random:AiRandom這個名字是在db中生成的
camonitor Random:AiRandom

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78445.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實驗四 增強型可靠文件傳輸系統

一、實驗目的和任務 掌握基于隊列的多文件傳輸機制理解斷點續傳的實現原理學習文件傳輸完整性保障方法 二、實驗內容 基礎功能驗證 單文件傳輸功能測試服務器狀態監控測試傳輸日志記錄驗證 新增功能實現 多文件隊列傳輸功能斷點續傳支持 三、實驗步驟 4.1 客戶端功能擴…

網絡Tips20-003

1.E1載波的控制開銷占2/32*100%6.25%&#xff0c;E1載波的基本幀傳送時間是125uS。 2.計算機在一個指令周期的過程中&#xff0c;為從內存讀取指令操作碼&#xff0c;首先要將.程序計數器(PC)的內容送到地址總線上 3.3DES算法:密碼學中&#xff0c;3DES是三重數據加密算法通稱…

【MySQL】索引(重要)

目錄 一、索引本質&#xff1a; 索引的核心作用 索引的優缺點 二、預備知識&#xff1a; 硬件理解&#xff1a; 軟件理解&#xff1a; MySQL與磁盤交互基本單位&#xff1a; 三、索引的理解&#xff1a; 理解page&#xff1a; 單個page&#xff1a; 多個page&#x…

【深入淺出MySQL】之數據類型介紹

【深入淺出MySQL】之數據類型介紹 MySQL中常見的數據類型一覽為什么需要如此多的數據類型數值類型BIT&#xff08;M&#xff09;類型INT類型TINYINT類型BIGINT類型浮點數類型float類型DECIMAL(M,D)類型區別總結 字符串類型CHAR類型VARCHAR(M)類型 日期和時間類型enum和set類型 …

數字化時代下,軟件測試中的滲透測試是如何保障安全的?

在如今數字化與信息化的時代&#xff0c;軟件測試中存在滲透測試&#xff0c;其位置十分重要&#xff0c;它借助模擬惡意攻擊的方式&#xff0c;去發現軟件系統所存在的漏洞以及安全問題&#xff0c;這是保障軟件安全的關鍵環節&#xff0c;接下來我會對它的各個方面進行詳細介…

Pytorch - Developer Notes 1/2

文章目錄 自動混合精度示例典型的混合精度訓練處理未縮放梯度梯度裁剪 處理縮放梯度梯度累積梯度懲罰 處理多個模型、損失函數和優化器多 GPU 工作環境下的注意事項單進程中的DataParallel分布式數據并行&#xff1a;每個進程對應一個GPU每個進程使用多塊GPU的DistributedDataP…

RuntimeError: CUDA error: __global__ function call is not configured

表明在 CUDA 設備上調用的核函數 沒有正確配置線程塊和網格維度。 一般體現在&#xff1a; 直接調用 kernel 函數&#xff0c;而不是通過 launch 函數 指定 kernel 函數調用 解決方法&#xff08;示例&#xff09;&#xff1a; // kernel function __global__ void Idtest_k…

cloudfare+gmail 配置 smtp 郵箱

這里介紹有一個域名后&#xff0c;不需要服務器&#xff0c;就可以實現 cloudfare gmail 的 郵箱收發。 為什么還需要 gmail 的 smtp 功能&#xff0c;因為 cloudfare 默認只是對 email 進行轉發&#xff0c;就是只能收郵件而不能發送郵件&#xff0c;故使用 gmail 的功能來進…

如何在 CentOS 7 命令行連接 Wi-Fi?如何在 Linux 命令行連接 Wi-Fi?

如何在 CentOS 7 命令行連接 Wi-Fi&#xff1f;如何在 Linux 命令行連接 Wi-Fi&#xff1f; 摘要 本教程覆蓋如何在多種 Linux 發行版下通過命令行連接 Wi-Fi&#xff0c;包括&#xff1a; CentOS 7、Ubuntu、Debian、Arch Linux、Fedora、Alpine Linux、Kali Linux、OpenSU…

基于PHP的在線編程課程學習系統

有需要請加文章底部Q哦 可遠程調試 基于PHP在線編程課程學習系統 一 介紹 在線編程課程學習系統基于原生PHP開發&#xff0c;數據庫mysql&#xff0c;前端jquery.js。系統角色分為學生&#xff0c;教師和管理員。(附帶參考設計文檔) 技術棧&#xff1a;phpmysqljquery.jsphps…

PyTorch_張量形狀操作

搭建模型時&#xff0c;數據都是基于張量形式的表示&#xff0c;網絡層與層之間很多都是以不同的shape的方式進行表現和運算。 對張量形狀的操作&#xff0c;以便能夠更好處理網絡各層之間的數據連接。 reshape 函數的用法 reshape 函數可以再保證張量數據不變的前提下改變數…

大模型實踐:圖文解鎖Ollama在個人筆記本上部署llm

使用在線模型服務時&#xff0c;我們常常需要支付API調用費用&#xff0c;這對于個人開發者或小型組織來說可能是一筆不小的開支。那么&#xff0c;有沒有方法可以在本地免費使用這些強大的模型呢&#xff1f;答案是肯定的——Ollama就是這樣一個工具。 當然如果是比較大的組織…

Python基本語法(lambda表達式)

lambda表達式 lambda的一般形式是在關鍵字lambda后面跟一個或多個參數&#xff0c;之后再緊跟一個 冒號&#xff0c;接下來是一個表達式。lambda是一個表達式&#xff0c;而不是一個語句&#xff0c;它能夠出現 在Python語法不允許def出現的地方。作為表達式&#xff0c;lambd…

【MySQL數據庫】用戶管理

目錄 1&#xff0c;用戶信息 2&#xff0c;創建/刪除/修改用戶 3&#xff0c;數據庫的權限 MySQL數據庫安裝完之后&#xff0c;我們最開始時使用的都是 root 用戶&#xff0c;其它用戶通常無法進行操作。因此&#xff0c;MySQL數據庫需要對用戶進行管理。 1&#xff0c;用戶…

Python的ArcPy基于Excel表格對大量遙感影像批量重分類

本文介紹基于Python中的ArcPy模塊&#xff0c;以Excel表格內的信息&#xff0c;對遙感影像加以重分類的方法。 首先&#xff0c;明確一下本文的需求。現有按照文章ArcPy批量將柵格文件的屬性表導出為Excel表格的方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/artic…

LabVIEW 中VI Server導出 VI 配置

該 LabVIEW VI 展示了在 VI Server 中配置和執行 Exported VIs 的過程&#xff0c;實現對服務器端導出 VI 的遠程調用與操作。 ? 具體過程及模塊說明 前期配置&#xff1a;需確保在 LabVIEW 的 “Tools> Options > VI Server > Protocols” 路徑下&#xff0c;啟用 …

論文閱讀:2024 ACM SIGSAC Membership inference attacks against in-context learning

總目錄 大模型安全相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 Membership inference attacks against in-context learning https://arxiv.org/pdf/2409.01380 https://www.doubao.com/chat/4030440311895554 速覽 這篇論文主要研究了…

從 Python 基礎到 Django 實戰 —— 數據類型驅動的 Web 開發之旅

主題簡介&#xff1a; 本主題以 Python 基礎數據類型為核心&#xff0c;結合 Django 框架的開發流程&#xff0c;系統講解如何通過掌握數字、字符串、列表、元組、字典等基礎類型&#xff0c;快速構建功能完善的 Web 應用。通過理論與實踐結合&#xff0c;幫助學員從零基礎 Py…

軟考 系統架構設計師系列知識點之雜項集萃(53)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;52&#xff09; 第85題 在靜態測試中&#xff0c;主要是對程序代碼進行靜態分析。“數據初始化、賦值或引用過程中的異常”屬于靜態分析中的&#xff08;&#xff09;。 A. 控制流分析 B. 數據…

Raycaster光線投射

Raycaster光線投射 3D虛擬工廠在線體驗 描述 光線投射Raycaster&#xff0c;用于進行raycasting&#xff08;光線投射&#xff09;。 光線投射用于進行鼠標拾取&#xff08;在三維空間中計算出鼠標移過了什么物體&#xff09;。 構造器 Raycaster( origin : Vector3, dire…