三十、freertos软件定时器-通过ID处理
/**
**************************************************************************************************/
#include <stdio.h>
#include "board.h"
#include "led.h"
#include "key.h"
#include "uart.h"
//#include "tim_mrt.h"
/*** System oscillator rate and clock rate on the CLKIN pin ****/
/**/const uint32_t OscRateIn = MAIN_OSC_XTAL_FREQ_HZ; /**/
/**/const uint32_t ExtRateIn = EXT_CLOCK_IN_FREQ_HZ; /**/
//系统复位
#define System_restart (LPC_SWM->PINENABLE0 = 0xffffffffUL) /**/
/***************************************************************/
#include "FreeRTOSConfig.h"
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"//事件头文件
#include "queue.h"//队列头文件
#include "semphr.h"//信号量头文件
#include "timers.h"//软件定时器头文件
#define TASK_STACK_SIZE 32//每个任务的栈大小
/**************************** 任务句柄 ********************************/
/*
* 任务句柄是一个指针,用于指向一个任务。
*/
static xTimerHandle Timer_Handle[2]={NULL};
static void vTimer_BackCall(void* parameter);
static u32 Tim1_count=0,Tim2_count=0;
/* Sets up system hardware
**********************************************************************
* @ 函数名 : BSP_Init
* @ 功能说明: 板级外设初始化,所有板子上的初始化均可放在这个函数里面
* @ 参数 :
* @ 返回值 : 无
*********************************************************************/
static void prvSetupHardware(void)
{
SystemCoreClockUpdate();
DEBUGINIT();
led_Init() ;
Key_INIT();
// MRT_Init();
Board_UARTPutSTR("build date: " __DATE__ " build time: " __TIME__ "\n");
}
/***********************************************************************
* @ 函数名 : AppTaskCreate
* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
* @ 参数 : 无
* @ 返回值 : 无
**********************************************************************/
static void AppTaskCreate(void)
{
taskENTER_CRITICAL();//进入临界区,禁止中断打断
u32 i;
/*
1. 创建定时器,如果在 RTOS 调度开始前初始化定时器,那么系统启动后才会执行。
2. 统一初始化两个定时器,他们使用共同的回调函数,在回调函数中通过定时器 ID 来区分
*/
const TickType_t xTimer[2]={1000,5000};
for(i=0;i<2;i++)
{
Timer_Handle[i] = xTimerCreate("Timer",/*定时器名字*/
xTimer[i],/*定时周期*/
pdTRUE, /*周期性*/
(void*)i,/*定时器ID*/
vTimer_BackCall);/*回调函数*/
if(Timer_Handle[i] != NULL)
{
/* 启动定时器,系统启动后才开始工作 */
if( pdPASS ==xTimerStart(Timer_Handle[i],100) )
{
/* 定时器还没有进入激活状态 */
}
}
}
taskEXIT_CRITICAL(); //退出临界区
}
/**
* @brief main routine for blinky example
* @return Function should not exit.
*/
int main(void)
{
prvSetupHardware();
Board_UARTPutSTR("LPC824 FreeRTOS 任务管理\n\r");
printf("软件定时器 \r\n");
AppTaskCreate();
vTaskStartScheduler();//任务调度
/* Loop forever */
while (1) {
printf("FreeRTOS 运行失败\n\r");
}
}
/***********************************************************************
* @ 函数名 : vTimer_BackCall
* @ 功能说明: 软件定时器 1 回调函数,打印回调函数信息&当前系统时间
* 软件定时器请不要调用阻塞函数,也不要进行死循环,应快进快出
* @ 参数 : 无
* @ 返回值 : 无
********************************************************/
static void vTimer_BackCall(xTimerHandle pxTimer)
{
u32 ulTimerID=0;
configASSERT(pxTimer);
/*获取时间到的定时器ID*/
ulTimerID = (u32)pvTimerGetTimerID(pxTimer);
/*处理定时器0任务*/
if(0 ==ulTimerID)
{
Board_LED_Toggle(0);
Tim1_count++;
printf("Tmr0 函数执行 %d 次\n", Tim1_count);
}
/*处理定时器1任务*/
if(1 ==ulTimerID)
{
Board_LED_Toggle(1);
Tim2_count++;
printf("Tmr1 函数执行 %d 次\n", Tim2_count);
}
}
试验现象:
通过定时器ID处理定时器任务。
定时器1的回调函数1s运行1次,第5s的时候定时器2运行1次。