main

int main(void)
{ InitSys(); SoftwareInit(); while ()
{
if(P500usReq)
{
P500usReq = ;
P500us();
}
ModbusSlaveProcess(Mb3);
}
}

任务

#include "Global.h"

/** @brief 500us时间片 */
INT16U P500usReq = ; INT8U t500usFlg = ;
INT8U t1msFlg = ;
INT8U t4ms_1Flg = ;
INT8U t4ms_2Flg = ;
INT8U t8ms_1Flg = ;
INT8U t8ms_2Flg = ;
INT8U t20msFlg = ;
INT8U t100msFlg = ;
INT8U t1sFlg = ; /**
* @brief 500us任务
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 500us调用\n *
* @par 注意:
* ● \n
*/
static void Task500us(void)
{
t500usFlg ^= 0x01;
} /**
* @brief 1ms任务
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 1ms调用\n *
* @par 注意:
* ● \n
*/ static void Task1ms(void)
{
t1msFlg ^= 0x01; UpdInput(); // 更新数字量输入
UpdInSig(&IoStt, &Sys); // 更新输入信号 HoistCtrl(&Sys); // 电葫芦控制 UpdOutSig(&IoStt, &Sys); // 更新输出信号
UpdOutput(); // 更新数字量输出 ModbusInvCtrl(&InvModbus); MotorStt.ia = ((INT16S)AdcResult[] - ) << ;
MotorStt.ib = ((INT16S)AdcResult[] - ) << ;
MotorStt.ua = ((INT16S)AdcResult[] - ) << ;
MotorStt.ub = ((INT16S)AdcResult[] - ) << ;
MotorCal(&MotorStt);
} /**
* @brief 4ms任务1
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 4ms调用\n *
* @par 注意:
* ● \n
*/
static void Task4ms_sub1(void)
{
t4ms_1Flg ^= 0x01;
} /**
* @brief 4ms任务2
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 4ms调用\n *
* @par 注意:
* ● \n
*/
static void Task4ms_sub2(void)
{
t4ms_2Flg ^= 0x01; #ifdef RELEASE_MODE
IWDG_ReloadCounter(); // 喂狗
#endif
} /**
* @brief 8ms任务1
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 8ms调用\n *
* @par 注意:
* ● \n
*/
static void Task8ms_sub1(void)
{
t8ms_1Flg ^= 0x01;
} /**
* @brief 8ms任务2
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 8ms调用\n *
* @par 注意:
* ● \n
*/
static void Task8ms_sub2(void)
{
t8ms_2Flg ^= 0x01;
} void Uart2Test(STR_Uart *uart)
{
INT8U i = ;
uart->tPtr = uart->rPtr;
uart->txFlg = ;
for (i = ; i < uart->tPtr; i++)
{
uart->txBuf[i] = uart->rxBuf[i];
}
TxUart(RS2_KIND);
} void Uart3Test(STR_Uart *uart)
{
INT8U i = ;
uart->tPtr = uart->rPtr;
uart->txFlg = ;
for (i = ; i < uart->tPtr; i++)
{
uart->txBuf[i] = uart->rxBuf[i];
}
TxUart(RS3_KIND);
} void Uart4Test(STR_Uart *uart)
{
INT8U i = ;
uart->tPtr = uart->rPtr;
uart->txFlg = ;
for (i = ; i < uart->tPtr; i++)
{
uart->txBuf[i] = uart->rxBuf[i];
}
TxUart(RS4_KIND);
} /**
* @brief 20ms任务
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 20ms调用\n *
* @par 注意:
* ● \n
*/
static void Task20ms(void)
{
t20msFlg ^= 0x01; RxUart(RS1_KIND, MenuUartHandle); // 串口1数据接收及处理,与手操器通讯 ModbusDataUpdate();
RxUart(RS3_KIND, ModbusUartHandle); // 串口3数据接收及处理,Modbus通讯
RxUart(RS2_KIND, ModbusMasterHandler);
RxUart(RS4_KIND, Uart4Test);
UpdAdc();
} /**
* @brief 100ms任务
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 100ms调用\n *
* @par 注意:
* ● \n
*/
static void Task100ms(void)
{
t100msFlg ^= 0x01;
TerimalUpd();
TTDisplay();
SavePos(&Sys);
EncPulseCal(&Sys.lft.encPos);
EncPulseCal(&Sys.smallCar.encPos);
EncPulseCal(&Sys.bigCar.encPos);
UpdWeight(&Weigh);
} /**
* @brief 1s任务
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 调用周期: 1s调用\n *
* @par 注意:
* ● \n
*/
static void Task1s(void)
{
t1sFlg ^= 0x01;
GetCalendarTime(&NowTime); // 更新RTC时间 /* 更新时间参数 */
PaYear = NowTime.year + ;
PaMonth = NowTime.month;
PaDay = NowTime.date;
PaHour = NowTime.hour;
PaMinute = NowTime.minute; if (INVALID == Sys.run)
{
SaveFault(&FaultQ); // 非运行时记录故障进E2PROM
}
} /**
* @brief 500us时间片的任务分发器
* @param 参数名 参数说明
* @param 无
* @retval 无
* @note ● 分为1个500us、1个1ms、2个4ms任务、2个8ms任务、1个20ms、1个100ms、1个1s任务\n
*
* @par 注意:
* ● 本分发器对任务进行时间错位调度,避免任务调用重叠,可参见"任务调度周期.jpg","任务调度周期(细化).jpg"\n
*/
void P500us(void)
{
static INT8U s1msReq = ; //用于触发1ms任务标志,每500us累加
static INT8U s4msReq = ; //用于触发4ms任务标志,每1ms累加
static INT8U s8msReq = ; //用于触发8ms任务标志,每4ms累加
static INT8U s20msReq = ; //用于触发20ms任务标志,每4ms累加
static INT8U s100msReq = ; //用于触发100ms任务标志,每20ms累加
static INT8U s1sReq = ; //用于触发100ms任务标志,每100ms累加
Task500us(); if (s1msReq++ & 0x01)
{
Task1ms();
}
else
{
s4msReq++;
switch (s4msReq)
{
case : //触发4ms任务
{
Task4ms_sub1();
break;
}
case : //出发20ms\100ms\1s任务
{
s20msReq++;
if (0x03 == s20msReq) //两次20ms任务之间的中点时刻(5次时间片中间值为3次)
{
s100msReq++;
if(0x03 == s100msReq) //两次100ms任务之间的中点时刻(5次时间片中间值为3次)
{
s1sReq++;
if(s1sReq >= )
{
Task1s();
s1sReq = 0x00;
}
} if(s100msReq >= )
{
Task100ms();
s100msReq = 0x00;
}
}
if (s20msReq >= )
{
Task20ms();
s20msReq = 0x00;
}
break;
}
case : //触发4ms任务
{
Task4ms_sub2();
break;
}
default: //触发2个8ms任务
{
if (s8msReq++ & 0x01)
{
Task8ms_sub1();
}
else
{
Task8ms_sub2();
}
s4msReq = ;
break;
}
}
}
}

