Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 微控制器上Modbus主机的正确非阻塞算法是什么_Algorithm_Modbus - Fatal编程技术网

Algorithm 微控制器上Modbus主机的正确非阻塞算法是什么

Algorithm 微控制器上Modbus主机的正确非阻塞算法是什么,algorithm,modbus,Algorithm,Modbus,Modbus是一种请求和响应型串行通信。基本上,主设备发出一个请求,从设备发出一个响应 我正在修改微控制器上的代码,微控制器是modbus网络上的主单元。该装置还具有一个小型点阵LCD和一些用于用户界面的按钮。微控制器以16MHz的频率运行 问题是在主机发出请求后,它不知道从机何时响应,因此可能需要等待较长时间。然而,由于该装置有按钮和LCD,它不能在某一点等待太久,因为用户按下按钮时会感到滞后。原始代码使用RTOS。它将用户界面任务和串行通信任务分离,因此没有问题。现在我需要将其更改为非RTO

Modbus是一种请求和响应型串行通信。基本上,主设备发出一个请求,从设备发出一个响应

我正在修改微控制器上的代码,微控制器是modbus网络上的主单元。该装置还具有一个小型点阵LCD和一些用于用户界面的按钮。微控制器以16MHz的频率运行


问题是在主机发出请求后,它不知道从机何时响应,因此可能需要等待较长时间。然而,由于该装置有按钮和LCD,它不能在某一点等待太久,因为用户按下按钮时会感到滞后。原始代码使用RTOS。它将用户界面任务和串行通信任务分离,因此没有问题。现在我需要将其更改为非RTOS代码。我已经实现了一个系统时钟,每1ms中断一次。正确的(或常用的)方法是什么

单凭一项任务就可以做很多事情,特别是在有中断的情况下。单个非常简单的任务和RTOS之间的中间位置是循环执行器。有关从循环执行到完全抢占式多任务操作系统的各种功能的简要概述,请参阅。如果你搜索这个短语和相关短语,你会发现更多,包括确保系统不会错过最后期限的非常复杂的方案。如果您是飞机飞行控制系统,忘记每X ms检查一次飞机俯仰角可能会在其他地方引起问题:-)

重写自然多线程代码的一种方法是维护系统状态的模型,例如一组对象,每个对象代表一个modbus连接,由连接id索引。然后为可能发生的每种事件编写一个例程,包括时钟中断的到达。当该事件发生时,这些例程通常会计算出所涉及的连接,从主集合中检索它(或者从头开始创建它,必要时在那里输入它),执行与该特定类型事件相关的工作,然后返回

保存一个按时间索引的未来事件队列,并创建一个例程,该例程创建一个表示将来某个时间要做的事情的对象(例如调用一个方法来检查超时是否过期),并将该对象放入队列中,这通常是很方便的

您需要担心在事件服务例程的中途调用中断处理。解决这一问题的一种方法是在可能导致问题时锁定中断。另一种方法是让中断例程只将一个对象放在一个队列上,其他对象稍后将检查该队列,或者只设置一个标志。然后,在检查队列中的项目并删除它们时,只需锁定中断


许多通信协议以这种方式实现。即使在一个真正的多任务操作系统中,您也不希望每次需要创建新连接时都必须创建一个新线程。这其中的两个主要问题是,代码不如每个对象都有一个线程的代码清晰,因为自然组合在一起的东西会被分解成事件服务事件的负载,如果任何事件服务方法都会消耗大量cpu,系统将暂停,因为在这种情况下不会发生其他任何事情。

您必须在操作系统上实现线程和小型先发制人调度程序(“非RTOS”和“微控制器”的信息并不多)。这不是一个小项目,但也不是那么难。