打印
[AVR单片机]

voidtask

[复制链接]
1845|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
voidx|  楼主 | 2009-10-31 06:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 voidx 于 2009-11-6 05:54 编辑

cpu:atmega32
compiler:IAR EWAVR 5.30   AVR_Studio+WinAVR 20090313

#include "config.h"
TTask TaskA;   //任务A控制块
TTask TaskB;   //任务B控制块
TTask TaskC;   //任务C控制块
#define TaskAStackSize 100   //任务A堆栈大小
#define TaskBStackSize 100   //任务B堆栈大小
#define TaskCStackSize 100   //任务C堆栈大小
uint8 TaskAStack[TaskAStackSize];  //任务A堆栈空间
uint8 TaskBStack[TaskBStackSize];  //任务B堆栈空间
uint8 TaskCStack[TaskCStackSize];  //任务C堆栈空间
#define LED_A   IO_BIT_ALIAS(&PORTB,0)   //LED_A,IO口位域别名
#define LED_B   IO_BIT_ALIAS(&PORTB,1)   //LED_B,IO口位域别名
#define LED_C   IO_BIT_ALIAS(&PORTB,2)   //LED_C,IO口位域别名
ATTR_CTASK void TaskAProc(void)   //任务A处理
{
    volatile float f1=1.0;        //测试浮点运算
  
    sei();                        //任务开始开中断,每个任务都有自己单独的总中断标志位,任务开始执行时,总中断标志位是关闭的
    while(1)
   {
       f1+=0.1;                        //测试浮点运算
     
       LED_A=1;                        //LED_A写1  
       TSK_Delay(VT_TICKS_PER_SEC/2);  //延时1/2S
      
       LED_A=0;                        //LED_A写0
       TSK_Delay(VT_TICKS_PER_SEC-VT_TICKS_PER_SEC/2);  //延时1/2S
   }
}
ATTR_CTASK void TaskBProc(void)  
{
    volatile float f2=1.0;     //测试浮点运算
  
    sei();                     //任务开始开中断
    while(1)
   {  
       f2+=0.1;                        //测试浮点运算
           
       LED_B=1;                        //LED_B写1  
       TSK_Delay(VT_TICKS_PER_SEC/3);  //延时1/3S
      
       LED_B=0;                        //LED_B写0
       TSK_Delay(VT_TICKS_PER_SEC-VT_TICKS_PER_SEC/3);  //延时2/3S
   }
}
ATTR_CTASK void TaskCProc(void)  
{
    volatile float f3=1.0;     //测试浮点运算
  
    sei();                             //任务开始开中断,每个任务都有自己单独的总中断标志位
    while(1)
    {
       f3+=0.1;                        //测试浮点运算
     
       LED_C=1;                        //LED_C写1  
       TSK_Delay(VT_TICKS_PER_SEC/4);  //延时1/4S
      
       LED_C=0;                        //LED_C写0
       TSK_Delay(VT_TICKS_PER_SEC-VT_TICKS_PER_SEC/4);  //延时3/4S
    }
}
int main()
{
     cli();                   //任务开始调度前,要关中断,每个任务都有自己单独的总中断标志位
     
     DDRB  |=_BV(0)|_BV(1)|_BV(2);    //LED_A,LED_B,LED_C输出
     PORTB |=_BV(0)|_BV(1)|_BV(2);    //LED_A,LED_B,LED_C写1
     _delay_ms(1000);
     PORTB &=~(_BV(0)|_BV(1)|_BV(2)); //LED_A,LED_B,LED_C写0
         
     VT_TicksInit();                   //系统节拍初始化
#ifdef __AVR_IAR__  
     //AVR IAR使用双堆栈
     TSK_Init(&TaskA,(void (*)(void))TaskAProc,0,&TaskAStack[TaskAStackSize-33],&TaskAStack[TaskAStackSize-1]); //任务A初始化,优先级0
     TSK_Init(&TaskB,(void (*)(void))TaskBProc,1,&TaskBStack[TaskBStackSize-33],&TaskBStack[TaskBStackSize-1]); //任务B初始化,优先级1
     TSK_Init(&TaskC,(void (*)(void))TaskCProc,2,&TaskCStack[TaskCStackSize-33],&TaskCStack[TaskCStackSize-1]); //任务C初始化,优先级2
#else
     //AVR GCC使用单堆栈
     TSK_Init(&TaskA,(void (*)(void))TaskAProc,0,&TaskAStack[TaskAStackSize-1]); //任务A初始化,优先级0
     TSK_Init(&TaskB,(void (*)(void))TaskBProc,1,&TaskBStack[TaskBStackSize-1]); //任务B初始化,优先级1
     TSK_Init(&TaskC,(void (*)(void))TaskCProc,2,&TaskCStack[TaskCStackSize-1]); //任务C初始化,优先级2
#endif
                    
    TSK_Start();           //任务开始调度(开始调度由空闲任务主函数切换到用户任务)
   
    sei();                 //空闲任务主函数开中断,空闲任务主函数也有自己单独的总中断标志位
   
    volatile float f0=1.0;     //测试浮点运算
      
    while(1)              //任务空闲时,运行这里
    {   
              
      f0=f0+0.01;         //测试浮点运算
      
     SleepIdle();        //空闲休眠
        
    }
}
ISR_ATTR_NAKED(TIMER2_COMP_vect)    //系统节拍中断,裸中断
{      
      VT_IntEnter();                //VoidTask入中断   
      VT_TicksHandler();            //节拍处理
      VT_IntExit();                 //VoidTask出中断  
}

voidtask.rar

1.06 MB

相关帖子

沙发
Karlshen| | 2009-10-31 22:24 | 只看该作者
好复杂,学习一下!^_^

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

118

帖子

2

粉丝