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. 如何用DAX实现查看每个月中不同类别排名前一位,以及一个简单的svg案例

    现在给大家带来的是如何用DAX实现查看每个月中不同类别的排名前一位,最终完成效果如下!!! 首先我们需要两张简单的表 基数表 和类别表 当我们创建好表之后,我们再创建一个表格,然后我们将类别表里的列值 ...

  2. web(四)html表单类标签

    表单类标签 操作者用于输入信息,并将信息提交给服务器的标签集合. 表单标签介绍 form标签:表单元素(其余标签)标签的容器标签 input标签:用于用户信息输入的标签. button标签:按钮标签. ...

  3. Oracle账户管理

    登录:conn 用户名/口令创建用户create user 用户名 identified by 口令修改密码password 用户名删除用户drop user 用户名如果要删除的用户已经创建表,那么再 ...

  4. 第七十七课 最小生成树(Kruskal)

    添加kruskal算法: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" #include "SharedPoin ...

  5. mysql时间日期函数总结(转)

    DAYOFWEEK(date)  返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK('1998-02-03');  ...

  6. todolist待办事项

    使用html/css原生js实现待办事项列表: 支持添加待办事项,删除待办事项,切换待办事项的状态(正在进行,已经完成) 支持对正在进行以及已经完成事项编辑(单击内容即可编辑) 源代码:链接:http ...

  7. Python之路,第三篇:Python入门与基础3

    1,  布尔运算符 运算符;    not      and   or not 运算符: 作用:逻辑取反 语法: not  表达式 例: not  True     #  False not   Fa ...

  8. [LeetCode&Python] Problem 506. Relative Ranks

    Given scores of N athletes, find their relative ranks and the people with the top three highest scor ...

  9. unity 实现调用Windows窗口/对话框交互

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

  10. HihoCoder - 1801 :剪切字符串 (置换与逆序对)

    Sample Input 6 5 11 Sample Output 6 小Hi有一个长度为N的字符串,这个字符串每个位置上的字符两两不同.现在小Hi可以进行一种剪切操作: 选择任意一段连续的K个字符, ...