导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→硬件:问一下关于ucos的问题![ruanhan]

 *第7166篇: 硬件:问一下关于ucos的问题!

  
楼 主:ruanhan 2002年12月23日11:14
 硬件:问一下关于ucos的问题!
#include <includes.h>

#define MAX_STK_SIZE 64

void TaskStartyya(void *yydata) reentrant;
void TaskStartyyb(void *yydata) reentrant;
void TaskStartyyc(void *yydata) reentrant;

OS_STK TaskStartStkyya[MAX_STK_SIZE+1];//注意:我在ASM文件中设置?STACK空间为40H
即64,不要超出范围。
OS_STK TaskStartStkyyb[MAX_STK_SIZE+1];//用户栈多一个字节存长度
OS_STK TaskStartStkyyc[MAX_STK_SIZE+1];

void main(void)
{
    OSInit();
    
    InitTimer0();
    InitSerial();
    InitSerialBuffer();
    
    OSTaskCreate(TaskStartyya, (void *)0, &TaskStartStkyya[0],2);
    OSTaskCreate(TaskStartyyb, (void *)0, &TaskStartStkyyb[0],3);
    OSTaskCreate(TaskStartyyc, (void *)0, &TaskStartStkyyc[0],4);
    
    OSStart();
}


void TaskStartyya(void *yydata) reentrant
{
    yydata=yydata;
    clrscr();
    PrintStr("\n\t\t*******************************\n");
    PrintStr("\t\t*     Hello! The world.       *\n");
    PrintStr("\t\t*******************************\n\n\n");
    
    for(;;){
        PrintStr("\tAAAAAA111111 is active.\n");
        OSTimeDly(OS_TICKS_PER_SEC);    
    }    
}

void TaskStartyyb(void *yydata) reentrant
{
    yydata=yydata;
    
    for(;;){
        PrintStr("\tBBBBBB333333 is active.\n");
        OSTimeDly(3*OS_TICKS_PER_SEC);    
    }    
}

void TaskStartyyc(void *yydata) reentrant
{
    yydata=yydata;
    
    for(;;){
        PrintStr("\tCCCCCC666666 is active.\n");
        OSTimeDly(6*OS_TICKS_PER_SEC);    
    }    

这是那篇心得的程序,其结果是:
Demo程序创建了3个任务A、B、C优先级分别为2、3、4,A每秒显示一次,B每3秒显示一次,
C每6秒显示一次。从显示结果看,显示3个A后显示1个B,显示6个A和2个B后显示1个C,结果
显然正确。
       显示结果如下:
       AAAAAA111111 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       BBBBBB333333 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       BBBBBB333333 is active
       CCCCCC666666 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       BBBBBB333333 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       BBBBBB333333 is active
       CCCCCC666666 is active
      
现在我不明白的地方是:每个任务是如何控制
每n秒就运行一次得,好像在任务中有一个OSTimeDly( )函数,
而这个函数只是将该任务挂起一段时间,然后进行任务调度,
这个函数怎能控制每个任务隔n秒运行一次??
比如:刚开始A的优先级最高,于是输出A的字符串,
一秒之后,应该进行任务调度,这是还是进行A任务,
等第三秒过之后,又进行任务调度,这是为什么就进行B呢??
因为A这时应该继续进行??
我是初学者,望各位高手帮助,不胜感激!

  
2楼:zhang8546 2002年12月23日12:15
 说来话长
UCOS内核里有一个定时中断,它将调度所有跟OSTimeDly( )有关的TASK。
  
3楼:wcj_dl 2003年3月8日21:00
 我也不明白,请高手指点指点

>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:  xilinx xcr3128 求助!!!!急急急!!&n

[下一篇主题]:硬件:如何用单片机做250k左右的方波