时间问题

对总线通信中优先级问题的讨论


一、主要实验目标

  • 搭建一个多节点通信的网络,至少包含两个发送节点、一个接收节点
  • 为不同的任务引入不同的优先级,以验证当消息发送存在冲突时,总线该如何仲裁
  • 讨论不同的任务调度策略总线通信的影响

完成度: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
```
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值