您的位置:首页 > 其它

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

2018-02-02 08:59 399 查看
一、实验说明:

  一些应用程序执行它们的任务时需要延迟一段特定的时间,因此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链接:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: