\chapter{通讯网络} \section{通讯拓扑} \begin{figure}[h!] \centering \includegraphics[width=0.8\textwidth]{figure/f3.png} \caption{通讯网络} \label{fig-f3} \end{figure} \section{通讯协议} \begin{table} \centering \caption{通讯帧} \begin{tabular}{|l|l|l|l|l|l|l|l|} \hline \multicolumn{4}{|c|}{prefix} & \multicolumn{4}{c|}{count} \\ \hline typ & \multicolumn{3}{c|}{tag} & \multicolumn{4}{c|}{source} \\ \hline \multicolumn{4}{|c|}{target} & \multicolumn{4}{c|}{data} \\ \hline \multicolumn{8}{|c|}{data} \\ \multicolumn{8}{|c|}{....} \\ \multicolumn{8}{|c|}{data} \\ \hline \end{tabular} \label{tab-col} \end{table} \begin{itemize} \item prefix(8bit) \item count(8bit) \item typ(4bit) \item tag(4bit) \item source(8bit) \item target(8bit) \item data \end{itemize} \section{路由算法} rie树又被称为前缀树、字典树是一种用于快速检索的多叉树结构。字典树把字符串看成字符序列,根据字符串中字符序列的先后顺序构造从上到下的树结构,树结构中的每一条边都对应着一个字符。字典树上存储的字符串被视为从根节点到某个节点之间的一条路径,并在终点节点上做个标记"该节点对应词语的结尾",正因为有终点节点的存在,字典树不仅可以实现简单的存储字符串,还可以实现字符串的映射,只需要将相对应的值悬挂在终点节点上即可。 Trie的核心思想是空间换时间,有如下基本性质: \begin{itemize} \item - 根节点不包含字符,除根节点外每一个节点都只包含一个字符 \item - 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 \item - 每个节点的所有子节点包含的字符都不相同 \end{itemize} 字典树能够利用字符串中的公共前缀,这样可能会节省内存,利用字符串的公共前缀可以减少查询字符串的时间,能够最大限度的减少无谓的字符串比较,同时在查询的过程中不需要预知待查询字符串的长度,沿着字典树的边进行匹配,查询效率比较高。 \section{分布式选举协议} \begin{figure}[h!] \centering \includegraphics[width=0.8\textwidth]{figure/f2.png} \caption{选举协议} \label{fig-f2} \end{figure} 分布式协议中,一个节点任一时刻处于以下三个状态之一: \begin{itemize} \item 从动 \item 候选者 \item 主控 \end{itemize} 如上图所示,可以看出所有节点启动时都是从动状态;在一段时间内如果没有收到来自主控的心跳,从从动切换到候选者,发起选举;如果收到大多数的同意票(含自己的一票)则切换到主控状态;如果发现其他节点比自己更新,则主动切换到从动。 总之,系统中最多只有一个主控节点,如果在一段时间里发现没有主控,则大家通过选举-投票选出主控。主控会不停的给从动发心跳消息,表明自己的存活状态。如果主控节点故障,那么从动节点会转换成候选状态,重新选出主控。 \section{硬实时通信} 在工业控制领域实时(Real Time)是一个核心要求。实时系统是指计算的正确性不仅依赖于逻辑的正确性而且依赖于产生结果的时间,如果系统的时间限制不能得到满足,系统将会产生故障。在工业领域这种故障可能造成灾难性的结果。 在CPU资源调度方面,OS主要提供一个多任务(multitasking)的运行环境,以方便应用的开发。在开发某个应用时首先把工作拆解成多个任务(Task/Thread),每个任务都可以简化成一个简单的无限循环: \begin{lstlisting}[ language={C}, caption={基本调度过程}, label={code-c-sample}, ] void MyTask (void) { while (1) { Wait for an event to occur; Perform task operation; } } \end{lstlisting} 如上面代码所示,任务(Task)都是等待event,然后处理事务。任何一个任务得以运行,都是因为它收到了一个Event,这个Event可能是一个中断、也可能是超时到期、还有可能是其他任务发出的IPC信号,继续追查发出IPC信号的任务最后的源头Event肯定是一个外部设备硬件中断或者是内部的Timer中断。中断引起了Event传递,形成了逐个运行多个任务的链条(Chain)。一个系统内部会存在很多条这种链条。 对实时(Real Time)系统来说,不仅仅要求OS能提供多任务环境,更要求任务能在极短的时间之内响应外部的中断事件。 对于终端节点来说硬实时通讯较好实现,利用时钟定时中断即可强制切换到高级别消息发送,但是终端节点一般作为信息发送和执行节点,不具备逻辑处理功能,在整体通讯延迟受最慢一级也就是逻辑处理层一般也是主机节点影响最大,为处理此问题,对消息进行分级,高优先级消息会先触发中断响应,并切换到执行状态,且不可被抢占。 \section{终端通信} \section{性能分析}