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

* 16256: 硬件:问一下关于ucos的问题!

   ruanhan 
ruanhan发表的帖子 

 硬件:问一下关于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这时应该继续进行??
我是初学者,望各位高手帮助,不胜感激!


发表时间:2002年12月23日11:14:00

  
回复该帖

本主题共有 3 帖,分页:>>>>>该主题的所有内容[3]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  16265.[详细]说来话长
摘要:UCOS内核里有一个定时中断,它将调度所有跟OSTimeDly( )有关的TASK。......(42字)
- [zhang8546][1115次] 2002年12月23日

  20636.[详细]我也不明白,请高手指点指点
摘要:......(无内容)
- [wcj_dl][1764次] 2003年3月8日

[上一篇帖子]:lee2002上电复位 10UF电容,2K电阻
[下一篇帖子]:硬件:如何用单片机做250k左右的方波如何用单片机做250k左右的方波,选择那种单片机,要比较精确,