【iCore4 双核心板_uC/OS-II】例程四:软件定时器

一、实验说明:

  一些应用程序执行它们的任务时需要延迟一段特定的时间,因此uC/OS-II为我们提供了一些相应的

延时函数,本例程我们使用软件定时器定时500ms点亮相应的LED实现三色LED循环闪烁。

二、实验截图:

三、源代码下载链接:

链接:https://pan.baidu.com/s/1kWFhoXp 密码:xuc7

四、核心代码:

/*
 * Name                : main
 * Description         : ---
 * Author              : zh.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
/*实验现象:
  红绿蓝三色灯循环定时点亮。
  */
int main(void)
{
    system_clock.initialize();                               //系统时钟初始化
    led.initialize();                                        //LED初始化
    usart6.initialize(115200);                               //串口初始化
    usart6.printf("\x0c");                                   //清屏    
    usart6.printf("\033[1;32;40m");                          //设置字体终端为绿色
    usart6.printf("\r\nHello, I am iCore4!\r\n\r\n");

    OSInit();                                                          //UCOS初始化
    OSTaskCreate(start_task,                                 //创建开始任务
            (void*)0,                                   //任务参数
            (OS_STK*)&START_TASK_STK[START_STK_SIZE-1], //任务堆栈
            START_TASK_PRIO);                           //任务优先级
    OSStart();                                               //开启UCOS    
}
/*
 * Name                : start_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr;

    OSStatInit();//初始化统计任务

    OS_ENTER_CRITICAL();//关中断

    OSTaskCreate(timer_task,(void*)0,(OS_STK*)&TIMER_TASK_STK[TIMER_STK_SIZE-1],TIMER_TASK_PRIO);//创建LED0任务
    OSTaskCreate(usart_task,(void*)0,(OS_STK*)&USART_TASK_STK[USART_STK_SIZE-1],USART_TASK_PRIO);//创建usart任务
    OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务

    OS_EXIT_CRITICAL();//开中断
}
/*
 * Name                : led0_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void TmrCallback(OS_TMR *ptmr,void *p_arg)
{
    static int counter = 0;

    /*
       LED_XX_ON        点亮相应LED
       LED_XX_OFF    熄灭相应LED

       三色LED交替闪烁*/
    if(counter % 3 == 0){
        LED_RED_ON;
        LED_GREEN_OFF;
        LED_BLUE_OFF;
    }else if(counter % 3 == 1){
        LED_RED_OFF;
        LED_GREEN_ON;
        LED_BLUE_OFF;
    }else if(counter % 3 == 2){
        LED_RED_OFF;
        LED_GREEN_OFF;
        LED_BLUE_ON;
    }
    counter ++;
}
/*
 * Name                : led0_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void timer_task(void *pdata)
{
    INT8U    err;
    OS_TMR   * soft_timer;//软件定时器

    soft_timer = OSTmrCreate(10,10,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)TmrCallback,0,(INT8U *)"soft_timer",&err);//100ms执行一次
    OSTmrStart(soft_timer,&err);//启动软件定时器         

    while(1){
        OSTimeDlyHMSM(0,0,0,500);//延时500ms
    }
}

/*
 * Name                : usart_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void usart_task(void *pdata)
{    
    double f=0.1;

    while(1){
        f+=0.1f;                                 //浮点型运算
        usart6.printf("float f=%.4f\r\n",f);     //串口输出
        OSTimeDlyHMSM(0,0,0,500);                //延时500ms
    }
}

iCore4链接:

posted @ 2018-02-02 08:59  XiaomaGee  阅读(588)  评论(0编辑  收藏  举报