原创 ucos的时间管理

2010-10-7 21:18 2431 5 5 分类: FPGA/CPLD

由于ucos系统的每个任务都是一个无限循环,任务与任务之间是并行的关系,而且ucos还是一个抢占性内核,为了使高优先级的任务不至于一直独占CPU,让低优先级的任务也有机会获得CPU的使用权,则每个任务都要在合适的时候调用某个延时函数,包括:


OSTimeDly(INT16U n);   //延时n个系统时钟节拍


OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);   //延时h小时m分s秒milli毫秒


调用了这些函数后系统会进行一次任务调度,使当前正在执行的任务让出CPU使用权。


源码如下:



#define TASK1_PRIORITY      14
#define TASK2_PRIORITY      12
#define TASK3_PRIORITY      10


/* 任务一,让1602循环显示字符 */
void task1(void* pdata)
{
    FILE *lcd;  //定义lcd文件指针
    INT16U i = 0;
   
    lcd = fopen("/dev/lcd_1602", "w");  //以只写方式打开设备lcd
    if(lcd){
        while(1){
          
            fprintf(lcd, "%d", i);  //往文件写数据,即在lcd上显示
            i ++;
            if(i == 10) i = 0;
          
            OSTimeDlyHMSM(0, 0, 0, 500);
        }
    }
    fclose(lcd);    //关闭文件
}


/* 任务二,让8位流水灯循环点亮 */
void task2(void* pdata)
{
    INT16U i;  
    while (1)
    {


        for(i=0; i<8; i++){
            IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 1<<i);    //HAL库宏调用
//            usleep(500000); //微秒级等待函数
            OSTimeDly(100);
        }
    }
}


void task3(void* pdata){
    FILE *uart;
    INT8U *temp = "hello ucos ii";
   
    uart = fopen("/dev/rs232", "w");
    if(uart){
        while(1){
//            fgets(temp, 50, uart);
            fprintf(uart, temp); 
            OSTimeDlyHMSM(0, 0, 0, 100);        
        }  
    }  
    fclose(uart);   
}


试过用usleep()函数也是可以的。


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条