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. java连接操作数据库

    Connection 类prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库. PreparedState ...

  2. JAVA (StringBuffer/StringBuilder)常用API

    public class Copy3 { public static void main(String[] args) { //构造实例化 StringBuffer strbu = new Strin ...

  3. Subsequence Count 2017ccpc网络赛 1006 dp+线段树维护矩阵

    Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0's and 1's), and Q queries ...

  4. 数据结构与算法Java描述 队列

    package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...

  5. pandas Dataframe 构造

  6. 区块链与Git版本工具的比较

    区块链与Git版本工具的比较 来源:http://www.jianshu.com/p/b96b98983df6 作者: 梁波林  相同点: 1. 分布式存储方案 2. 链式数据 3. 去中心化 4. ...

  7. 第六课cnn和迁移学习-七月在线-cv

    ppt 参数共享终于把拿一点想清楚啦,一定要知道w是矩阵! 在传统BP中,w前后连接时是all的,辣么多w使得你给我多少图片我就能记住多少信息-->导致过拟合-->cnn当中权值共享 激励 ...

  8. Light OJ 1199:Partitioning Game(SG函数模板)

    Alice and Bob are playing a strange game. The rules of the game are: 1.      Initially there are n p ...

  9. linux cron计划任务、chkconfig 命令、systemd命令、unit 相关、target 相关

    1.设置说明位置 : cat /etc/crontab # Example of job definition:# .---------------- minute (0 - 59)# | .---- ...

  10. Docker第一个应用:Hello World

    Docker应用:Hello World 前言: 最近学习了Docker相关技术点,国内关于Docker的资料大多是基于Linux系统的,但是我对Linux又不熟(实际上没用过,掩面哭笑.Jpg). ...