火资源软件6月30日消息,硬件定时器mcu的作用和优势。
软件定时器
MCU通常有自己的定时器,属于硬件定时器,但不同的MCU有不同数量的硬件定时器,有时需要考虑成本。当硬件计时器不够时,FreeRTOS也提供计时器功能,但它属于软件计时器。其计时精度不如硬件计时器高,但对于精度要求较低的周期性任务就足够了。

1. 介绍软件定时器
软件定时器允许设置一段时间,当设置时间到达时,将执行回调函数。软件定时器的回调函数是在定时器服务任务中执行的,因此不能在回调函数中调用会阻塞任务的API函数
由定时器服务任务提供的定时器是一种不属于FreeRTOS内核的可选功能。定时器相关的API函数大多使用定时器命令队列向定时器服务任务发送命令,用户不能直接访问命令队列
如上图所示,定时器命令队列连接用户应用程序任务和定时器服务任务。用户应用程序调用函数xtimerReset(),因此复位命令将发送到定时器命令队列,然后由定时器服务任务处理
有两种类型的软件定时器:单定时器和周期定时器。当时间到来时,单个定时器执行回调函数将停止运行;一旦周期性定时器启动,回调函数将定期执行
configUSE_TIMERS 宏置1:自动创建定时器服务任务
configTIMER_TASK_PRIORITY:任务优先级软件定时器服务任务
configTIMER_QUEUE_LENGTH:设置定时器命令队列的队列长度
configTIMER_TASK_STACK_DEPTH:设置定时器服务任务的任务堆栈大小
启动调度器时,FreeRTOS会自动创建定时器服务任务,其源代码如下:
BaseType_t xTimerCreateTimerTask( void ){
BaseType_t xReturn = pdFAIL;
/* 检查软件定时器列表和队列,如果没有创建内存空间,则新建内存空间 */
prvCheckForValidListAndQueue();
if( xTimerQueue != NULL ){
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
{
******这里省略静态创建代码***
}
#else
{
/* 为满足软件定时器的实时性,软件定时器任务的优先级设置为最大值 */
xReturn = xTaskCreate(prvTimerTask,
"Tmr Svc",
configTIMER_TASK_STACK_DEPTH,
NULL,
((UBaseType_t)configTIMER_TASK_PRIORITY)|portPRIVILEGE_BIT,
&xTimerTaskHandle);
}
#endif /* configSUPPORT_STATIC_ALLOCATION */
}
else{
mtCOVERAGE_TEST_MARKER();
}
configASSERT( xReturn );
return xReturn;
}
/* 检查软件定时器列表和队列 */
static void prvCheckForValidListAndQueue( void ){
taskENTER_CRITICAL();
{
/* 若队列为空,然后是列表的初始化和队列的创建。 */
if( xTimerQueue == NULL ){
vListInitialise( &xactivetimerlisttt1 );
vListInitialise( &xactivetimerlistt2 );
pxCurrentTimerList = &xactivetimerlisttt1;
pxOverflowTimerList = &xactivetimerlistt2;
/* 开始创建消息队列 */
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
{
************************************
******这里省略静态创建代码***
************************************
}
#else
{
xTimerQueue = xQueueCreate((UBaseType_t)configTIMER_QUEUE_LENGTH, sizeof(DaemonTaskMessage_t));
}
#endif
*****************
******这里省略了一些其他代码****/****
*****************
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
taskEXIT_CRITICAL();
}
2. API函数软件定时器
2.1 复位软件定时器
复位软件定时器,如果软件定时器已经启动,则重新计算超时间;如果软件定时器未启动,则启动软件定时器
**********************复位软件定时器,***********************************
BaseType_t xTimerReset(TimerHandle_t xTimer, ///需要复位的软件定时器句柄
TickType_t xTicksToWait) ///阻塞时间
***************复位软件定时器,**********************************
BaseType_t xTimerResetFromISR(TimerHandle_t xTimer, ///需要复位的软件定时器句柄
BaseType_t * pxHigherPriorityTaskWoken) ///退出后是否切换任务?
****************************************************************************
返回值:定时器复位成功返回PDPASS;失败返回pdFAIL
复位定时器函数是一个宏,最终调用XTimerGenericCommand()函数
#define xTimerReset(xTimer, xTicksToWait) \
xTimerGenericCommand((xTimer), \
tmrCOMMAND_RESET, \
(xTaskGetTickCount()), \
NULL, \
(xTicksToWait)) \
//参数:1、软件定时器句柄;2.、定义Reset号;3、当前系统的Tick值;4、null;5、阻塞时间
2.2 创建软件定时器
创建软件定时器,并返回软件定时器句柄。软件定时器创建后,软件定时器没有启动
***********************************************************************
TimerHandle_t xTimerCreate(char * const pcTimerName,//软件定时器名称
TickType_t xTimerPeriodInTicks,///定时器周期(单位是时钟节拍数)
UBaseType_t uxAutoReload,///定时器模式(单次或周期)
void * const pvTimerID,///定时器ID号
TimerCallbackFunction_t pxCallbackFunction)///定时器回调函数
**************************************************************
TimerHandle_t xTimerCreateStatic(char * const pcTimerName,//软件定时器名称
TickType_t xTimerPeriodInTicks,///定时器周期(单位是时钟节拍数)
UBaseType_t uxAutoReload,//定时器模式(单次或周期)
void * const pvTimerID,///定时器ID号
TimerCallbackFunction_t pxCallbackFunction,///定时器回调函数
StaticTimer_t * pxTimerBuffer)////保存定时器结构
****************************************************************************
返回值:创建成功返回软件定时器句柄;失败返回NULLL
创建软件定时器函数xTimerCreate()的源代码分析如下:
TimerHandle_t xTimerCreate( const char * const pcTimerName,
const TickType_t xTimerPeriodInTicks,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction){
Timer_t *pxNewTimer;
///动态分配 软件定时器控制块内存空间
pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) );
if( pxNewTimer != NULL ){
//进入控制初始化
prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );
}
ret

总结
以上就是今天所分享的内容了,更多关于软件知识请关注火资源软件,每天都会更新一些优质内容,其中包括美宜购,微客优品,聊讯,千喜惠,逗鱼时刻,优乐购,淘卷淘,花惜,微信,惊喜淘,有趣超市,淘金甄选,韵鹿严选,海豚甄选,泡泡易选,微信红包辅助,达信酷,会友,易凡,悦信,坤米,思语,百盛,钉钉,陌陌,创南北,加圈,支付宝,多多联盟,QQ,苹果微信多开,新密购,微信分身,安卓微信多开等热门社交平台,软件功能有秒,单透,秒抢,埋雷挂,扫尾,避雷软件等一些红包强项外挂功能软件免费分享。喜欢的请关注收藏吧!