信号和连接
在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
MVirtualResourceGroup
cc4_slice // CC4 sliceof CCU4
MVirtualResourceGroup
interrupt_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(DaveEnv
daveEnv)
{
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(def
app
: 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自动设置的寄存器是红的。