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. [转]内存分配malloc, new , heapalloc

    malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较 http://www.cppblog.com/woaidongmao/archive/2011/08/12/1531 ...

  2. [翻译]60,000毫秒内对Linux进行性能诊断

    原文链接:http://techblog.netflix.com/2015/11/linux-performance-analysis-in-60s.html 原文作者:Brendan Gregg,L ...

  3. 微信小程序--扫描二维码

    场景---在微信中扫描朋友发来的二维码后进入小程序,其实那个地址是带有参数的,那么如何接收那个参数呢,其实就是进入小程序页面的onLoad生命周期行数的options参数里面.

  4. YII2.0使用ActiveForm表单(转)

    Controller控制器层代码 <?php namespace frontend\controllers; use frontend\models\UserForm; class UserCo ...

  5. Java栈的简单实现

    * 数据结构与算法Java实现 栈 * * @author 小明 * */ public class MyStack { private Node top;// 头指针 int size;// 长度 ...

  6. 服务器上安装caffe的过程记录

    1. 前言 因为新的实验室东西都是新的,所以在服务器上要自己重新配置CAFFE 这里假设所有依赖包学长们都安装好了,我是没有sudo权限的 服务器的配置: CUDA 8.0 Ubuntu 16.04 ...

  7. Java IntelliJ IDEA 不能显示项目里的文件结构

    方法一: 关闭IDEA, 然后删除项目文件夹下的.idea文件夹 重新用IDEA工具打开项目 方法二: 菜单:File -> Invalidate Caches / Restart

  8. Unity导航系统Navigation使用教程

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

  9. (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)

    基于对象的跨表查询是子查询 基于双下划线的查询是连表查询 PS:基于双下划线的跨表查询 正向按字段,反向按表名小写 一对一 需求:查询lqz这个人的地址# 正向查询ret = models.Autho ...

  10. [动态差分+二维前缀和][小a的轰炸游戏]

    链接:https://ac.nowcoder.com/acm/contest/317/E来源:牛客网 题目描述 小a正在玩一款即时战略游戏,现在他要用航空母舰对敌方阵地进行轰炸 地方阵地可以看做是n× ...