由于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()函数也是可以的。
文章评论(0条评论)
登录后参与讨论