voidx 发表于 2010-2-28 09:29:19

VoidSched

点击此处下载 ourdev_535653.rar(文件大小:827K) (原文件名:VoidSched.rar)

20090228:
由原来的VoidTask改名VoidSched。
AVRGCC部分暂停维护,编译器统一IAR。


#include "config.h"

TSK_Create(A,64,32);
TSK_Create(B,64,32);
TSK_Create(C,64,32);


#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口位域别名

TSK_Implement(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
   }
}

TSK_Implement(B)
{
    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
   }
}

TSK_Implement(C)
{
    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()
{
   __assert__(SIZEOF_STACK_TYPE_T==1);
   
   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(TSK(A),TSK_PROC(A),0,TSK_CSTACK_BOTTOM(A),TSK_RSTACK_BOTTOM(A)); //任务A初始化,优先级0
   TSK_Init(TSK(B),TSK_PROC(B),0,TSK_CSTACK_BOTTOM(B),TSK_RSTACK_BOTTOM(B)); //任务B初始化,优先级1
   TSK_Init(TSK(C),TSK_PROC(C),0,TSK_CSTACK_BOTTOM(C),TSK_RSTACK_BOTTOM(C)); //任务C初始化,优先级2
#else
   //AVR GCC使用单堆栈
#error"AVRGCC 暂停维护"
   
#endif
                  
    TSK_Start();         //任务开始调度(开始调度由空闲任务主函数切换到用户任务)
       
    sei();               //空闲任务主函数开中断,空闲任务主函数也有自己单独的总中断标志位
   
//volatile float f0=1.0;   //测试浮点运算
      
    while(1)            //任务空闲时,运行这里
    {   
            
   //   f0=f0+0.01;         //测试浮点运算
      
   SleepIdle();      //空闲休眠
      
    }
}

cyxavr 发表于 2010-2-28 11:56:57

下了,这个也是传说中的FREERTOS ??

==================================
我发现我错了.
页: [1]
查看完整版本: VoidSched