C 500uS状态机架构的更多相关文章

  1. Java生鲜电商平台-订单模块状态机架构设计

    Java生鲜电商平台-订单模块状态机架构设计 说明:在Java生鲜电商平台中订单的状态流转业务        我们知道 一个订单会有很多种状态:临时单.已下单.待支付.待收货.待评价.已完成,退货中等 ...

  2. 优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads

    译文在后面. State Threads for Internet Applications Introduction State Threads is an application library ...

  3. State Threads之网络架构库

    原文: State Threads for Internet Applications 介绍 State Threads is an application library which provide ...

  4. 转:一个C语言实现的类似协程库(StateThreads)

    http://blog.csdn.net/win_lin/article/details/8242653 译文在后面. State Threads for Internet Applications ...

  5. [GeekBand] 面向对象的设计模式(C++)(2)

    本篇笔记紧接上篇,继续学习设计模式. 4. 对象创建类设计模式 通过对象创建模式绕开new,来避免对象创建(new)过程中所导致的紧耦合,从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 4.1 ...

  6. raft共识算法

    raft共识算法 分布式一致性问题 如果说,服务器只有一个节点,那么,要保证一致性,没有任何问题,因为所有读写都在一个节点上发生.那如果server端有2个.3个甚至更多节点,要怎么达成一致性呢?下面 ...

  7. 游戏人工智能编程案例精粹(修订版) (Mat Buckland 著)

    https://www.jblearning.com/catalog/productdetails/9781556220784 第1章 数学和物理学初探 (已看) 第2章 状态驱动智能体设计 (已看) ...

  8. 高性能高并发网络库:StateThreads

    StateThreads是一个C的网络程序开发库,提供了编写高性能.高并发.高可读性的网络程序的开发库,轻量级网络应用框架 共也就3000行C代码 网络程序(Internet Application) ...

  9. state Threads 开源库介绍

    译文在后面. State Threads for Internet Applications Introduction State Threads is an application library ...

随机推荐

  1. ubuntu ssh 与 Samba安装

    ssh 安装:sudo apt-get install openssh-server 确认sshserver是否启动:ps -aux | grep ssh(/etc/init.d/ssh start, ...

  2. Quorum算法

    分布式系统中,一般保存多个数据副本,明显可以提高系统可靠性.并且存储这些数据副本的节点,不仅做容灾用,也可以提供服务,作负载均衡. 这里就涉及到一个数据一致性的问题,也就是各副本间要进行同步,来保持最 ...

  3. drop redo logfile current报错

    目的:在安装完毕11.2.0.4版本Oracle单实例数据库后,对日志进行格式化,删除原日志组current状态,删除报错 #对于理论学习,而带来的理解命令,因此作为记录 #查询日志状态SYS > ...

  4. thrift使用案例

    参考资料:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ 首先是定义thrift IDL接口,如下(SunTelTc.thri ...

  5. Unity射线检测的用法总结

    RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  6. day 016 面向对象---类与类的关系

    ---恢复内容开始--- 一  依赖关系(最轻的一种关系,在方法中引入另一个类的对象) class Elephant: def __init__(self,name): self.name=name ...

  7. set_uid set_gid stick_bit 软硬链接

    1.set_uid,里面的s权限   即运行一个命令时,普通用户临时拥有root权限 ( 增加和移除s权限 chmod u+s  file_name chmod u-s file_name 大S  和 ...

  8. c# 委托初用法

    public delegate void Print(string printStr); public static void DelegateMethod(string printStr) { Co ...

  9. json(传输格式)、异步加载、时间线

    xml:过去传输的数据格式 json:现在的传输数据格式,属性名加双引号来区别,其实也是对象,传输的是个字符串,其实就是json 前端JSON.stringfy(obj) 然后传给后台 后台传回来的j ...

  10. javascrpit的理解

    1.什么是Javascrpt? 轻量级 .编程语言 HTML+css -->设计 参数的默认值设置 函数的闭包: 浏览器加载整个页面的过程 浏览器:多线程 1.js引擎 2.UI渲染 3.事件线 ...