信號和連接
在DAVE™的代碼引擎和DAVE™ SDK環境中,信號連接有着和電子上的意義不同的意義。對於“信號”這個概念,我們認爲它是邏輯上的連接而不是像電平觸發,邊沿觸發中斷這樣的物理信號。它們不是電氣上的連接而是邏輯鏈接。
設想有三個信號{S1,S2,S3},S1,S2連在S3上,S1,S2可以影響到S3,但不可逆向。我們可以在幫助手冊裏發現這種信號之間的連接。例如下面的與門,或門。
你也可以發現被字段位影響的信號連接,如下圖。
微處理器的不同構成要素用信號連接多路器和寄存器。
爲了減少系統複雜度,使開發者高效工作。通過manifest來實現虛擬的信號連接時必要的。
這些信號稱之爲“虛擬信號”因爲我們不可能知道它們準確的通道直到solver給它們分配特定的硬件單元和資源組。
下圖可以讓你觀察到CCU4和NVIC的硬件抽象原理圖。在CCU4中有兩個工作組(CC4 Slices)。每一個工作組包含三個信號(A,B,C),它們通過一個多路器和多路輸出選擇器和中斷節點連接。爲了選擇多路器和多路輸出選擇器的信號,有專門的寄存器。
設想我們想要連接CCU4上的信號A(其實我們不必關心哪一個)到中斷節點D。
以前的做法是我們必須要在相應的寄存器上寫入合適的數值去控制多路器。當只有一個硬件單元的年代幾乎這不是什麼問題,但如今的微處理器有着大量的外設和控制寄存器,因此對於一個開發者來說很難去關心所有的關於硬件模塊,信號,寄存器等等的複雜連接可能性和同時考慮系統相容性。
因爲上面的理由,我們開發了solver。與直接設定對應的資源組(eg.CCU4 slice0)不同,我們只需要選擇聲明“信號A”連接“信號D”就可以了,solver可以自動選擇可被佔用的資源。然後我們可以獲取solver分配到的選擇器的特定寄存器(SRS),把它用在template文件裏用於生成代碼來合理配置微處理器。
在這個例子中solver選擇了CCU slice0,但在另一種配置中它可能選擇slice1,誰知道呢!
我們限制硬件因爲我們用了虛擬信號的概念。
爲了向solver傳遞我們的需求,我們必須在manifest對資源,信號以及限制條件進行聲明。
在例子中我們需要兩個資源CC4和聲明,申明兩個虛擬信號A,D。我們可以給它們加連接的約束,亦可以讓它們聲明但不連接。因此用戶可以在它們之間建立另一種連接(另選一個目標硬件,例如VADC)
爲了申請資源你可以建立一個MVirtualResourceGroup
對象,一個MVirtualSignal來建立虛擬信號連接(‘M’來自於manifest類)。我們可以用方法
addConnectionConstraint()
控制連接約束。
// Manifest code
// Begin : User APP property section
MVirtualResourceGroupcc4_slice // CC4 sliceof CCU4
MVirtualResourceGroupinterrupt_node// Interrupt node of NVIC
MVirtualSignal A // Example of source signal (e.g. pmus_omds)
MVirtualSignal D // Example of destination signal (e.g. signal_in)
// End : User APP property section
// APP Constructor
public TEST(DaveEnvdaveEnv){
cc4_slice = MVirtualResourceGroup("CC4 Slice",["peripheral","ccu4","*","cc4","*"])
interrupt_node=MVirtualResourceGroup("INTERRUPTNode",["peripheral","cpu","*","nvic","interrupt","*"])
A=MVirtualSignal(cc4_slice,"PMUS ServiceRequest","pmus_omds")
D=MVirtualSignal(interrupt_node,"ServiceRequest Input","signal_in")
addConnectionConstraint(A,D)
}
在這個簡單的聲明後,你可以在template文件裏獲取solver分配的值,再下面的例子中你能看到訪問分配值得一種方法,生成的程序是不能編譯的。
// Template code
for(defapp : appInstancesList)
{
out.print("""
CCU4 hardwaremodule == ${app.cc4_slice.getSolverUri()[-3]} //In Groovy you can index with a negative number in order to access from the end
CC4 slice ==${app.cc4_slice.getSolverUri()[-1]}
Register bitfieldSRS.POSR == 0x${app.cc4_slice.getRegValue("srs","srs_posr")}
SRS.POSR bitfieldmask ==0x${Integer.toHexString(((Integer)app.cc4_slice.getRegOwnershipMask("srs_posr")))}
NVIC interruptnode == ${app.interrupt_node.getSolverUri()[-1]}
""")
}
在DAVE™ 4中加載運行這個APP,可以生成
CCU4 hardware module == 0
CC4slice == 0
Registerbitfield SRS.POSR == 0x2
SRS.POSRbitfield mask == 0x3
NVICinterrupt node == 46
你可以在
DAVE™
SDK Device Explorer發現這些硬件,資源組,寄存器,字段位。你也可以發現solver自動設置的寄存器是紅的。