qiuri2008

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

main

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

任务

#include "Global.h"

/** @brief 500us时间片 */
INT16U P500usReq = 0;


INT8U t500usFlg = 0;
INT8U t1msFlg = 0;
INT8U t4ms_1Flg = 0;
INT8U t4ms_2Flg = 0;
INT8U t8ms_1Flg = 0;
INT8U t8ms_2Flg = 0;
INT8U t20msFlg = 0;
INT8U t100msFlg = 0;
INT8U t1sFlg = 0;


 /**
 * @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[0] - 2048) << 13;
    MotorStt.ib = ((INT16S)AdcResult[1] - 2048) << 13;
    MotorStt.ua = ((INT16S)AdcResult[2] - 2048) << 13;
    MotorStt.ub = ((INT16S)AdcResult[3] - 2048) << 13;
    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 = 0;
    uart->tPtr = uart->rPtr;
    uart->txFlg = 1;
    for (i = 0; i < uart->tPtr; i++)
    {
        uart->txBuf[i] = uart->rxBuf[i];
    }
    TxUart(RS2_KIND);
}

void Uart3Test(STR_Uart *uart)
{
    INT8U i = 0;
    uart->tPtr = uart->rPtr;
    uart->txFlg = 1;
    for (i = 0; i < uart->tPtr; i++)
    {
        uart->txBuf[i] = uart->rxBuf[i];
    }
    TxUart(RS3_KIND);
}

void Uart4Test(STR_Uart *uart)
{
    INT8U i = 0;
    uart->tPtr = uart->rPtr;
    uart->txFlg = 1;
    for (i = 0; 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 + 2000;
    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 = 0;   //用于触发1ms任务标志,每500us累加
    static INT8U s4msReq = 0;   //用于触发4ms任务标志,每1ms累加
    static INT8U s8msReq = 0;   //用于触发8ms任务标志,每4ms累加
    static INT8U s20msReq = 0;  //用于触发20ms任务标志,每4ms累加
    static INT8U s100msReq = 0; //用于触发100ms任务标志,每20ms累加
    static INT8U s1sReq = 0;    //用于触发100ms任务标志,每100ms累加
    Task500us();
        
    if (s1msReq++ & 0x01)
    {
        Task1ms();
    }
    else
    {
        s4msReq++;
        switch (s4msReq)
        {
            case 1:     //触发4ms任务
            {
                Task4ms_sub1();
                break;
            }
            case 2:     //出发20ms\100ms\1s任务
            {
                s20msReq++;
                if (0x03 == s20msReq)    //两次20ms任务之间的中点时刻(5次时间片中间值为3次)
                {
                    s100msReq++;
                    if(0x03 == s100msReq)   //两次100ms任务之间的中点时刻(5次时间片中间值为3次)
                    {
                        s1sReq++;
                        if(s1sReq >= 10)
                        {
                            Task1s();
                            s1sReq = 0x00;
                        }
                    }
                    
                    if(s100msReq >= 5)
                    {
                        Task100ms();
                        s100msReq = 0x00;
                    }
                }
                if (s20msReq >= 5)
                {
                    Task20ms();
                    s20msReq = 0x00;
                }
                break;
            }
            case 3:     //触发4ms任务
            {
                Task4ms_sub2();
                break;
            }
            default:    //触发2个8ms任务
            {
                if (s8msReq++ & 0x01)
                {
                    Task8ms_sub1();
                }
                else
                {
                    Task8ms_sub2();
                }
                s4msReq = 0;
                break;
            }
        }
    }
}

 

posted on 2018-10-17 17:45  江召伟  阅读(277)  评论(0编辑  收藏  举报