FreeRTOS教程——任务(一)
FreeRTOS教程——定时器(二)
FreeRTOS教程——队列(三)
FreeRTOS教程——二值信号量(四)
一、概念
一、概论
软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器 调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期, 简而言之,当定时器的定时周期到了以后就会执行回调函数。
2、编写回调函数的注意事项
软件定时器的回调函数是在定时器服务任务中执行的,所以一定不能在回调函数中调用任 何会阻塞任务的 API 函数!比如,定时器回调函数中千万不能调用 vTaskDelay()、 vTaskDelayUnti(),还有一些访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。
3、定时器服务任务与队列
定时器是一个可选的、不属于 FreeRTOS 内核的功能,它是由定时器服务(或 Daemon)任务 来提供的。FreeRTOS 提供了很多定时器有关的 API 函数,这些 API 函数大多都使用 FreeRTOS 的队列发送命令给定时器服务任务。这个队列叫做定时器命令队列。定时器命令队列是提供给 FreeRTOS 的软件定时器使用的,用户不能直接访问!
二、最小工程
TimerHandle_t Timer_Handle1 ; // 定时器句柄1
void TimerCallback1(TimerHandle_t callback); // 周期定时器回调函数
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
KEY_Init();
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}
//开始任务任务函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
// 创建定时器1
Timer_Handle1 = xTimerCreate((const char *)"AutoReloadTimer1",
(TickType_t) 1000,
(UBaseType_t) pdTRUE,
(void *) 1,
(TimerCallbackFunction_t)TimerCallback1 );
if(Timer_Handle1 == NULL)
{
printf("AutoReloadTimer1 Created Failed \r\n");
}else{
printf("AutoReloadTimer2 Created Success \r\n");
}
xTimerStart(Timer_Handle1, 0);
...
}
void TimerCallback1(TimerHandle_t callback){
printf("LED0\r\n");
LED0=!LED0;
}
三、常用函数和API
1、 xTimerReset()
复位一个软件定时器,此函数只能用在任务中,不能用于中断服务函数!此函数是一个宏, 真正执行的是函数 xTimerGenericCommand(),函数原型如下:
BaseType_t xTimerReset( TimerHandle_t xTimer,
TickType_t xTicksToWait )
参数:
- xTimer: 要复位的软件定时器的句柄。
- xTicksToWait: 设置阻塞时间,调用函数 xTimerReset ()开启软件定时器其实就是向定时器命 令队列发送一条 tmrCOMMAND_RESET 命令,既然是向队列发送消息,那 肯定会涉及到入队阻塞时间的设置。
返回值:
- pdPASS: 软件定时器复位成功,其实就是命令发送成功。
- pdFAIL: 软件定时器复位失败,命令发送失败。
2、xTimerResetFromISR()
此函数是 xTimerReset()的中断版本,此函数用于中断服务函数中!此函数是一个宏,真正 执行的是函数 xTimerGenericCommand(),函数原型如下:
BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,
BaseType_t * pxHigherPriorityTaskWoken );
参数
-
xTimer: 要复位的软件定时器的句柄。
-
pxHigherPriorityTaskWoken:
返回值:pdPASS,