对总线通信中优先级问题的讨论
一、主要实验目标
- 搭建一个多节点通信的网络,至少包含两个发送节点、一个接收节点
- 为不同的任务引入不同的优先级,以验证当消息发送存在冲突时,总线该如何仲裁
- 讨论不同的任务调度策略总线通信的影响
完成度:60%
二、系统网络结构
1. 系统网络结构及工作原理
构建一个总线通信网络,其中包含:两个信号发送节点,一个信号接收节点,一条CAN总线。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iIjZGvSN-1574492443059)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/1573377798270.png)]
其工作原理如下:
发送节点1、2周期性的定时向总线中发送消息,且遵循CAN总线协议的报文传送规则。
CAN总线协议的报文传送规则:当总线空闲时,连结到总线的所有节点都可以发送消息(多主控制),且先占有总线获得发送消息的资格(CSMA/CR:Carrier Sense Multiple Access / Collosion Avoidance;如果多个节点同时开始发送消息,那么具有最高优先级(最低ID值)的节点获得发送消息的资格,其余消息则进入到消息缓存区依次等待发送。
2. Simulink模型
在Matlab中利用TrueTime工具箱搭建的网络通信模型如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2l73Otmo-1574492443061)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/1573376814384.png)]
3. 仿真结果及分析
发送节点1与发送节点2以0.5s为周期定时向总线中发送一个消息,且在下一个周期来临后取相反值。为了方便观察,取节点1消息的幅值为$1$,节点2消息的幅值为$2$。如下图所示,其中,前两排分别为两个发送节点的时序图,后两排分别为两个节点向总线中发送的消息的波形。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zonQEui-1574492443062)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/1573389815400.png)]
调整发送节点1、2的开始时间、执行时间,使两个节点的消息发送周期存在整数倍关系(此处$T_1=0.5s$,$T_2=1s$),以保证在仿真的过程中能够出现消息发送冲突。接收节点采用事件触发的机制,及当检测到总线中有消息在发送的时候才被触发。通过观察总线的调度计划时序图及接收节点的输出结果,可以对CAN总线的报文传送规则进行验证。
设置发送节点1、2中消息的优先级分别为$2、1$。运行仿真,得到仿真结果如下:
1)总线的调度计划时序图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-shAqVmin-1574492443064)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/1573392189337.png)]
2)接收节点的输出结果:(第三排为节点3的输出结果)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RY11OgtG-1574492443065)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/1573394345266.png)]
**结果分析:**
从总线的调度计划时序图中可以看出:发送节点2中消息的优先级的确高于节点1。
为方便观察,设置接收节点中$D/A$转换的执行时间为$0.1s$。对从$t=1s$到$t=3s$时间段内的情况进行分析:
- t=1s时,节点1、2同时向总线中发送数值-1、0.5,总线按照优先级顺序将0.5、-1先后发送给接收节点。
- 节点3在接收到1、2的消息后,经过0.1s的延迟(D/A转换器的执行时间为0.1s)后,输出的数值0.5(来自节点2),此时t=0.1s;再经过0.1s的延迟后输出的数值为-1(来自节点1),此时t=0.2s。
- t=1.5时,节点1向总线中发送数值1,节点3在收到消息后,经过0.1s的延迟输出数值1,此时t=1.6s。
- 如果没有新的数值需要显示,节点3会一直保持输出当前的数值不变,直到接收到新的消息为止。
- t=2s到t=3s时间段的情况类似,只是输出的数值不同而已。
可见,仿真结果满足CAN总线的报文传送规则。
值得注意的是:实际情况中,节点发送和接收的消息可能不仅仅是简单的数值,而是一帧一帧的数据。此处为了讨论方便,暂时未涉及到对数据的编码及长度计算。作者在后续的学习过程中将继续深入探讨其详细的工作模式。
---
## 三、关键问题及策略总结
### “优先级”的含义:
1. 若节点中同时存在两个以上的任务需要发送时,则需要给不同的任务设定不同的优先级
2. 若网络中同时存在两个以上的节点需要往总线中发送消息,则需要给给个消息都设置一个特定的优先级
### 任务调度策略:
RMS:单调速率策略,任务的周期越短,优先级越高。
DMS:截止期单调策略,任务的截止时间越短,优先级越高。当任务的截止时间等于其周期时:RMS=DMS
---
## 参考资料
RMS: https://baike.baidu.com/item/RMS/7521847
DMS: *N.C.Audeley, etc. HARD REAL-TIME SCHEDULING:THE DEADLINE_MONOTONIC APPROACH*
---
## 附录
### 关键代码:
发送节点1(初始化程序):
```matlab
function sender1_init(Amp)
ttInitKernel('prioFP')
data.u=Amp;
data.exectime=0;
starttime=0;
period=0.5;
ttCreatePeriodicTask('sender1_task',starttime,period,'sender1_code',data)
```
发送节点1(控制代码):
```matlab
function [exectime,data] = sender1_code(segment, data)
switch segment
case 1
data.u=-data.u;
exectime = data.exectime;
ttSendMsg([1 3],data.u,10,2);
case 2
ttAnalogOut(1, data.u);
exectime = -1;
end
```
发送节点2(初始化):
```matlab
function sender2_init(Amp)
ttInitKernel('prioFP')
data.u=Amp;
data.exectime=0;
starttime=0;
period=0.5;
ttCreatePeriodicTask('sender2_task',starttime,period,'sender2_code',data)
```
发送节点2(控制代码):
```matlab
function [exectime,data] = sender2_code(segment, data)
switch segment
case 1
data.u=-data.u;
exectime = data.exectime;
ttSendMsg([1 3],data.u,10,1);
case 2
ttAnalogOut(1, data.u);
exectime = -1;
end
```
接收节点(初始化):
```matlab
function receiver_init
ttInitKernel('prioFP')
data.exectime=0.1;
starttime=0;
ttCreateTask('receiver_task',starttime,'receiver_code',data)
ttAttachNetworkHandler(1,'receiver_task')
```
接收节点(控制代码):
```matlab
function [exectime,data] = receiver_code(segment, data)
persistent u
switch segment
case 1
u=ttGetMsg;
exectime = data.exectime;
case 2
if ~isempty(u)
ttAnalogOut(1, u)
else
disp('Error: actuator received empty message!')
end
exectime = -1;
end
```
case 2
if ~isempty(u)
ttAnalogOut(1, u)
else
disp('Error: actuator received empty message!')
end
exectime = -1;
end
```