• 【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("33[1;32;40m");                          //设置字体终端为绿色
        usart6.printf("
    Hello, I am iCore4!
    
    ");
    
        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
    ",f);     //串口输出
            OSTimeDlyHMSM(0,0,0,500);                //延时500ms
        }
    }

    iCore4链接:

  • 相关阅读:
    可能是把 ZooKeeper 概念讲的最清楚的一篇文章
    Tomcat基本知识(一)
    PowerDesigner显示mysql数据表注释
    java中wait和notify的虚假唤醒问题
    为什么wait和notify只能在synchronized中?
    一篇blog带你了解java中的锁
    jvm类加载机制总结
    Java的浅拷贝与深拷贝总结
    政府网站公祭日,如何使网站整体变灰
    java 为什么重写equals一定要重写hashcode?
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8403425.html
Copyright © 2020-2023  润新知