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

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

3天內(nèi)不再提示

邏輯分析儀 怎么編輯自己需要的協(xié)議

深圳市夢源科技有限公司 ? 2024-01-12 14:11 ? 次閱讀

版本: 1.0.2

一、 前言

在DSView安裝目錄下,有一個decoders文件夾,里面有許多目錄是以各種協(xié)議名稱命名的。每個目錄下有至少2個擴展名為.py的文件,這些都是python代碼文件。在linux系統(tǒng)下,decoders目錄位于”/usr/local/share/libsigrokdecode4DSL”下。
DSView通過底層python解釋器執(zhí)行python代碼,對邏輯分析儀的數(shù)據(jù)進行解析,按各種算法得出需要的結(jié)果。每個協(xié)議目錄下必須存在兩個文件:

  1. _init_.py,用于發(fā)現(xiàn)模塊,這個文件名左右兩邊各有兩個下劃線,這個細節(jié)要注意;
  2. pd.py,用于編寫主要的邏輯代碼;
    這兩個文件如何編寫,請仔細閱讀下面的內(nèi)容。在1.2.0以上的新版本DSView中,decoders下的有一個名為example目錄為示例代碼。

二、python入門

python語言是一個解釋執(zhí)行的語言。在官方網(wǎng)站下載并安裝好python,就可以進行開發(fā)了。
新建一個文本文件,里邊輸入一行文字:
print('Hello,world!')
保存為 test.py,然后在命令行里輸入
python test.py
將會輸出“Hello,world!”
這里的python入門只是為了幫助一些讀者能夠順利閱讀部分協(xié)議代碼,它所講的python知識還不夠全面和深入,需要讀者自行通過其它方式獲得python資料,以便提升自己的python編程能力。

  1. 變量定義
    age = 1
    name = “Tom”
  2. 數(shù)值
    1, 1.11, 1000等都屬數(shù)值型數(shù)據(jù)
  3. 字符串
    以單引號或雙引號括起來的一串字符,表示字符串,如
    ’abc’
    “name”
  4. 列表
    []
    [1,2,3]
    [1,”abc”,”name”,[7,8,9]]
    列表里的元素用逗號隔開,上面的第一個列表是空列表,第二個列表全是數(shù)字,第三個列表有多種類型的元素,有數(shù)值、字符串、列表。
    a = [1,2,3]
    變量a是一個列表,通過a[n]方式讀取列表里的元素。n的取值從0開始到不超過且不等于列表長度的整數(shù)
    a[2] = 666
    將第3個元素設(shè)置成666,列表里的內(nèi)容可修改
    i = a[1]
    取列表a的第二個元素賦給變量i
  5. 字典
    d = {‘a(chǎn)ge’:20, ‘name’:’Tome’, ‘data’:[7,8,9]}
    字典里的每一項用一對鍵和值表示。如’age’:20
    d[‘name’] = ‘Same’
    將字典d的name值設(shè)置成’Same’
    s = d[‘name’]
    取字典d的name值賦給變量s
    字典里的鍵名可以是數(shù)字、字符串、元組等類型,如:
    {1:'張三'}
    {'name':''張三"}
    {(1,2,3): "張三"}
  6. 元組
    ()
    (1,2,3)
    (2,’abc’)
    元組跟列表一樣,不同的是用()括起來,元組只能讀,不能修改。
    注意:當(dāng)元組只有一個項時,要多打一個逗號,如:
    (1,)
  7. 函數(shù)
    def call(): #普通函數(shù)
    def call(self): #類成員函數(shù),第一個參數(shù)是必須的
    def call(a,b,c): #帶三個參數(shù)的函數(shù)

三、新建協(xié)議

  1. 新建協(xié)議目錄
    找到存放所有協(xié)議的decoders目錄。widnows下,它在DSView的安裝目錄里;
    在linux下,它在
    /usr/local/share/libsigrokdecode4DSL
    打開decoders目錄,新建一個子目錄,并給目錄取名字,要求是能體現(xiàn)協(xié)議名稱的名字。這里,我們的示列協(xié)議名為”lala”。
  2. __init.py文件
    在bala目錄下新建文件“__init.py”,加入一行如下代碼并保存:

from .pd import Decoder

  1. pd.py文件
    在bala目錄下,建新pd.py文件,用來編寫主要的代碼。

四、框架代碼模板

??以下是解碼協(xié)議代碼框架,寫在pd.py文件里。所有協(xié)議的代碼核心部分是一樣的。
下面從c模塊繼承一個類:

import sigrokdecode as srd class Decoder(srd.Decoder): api_version = 3 ##協(xié)議標(biāo)識,必須唯一 id = 'bala' ##協(xié)議名稱, 不一定要求跟標(biāo)識一致 name = 'bala' ##協(xié)議長名稱 longname = 'bala protocal' ##簡介內(nèi)容 desc = 'This is an example' ##開源協(xié)議 license = 'gplv2+' #第一句是導(dǎo)出c底層的模塊 #第二句是定義一個類,繼承自c底層的類

inputs = ['logic'] #接收的輸入的數(shù)據(jù)源,默認是是邏輯分析儀數(shù)據(jù) #在多層協(xié)議模式下,可使用上層協(xié)議的輸出名

outputs = ['bala'] #輸出的數(shù)據(jù)源名,在多層協(xié)議模式下, #其它協(xié)議可以使用這個輸出名指定數(shù)據(jù)輸入來源

tags = ['Embedded/industrial'] #協(xié)議的適用范圍標(biāo)簽

channels = ( {'id': 'c1', type:0, 'name': 'c1', 'desc': 'chan1-input'}, ) #必須要綁定的通道 #id:通道標(biāo)識, 任意命名 #'type':類型,有: -1:COMMON,0:SCLK,1:SDATA,2:ADATA #name:標(biāo)簽名 #desc:該通道的說明

optional_channels = ( {'id': 'c2', type:0, 'name': 'c2', 'desc': 'chan2-input'}, ) #可選通道,其它跟上面的一樣

options = ( {'id': 'debug_bits','desc': 'Print each bit', 'default': 'no', 'values': ('yes', 'no')}, {'id': 'wordsize', 'desc': 'Data wordsize', 'default': 0}, ) #提供給用戶通過界面設(shè)置的參數(shù) #根據(jù)業(yè)務(wù)需要來定義 #通過'self.options[id]'取值,id就是各個項的id值, #比如下面的'wordsize' #上面第一項是下拉框,第二項是輸入框

annotations = ( ('1', 'data1', 'test1'), ('2', 'data2', 'test2'), ('222', 'data3', 'test3'), ) #解析結(jié)果項定義 #annotations里每一項可以有2到3個屬性, #當(dāng)有3個屬性時,第一個表示類型 #類型對應(yīng)0-16個顏色,當(dāng)類型范圍 #在200-299時,將繪制邊沿箭頭

annotation_rows = ( ('lab1', 'row1', (0,)), ('lab2', 'row2', (1,2)), ) #解析結(jié)果行定義 #(0,)表示可輸出第1個定義的annotations類型 #(1,2)表示可輸出第2個和第3個定義的annotations類型

def __init__(self): self.reset() #這里調(diào)用reset函數(shù),完成一些變量的初始化 #構(gòu)造函數(shù),自動被調(diào)用, #這里調(diào)用reset函數(shù)完成一個變量的初始化

def reset(self): self.count = 0 #初始化函數(shù),這里定義類的私有變量

def start(self): self.out_ann = self.register(srd.OUTPUT_ANN) #這里注冊消息類型 #開始執(zhí)行解碼任務(wù)時,由c底層代碼自動調(diào)用一次 #這里,完成一些解碼結(jié)果項annotation類型的注冊 #有: OUTPUT_ANN、OUTPUT_PYTHON、 #OUTPUT_BINARY、OUTPUT_META #register函數(shù)是c底層類提供的

def put_ann(self,a,b,ann,data): self.put(a, b, self.out_ann, [ann, data]) #輸出內(nèi)容 #a,b為采樣位置的起點和終點 #ann為annotations定義的項序號 #data是一個列表,列表里有1到3個字符串,它們將顯示到屏幕 #annotation輸出到哪一行由annotation_rows決定 #self.out_ann就是上面注冊的消息類型了 #self.put是c底層類提供的函數(shù)

def decode(self): while True: (a,b)=self.wait({0:'r'}) #一直調(diào)用,直到所有數(shù)據(jù)處理完 #解碼任務(wù)開始時由c底層代碼調(diào)用 #這里不斷循環(huán)等待所有采樣數(shù)據(jù)被處理完成 #wait函數(shù)參數(shù)詳解: #wait函數(shù)可帶參數(shù),也可以不帶參數(shù), #不帶參數(shù)時將返回每個采樣數(shù)據(jù) #參數(shù)'{0:'r'}', 0表示匹配channels第1 #項綁定的通道,r表示查找向上邊沿 #wait函數(shù)可傳多個條件, #與條件:{0:'f',1:'r'}, #或條件:[{0:'f'},{1:'r'}] #h:高電平,l:低電平,r:向上邊沿, #f:向下邊沿, #e:向上沿或向下沿, #n:要么0,要么1 #wait函數(shù)前的變量(a,b),數(shù)量由定義 #的channels里的通道數(shù)決定,包括可選通道 #例如:共定義了4個通道, #則變成(a,b,c,d) = self.wait()

#c底層提供了兩個屬性: self.samplenum #當(dāng)前wait()調(diào)用匹配結(jié)束的采樣點位置 self.matched #是一個uint64類型數(shù)值, #表示0到63個通道的匹配信息, #通過位運算來獲取具體信息。

到這里,解碼協(xié)議代碼框架模板結(jié)束。

五、應(yīng)用示例

??在上面代碼框架的基礎(chǔ)上,我們接下來實現(xiàn)一個簡單的例子。具體是,通過解碼某一通道的數(shù)據(jù),從一個向上邊沿開始到向下邊沿結(jié)束,輸出采樣點差值信息。奇數(shù)次輸出放在第二行,偶數(shù)次輸出放在第一行。具體編碼和說明如下:

def decode(self): times = 0 rising_sample = 0 flag_arr = [{0:'r'}, {0:'f'}] flag_dex = 0 while True: edge = flag_arr[flag_dex] (a,b) = self.wait(edge) if flag_dex == 0: flag_dex = 1 rising_sample = self.samplenum else: flag_dex = 0 times += 1 falling_sample = self.samplenum v = falling_sample - rising_sample s = '%02X' % v ann = times % 2 self.put_ann(rising_sample, falling_sample, ann, [s]) #times用于輸出次數(shù)計數(shù),偶數(shù)次輸出到第一行,奇數(shù)次輸出到第二行 #ann = times % 2 對次數(shù)變量求余,其值在0和1中變換,調(diào)用put_ann時指定了annotation的序號 #再根據(jù)序號由annotation_rows決定輸出在哪一行 #邊沿條件就兩種:向上和向下,調(diào)用wait函數(shù)時,在這兩個邊沿條件中切換 #首次是取向上邊沿,然后再換成向下邊沿 #每次調(diào)用wait后,通過self.samplenum取采樣位置 #求出兩次的樣品位置差后,轉(zhuǎn)換成16進制的字符串,通過類函數(shù)put_ann輸出

六、解碼模塊工作原理

??通過c代碼和python代碼的互操作,將采樣數(shù)據(jù)交給python分析。經(jīng)過一系列的處理,最終生成解碼結(jié)果,用于顯示以及供給上層協(xié)議作為分析的數(shù)據(jù)來源。解碼模塊的核心主要由以下部分組成:

  1. c底層包裝類Decoder
    在c代碼里,給python提供一個經(jīng)過包裝的基類,python可調(diào)用基類的一些方法,實現(xiàn)調(diào)用c代碼的目的。python端通過以下語句導(dǎo)出c代碼包裝的Decoder類:

import sigrokdecode as srd

python可訪問的Decoder基類的方法有:

  • register方法
    用于注冊python輸出到c底層的消息類型,有:
    (1) OUTPUT_ANN,數(shù)據(jù)輸出到屏幕
    (2) OUTPUT_PYTHON,數(shù)據(jù)輸出到上層協(xié)議
    (3) OUTPUT_BINARY
    (4) OUTPUT_META

python調(diào)用方式:

self.out_ann=self.register(srd.OUTPUT_ANN) self.out_py=self.register(srd.OUTPUT_PYTHON)

put方法
輸出數(shù)據(jù)到屏幕或上層協(xié)議,python調(diào)用方式:

self.put(a,b,self.out_ann,[0,['abc']])

其中,a、b為采樣點區(qū)間值,self.out_ann為注冊的消息類型,[0,[‘a(chǎn)bc’]], 0為消息類型序號,參考之前的內(nèi)容;[‘a(chǎn)bc’]為消息內(nèi)容了

wait方法
獲得上一次分析位置后的采樣數(shù)據(jù),可通過參數(shù)指定邊沿查找條件。
調(diào)用方式: self.wait()
可指定參數(shù),如:{0,’r’}表示第1個綁定的通道滿足向上邊沿的數(shù)據(jù);{1,’f’}表示第2個綁定通道足向下邊沿的數(shù)據(jù)。其它條件標(biāo)志還有:h、l、e、n。
可通過多個條件組成并和或的條件。并條件如:{0:’f’,1:’r’},或條件如:[{0:’f’},{1:’r’}]

  • has_channel方法
    用來叛斷某個通道是否綁定,python調(diào)用方式:

self.has_channel(0)

0是通道序號。

  • 屬性
    c底層類給python提供了兩個屬性:
    a. self.samplenum,wait()調(diào)用后的采樣數(shù)據(jù)位置;
    b. self.matched,wait()調(diào)用后道通匹配信息;
  1. python層包裝類Decoder
    繼承至c底層包裝的類,由c底層實例化并調(diào)用python類的方法,代碼如下:

import sigrokdecode as srd class Decoder(srd.Decoder):

子類Decoder的方法有:

  • reset方法
    這里做一些變量值的重置,以及類的私有變量的定義。變量的定義如:

self.name = 'abc'

  • start方法
    在解碼任務(wù)開始執(zhí)行前,c底層代碼會調(diào)用一次start函數(shù),這里主要是做一些初始化工作,比如注冊消息類型,如:

self.out_ann = self.register(srd.OUTPUT_ANN) self.out_py = self.register(srd.OUTPUT_PYTHON)

  • decode方法
    由c底層調(diào)用,在解碼任務(wù)開始時,c底層啟動一個線程,然后在線程里調(diào)用decode方法。
    在這個函數(shù)里,一直循環(huán)調(diào)用wait函數(shù),不斷從c底層讀取符合邊沿條件的數(shù)據(jù),如:

while True: (a,b) = self.wait()

(a,b)元組里的變量數(shù)跟聲明的chnnaels里聲明的通道數(shù)一致,包括可選的通道上。

解碼任務(wù)執(zhí)行流程:

  • (1) 解碼任務(wù)開始啟動;
  • (2) 上層將采樣數(shù)據(jù)分批推送到底層;
  • (3) 底層檢測并啟動一個線程,該線程調(diào)用python層的decode函數(shù),不斷處理上層推送的數(shù)據(jù);
  • (4) python層經(jīng)過一系列的計算處理,生成解碼結(jié)果,通過put函數(shù)輸出到c底層;
  • (5) 當(dāng)所有數(shù)據(jù)推送完成并經(jīng)過python層處理,解碼任務(wù)結(jié)束;

七、框架升級更新記錄

??在DSView版本1.2.0以上,更新以下功能:

  1. end方法
    python層的方法,當(dāng)所有數(shù)據(jù)處理完成后會被c底層觸發(fā)
  2. self.last_samplenum屬性
    c底層提供的屬性,其值為所有數(shù)據(jù)推送完成后最后的數(shù)據(jù)樣位置。當(dāng)存在end方法時,該屬性將被設(shè)置
  3. 數(shù)據(jù)多種顯示格式
    顯示的annotation數(shù)據(jù)部分,可以在2進制、16進制、8進制、10進制、ascii格式間轉(zhuǎn)換。

self.put(s, e, self.out_ann, [1,['%02X' % value])

put函數(shù)將數(shù)據(jù)輸出c底層,并在屏幕上顯示。其中,value為要顯示的數(shù)據(jù)。在輸出到時需要轉(zhuǎn)換為16進制的字符串。當(dāng)需要讓數(shù)據(jù)支持在多種格式間轉(zhuǎn)換時,代碼修改如下:

self.put(s, e, self.out_ann, [1,['@' + '%02X' % value])

它是通過在數(shù)據(jù)部分前加@符號,告訴c底層這一部分內(nèi)空是數(shù)據(jù)部分,如:
'@66FB'
如果存在前綴文字,需要將格式部分和數(shù)據(jù)部分開,如:
['Data:{$}','D:{$}', '@66FB']
{$}是占位符,系統(tǒng)將數(shù)據(jù)部分格式化后替換掉占位符,就會變成:Data:66FB

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

    關(guān)注

    6027

    文章

    44459

    瀏覽量

    631260
  • 邏輯分析儀
    +關(guān)注

    關(guān)注

    3

    文章

    213

    瀏覽量

    23109
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4760

    瀏覽量

    84310
收藏 人收藏

    評論

    相關(guān)推薦

    邏輯分析儀怎么編輯自己需要協(xié)議

      在DSView安裝目錄下,有一個decoders文件夾,里面有許多目錄是以各種協(xié)議名稱命名的。每個目錄下有至少2個擴展名為.py的文件,這些都是python代碼文件。在linux系統(tǒng)下,decoders目錄位于”/usr/local/share/libsigrokdecode4DSL”下。
    的頭像 發(fā)表于 09-04 16:40 ?1111次閱讀
    <b class='flag-5'>邏輯</b><b class='flag-5'>分析儀</b>怎么<b class='flag-5'>編輯</b><b class='flag-5'>自己</b><b class='flag-5'>需要</b>的<b class='flag-5'>協(xié)議</b>!

    如何選擇邏輯分析儀

    和下降沿觸發(fā)。邏輯分析儀一般還具有針對總線范圍、總線間關(guān)系、事件次數(shù)等觸發(fā)。LAB6052、LA2532等邏輯分析儀同時還擁有可視觸發(fā)、協(xié)議
    發(fā)表于 04-26 14:25

    邏輯分析儀在通訊協(xié)議分析上的應(yīng)用

      邏輯分析儀在通訊協(xié)議分析上的應(yīng)用  前言   在科技時代里越來越多的電子裝置出現(xiàn),也越來越多的裝置電子化,而在這些許許多多的裝置就會
    發(fā)表于 04-26 14:35

    邏輯分析儀是什么

    用的功能也是基本功能。當(dāng)然,邏輯分析儀除了分析信號時序外,更具有眾多高級功能,例如根據(jù)波形執(zhí)行反匯編、協(xié)議解碼和協(xié)議
    發(fā)表于 08-23 16:31

    USB邏輯分析儀

    需要帶有多輸入通道的邏輯分析儀。邏輯分析儀一般擁有32~136個通道,甚至最高能到幾千個通道,每通道可輸入一個數(shù)字信號。
    發(fā)表于 07-05 09:21

    為什么要使用邏輯分析儀

    一、簡介電子產(chǎn)品開發(fā)過程中我們最常用的是示波器,但隨著微處理器的出現(xiàn),電子工程師們越來越發(fā)現(xiàn)傳統(tǒng)的雙通道或四通道示波器不能滿足微處理器電路在設(shè)計開發(fā)工程中的需要。于是具有多通道輸入的邏輯分析儀就應(yīng)
    發(fā)表于 10-13 09:23

    什么情況需要使用邏輯分析儀

    做嵌入式驅(qū)動開發(fā),會使用邏輯分析儀是必不可少的技能。什么情況需要使用邏輯分析儀當(dāng)你編寫驅(qū)動與設(shè)備通信讀寫數(shù)據(jù)遇到問題時,可以用
    發(fā)表于 08-06 08:41

    邏輯分析儀的應(yīng)用分析

    邏輯分析儀原理及相關(guān)術(shù)語簡介。邏輯分析儀的工作原理簡介邏輯分析儀的組成結(jié)構(gòu)如圖1所示,它主要包括
    發(fā)表于 11-27 13:06 ?11次下載

    邏輯分析儀的使用

    邏輯分析儀的使用 本文主要介紹邏輯分析儀的使用步驟與方法,從探頭與被測系統(tǒng)連接、設(shè)置時鐘模式和觸發(fā)功能、捕獲、分析、顯示波
    發(fā)表于 11-27 08:50 ?2080次閱讀

    淺談邏輯分析儀

    本文介紹了邏輯分析儀的相關(guān)概念和參數(shù),并以實際工程應(yīng)用為例講解了協(xié)議分析儀協(xié)議觸發(fā)功能。
    發(fā)表于 08-09 17:21 ?3次下載

    邏輯分析儀選型參數(shù)有哪些_邏輯分析儀有哪些技術(shù)指標(biāo)_邏輯分析儀有什么推薦的?

    邏輯分析儀分析數(shù)字系統(tǒng)邏輯關(guān)系的儀器。邏輯分析儀是屬于數(shù)據(jù)域測試[2]儀器中的一種總線
    發(fā)表于 12-20 16:43 ?5426次閱讀

    邏輯分析儀的計量說明

    中國國內(nèi)每年銷售邏輯分析儀大概一千萬美元,但是能夠完整計量邏輯分析儀參數(shù)的單位卻不多。一般的計量單位只能做到門限精度的計量,而不能進行邏輯
    發(fā)表于 01-14 10:28 ?3次下載

    邏輯分析儀是干啥用的 邏輯分析儀的主要用途 邏輯分析儀的應(yīng)用場景

    邏輯分析儀是干啥用的 邏輯分析儀的主要用途 邏輯分析儀的應(yīng)用場景
    的頭像 發(fā)表于 09-19 16:03 ?2672次閱讀

    邏輯分析儀如何使用 邏輯分析儀使用教程

    數(shù)字信號分析。 第一步:準(zhǔn)備工作 在使用邏輯分析儀之前,需要做一些準(zhǔn)備工作。首先,您需要一個邏輯
    的頭像 發(fā)表于 09-19 16:03 ?2652次閱讀

    協(xié)議分析儀邏輯分析儀的區(qū)別

    協(xié)議分析儀邏輯分析儀的區(qū)別 協(xié)議分析儀邏輯
    的頭像 發(fā)表于 09-19 16:33 ?1958次閱讀