FREERTOS笔记(四) 软件定时器

FREERTOS笔记(四) 软件定时器

1.freertos时间管理带的,可以设置一段时间后执行某函数
2.类似stm32 TIM中断,只是软件相较于硬件准确性可能差点
3. 定时器函数中不能写会阻塞的api函数比如vTaskDelay(ms);或者vTaskDelayUntil();等
4.主体依赖于prvTimerTask时间调度任务,这个任务在vTaskStartScheduler();内的xTimerCreateTimerTask();进行创建
5.记得包含头文件#include “timers.h”

API函数

xTimerHandle 创建句柄
xTimerCreate 创建任务 注意第二个参数如果时pdTRUE则时周期,pdFALSE则为单词
xTimerStart / xTimerStartFromISR 开始任务 / 从中断中 //第二个参数时阻塞时间
xTimerStop / xTimerStopFromISR 结束任务 / 从中断中 //第二个参数时阻塞时间

示例

main.c

xTimerHandle AutoReloadTimer_handle;//周期定时器句柄
xTimerHandle OneLoadTimer_handle;//单次定时器句柄
void AutoReloadCallBack(TimerHandle_t timerhandle);//创建周期回调函数
void OneLoadCallBack(TimerHandle_t timerhandle);//创建单次回调函数

void start_task(void *pvParameters)//创建任务
{
	taskENTER_CRITICAL();//进入临界区
	AutoReloadTimer_handle=xTimerCreate((const char *)"AutoReloadTimer",
										(TickType_t)500,//0.5s调用一次
										(UBaseType_t)pdTRUE,//周期
										(void *)1,//ID
										(TimerCallbackFunction_t)AutoReloadCallBack);
	OneLoadTimer_handle=xTimerCreate((const char *)"OneLoadTimer",
									(TickType_t)2000,//2s调用一次
									(UBaseType_t)pdFALSE,//单次
									(void *)1,//ID
									(TimerCallbackFunction_t)OneLoadCallBack);
	taskEXIT_CRITICAL();//退出临界区
	vTaskDelete(NULL);
}


void AutoReloadCallBack(TimerHandle_t timerhandle)//周期定时器回调函数
{
	static int auto_t;
	auto_t++;
	printf("\nAutoReloadCallBack---%d\n",auto_t);
}
void OneLoadCallBack(TimerHandle_t timerhandle)//周期定时器回调函数
{
	static int auto_t;
	auto_t++;
	printf("\nOneLoadCallBack---%d\n",auto_t);
}

串口中断函数

extern xTimerHandle AutoReloadTimer_handle;//周期定时器句柄
extern xTimerHandle OneLoadTimer_handle;//单次定时器句柄
void u1_handler(uint8_t ch) //串口接收中断中的函数
{
	if(ch=='1')
	{
		xTimerStartFromISR(AutoReloadTimer_handle,0);
	}
	else if (ch=='2')
	{
		xTimerStopFromISR(AutoReloadTimer_handle,0);
	}
	else if (ch=='3')
	{
		xTimerStartFromISR(OneLoadTimer_handle,0);
	}
	else if (ch=='4')
	{
		xTimerStopFromISR(OneLoadTimer_handle,0);
	}
}

实验现象

发送1开启周期定时器,一秒打印两次数据,发送2关闭,不再打印
发送3开启单次定时器,就只打印一次,数据加1,再次发送3才再次打印
如果发送3,在两秒内发送4,就不会触发单次定时器

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS是一个开源的实时操作系统(RTOS),专门用于嵌入式系统。它提供了一套可移植的API,使开发者能够轻松地编写多任务应用程序。 以下是一些关于FreeRTOS笔记: 1. 任务(Tasks):FreeRTOS使用任务实现并行执行。每个任务都有自己的独立堆栈空间和优先级。任务可以创建、删除和挂起。 2. 调度器(Scheduler):FreeRTOS的调度器负责决定哪个任务应该在给定时间运行。它使用优先级调度算法,并且可以配置为使用抢占式或协作式调度。 3. 信号量(Semaphores):信号量是一种用于同步和通信的对象。它可以用于任务之间的互斥访问共享资源或任务之间的通信。 4. 队列(Queues):队列提供了一种任务之间传递数据的方式。任务可以将数据发送到队列,另一个任务可以从队列中接收数据。 5. 事件标志组(Event Flags):事件标志组用于任务之间的同步和通信。一个任务可以等待一组特定的事件标志发生,另一个任务可以设置或清除这些事件标志。 6. 定时器(Timers):FreeRTOS提供了软件定时器,可以在指定时间间隔内运行回调函数。 7. 内存管理(Memory Management):FreeRTOS提供了内存管理功能,可以动态分配和释放内存。 8. 中断(Interrupts):FreeRTOS可以与硬件中断一起使用,以实现任务的抢占式调度。 这些只是FreeRTOS的一些基本概念和功能,它还有很多其他特性和组件。如果你对某个特定方面有更多的兴趣,请告诉我,我会提供更详细的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值