OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7314|回复: 2

程序求解!!!

[复制链接]

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-8-7
在线时间
0 小时
发表于 2012-10-28 13:39:55 | 显示全部楼层 |阅读模式

#ifndef MAIN_H
#define MAIN_H


//任务结构
struct TaskComponents
{
    unsigned char Run;              // 任务运行标记:0-不运行,1运行
    unsigned long Timer;               // 计时器
    unsigned long ItvTime;              // 任务运行间隔时间
    void (*TaskHook)(void);       // 要运行的任务函数
} ;

#endif /* MAIN_H */

/***********************************任务函数列表

****************************************/
void UiTask(void);
void ModbusTask(void);
void TestTask(void);
void AutoModeTask(void);
void AlarmTask(void);
void CdtTask(void);
/************************任务清单****************/
typedef enum TasksList
{
  UI_TASK,      //人机界面
 MODBUS_TASK,               //MODUS通讯处理
 CDT_TASK,      //CDT通讯处理
 TEST_TASK,                //电压巡检、内阻测试
 ALARM_TASK,      //异常检测
 AUTO_MODE_TASK,     //工作模式自动切换
  TASKS_MAX                 //可供分配的定时任务数目
} TaskList;

     
/************************************装载任务

******************************************/
struct TaskComponents Task[TASKS_MAX] =
{
 //5ms*N
 {0, 2, 2, UiTask},         //人机界面
 {0, 5, 5, ModbusTask},    //MODUS通讯处理
 {0,1000,1000,CdtTask},     //CDT通讯处理
 {0, 200, 200, TestTask},       //电压巡检、内阻测试
 {0, 2000, 2000, AlarmTask},       //异常检测
 {0,0x0107AC00,0x0107AC00,AutoModeTask}, //工作模式自动切换  
};

/**********************************************************

***************************
*   Function name :main()
*   Description   :主函数
*   Call          :    
*   Call By       :
*   Input         :
*   Output        : 
*   Return        :
*   Others        :
***********************************************************

**************************/
int main( void )

 DisableInterrupts();   //禁止所有中断   
 Atmega128Init();
 UserInit();
 EnableInterrupts();    //允许所有中断 
 while(1)
 {
  TaskProcess();             // 任务处理 
 } 
}

/**********************************************************

*********************************
*   Function name :TaskRemarks()
*   Description   :任务标志处理,定时器调用
*   Call          :    
*   Call By       :
*   Input         :
*   Output        : 
*   Return        :
*   Others        :
***********************************************************

**********************************/
static void TaskRemarks(void)
{
    unsigned char i;

    for(i=0; i<TASKS_MAX; i++)             // 逐个任务时间处理
    {
         if (Task.Timer)              // 时间不为0
        {
            Task.Timer--;             // 减去一个节拍
            if (Task.Timer == 0)          // 时间到
            {
                 Task.Timer = Task.ItvTime;    // 恢复计时器值,从新下一次
                 Task.Run = 1;             // 任务可以运行
            }
        }
   }
}

/**********************************************************

************************************
*   Function name :TaskProcess()
*   Description   :任务处理
*   Call          :    
*   Call By       :
*   Input         :
*   Output        : 
*   Return        :
*   Others        :
***********************************************************

************************************/
static void TaskProcess(void)
{
    unsigned char i;

    for (i=0; i<TASKS_MAX; i++)          // 逐个任务处理
    {
         if (Task.Run)             // 时间不为0
        {
             Task.TaskHook();         // 运行任务
             Task.Run = 0;            // 标志清0
        }
    }  
}

/**********************************************************

***************************
*   Function name :
*   Description   :定时器0中断服务程序,用于产生1个5ms计时信号
*   Call          :    
*   Call By       :
*   Input         :
*   Output        : 
*   Return        :
*   Others        :程序内开启全局中断,以响应更高级中断
***********************************************************

***************************/
ISR(TIMER0_COMPA_vect)
{
 TaskRemarks();

 WwdRefresh() ;  //复位看门狗
}


/**********************************************************

****************************
*   Function name :
*   Description   :定时器0初始化,用于秒计时
*   Call          :    
*   Call By       :
*   Input         :
*   Output        : 
*   Return        :
*   Others        :
***********************************************************

****************************/
void T0Init(void)
{
    //定时器设置         
    TCCR0A |= (1<<WGM01);                   //CTC工作模式
    TCCR0B |= (1<<CS02);     //256分频
    TCNT0 = 0;                        //清除计数器0
   
    OCR0A = 155;                            //设置计数器TOP值
   
    TIMSK0 |=(1<<OCIE0A);     //启动定时器  
}


改程序的大致意思是:主函数一直在扫描任务处理,定时器不断的中断进行任务标志的处理。弄不清楚,这里面的任务结构怎么分配,怎么运行任务,Task.TaskHook();  指针指向该函数,不懂里面是怎么处理的?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-10-28 14:08:43 | 显示全部楼层
你这就是多个函数轮流执行,
要看函数如何处理的,你得找到这些函数实体,否则谁也不知道怎么处理的。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-8-7
在线时间
0 小时
 楼主| 发表于 2012-10-28 14:46:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,这个是在GCC里面开发的,只要定义以下结构体:
struct TaskComponents
{
    unsigned char Run;              // 任务运行标记:0-不运行,1运行
    unsigned long Timer;               // 计时器
    unsigned long ItvTime;              // 任务运行间隔时间
    void (*TaskHook)(void);       // 要运行的任务函数
} ; 
然后进行任务清单的分配,如下所示:
************************任务清单****************/
typedef enum TasksList
{
  UI_TASK,      //人机界面
 MODBUS_TASK,               //MODUS通讯处理
 CDT_TASK,      //CDT通讯处理
 TEST_TASK,                //电压巡检、内阻测试
 ALARM_TASK,      //异常检测
 AUTO_MODE_TASK,     //工作模式自动切换
  TASKS_MAX                 //可供分配的定时任务数目
} TaskList; 

最后进行任务时间上的分配,时间到就运行该任务,到点就运行另外一个任务。
/************************************装载任务

******************************************/
struct TaskComponents Task[TASKS_MAX] = 
{
 //5ms*N
 {0, 2, 2, UiTask},         //人机界面
 {0, 5, 5, ModbusTask},    //MODUS通讯处理
 {0,1000,1000,CdtTask},     //CDT通讯处理
 {0, 200, 200, TestTask},       //电压巡检、内阻测试
 {0, 2000, 2000, AlarmTask},       //异常检测
 {0,0x0107AC00,0x0107AC00,AutoModeTask}, //工作模式自动切换  
}; 

运行完后,从头开始运行。。。。。
就是搞不明白,这里面的结构体怎么处理的。。。。还在寻找中!!!!感谢提点!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表