当前位置: 首页 > news >正文

天津建设网官方网站销售的三个核心点

天津建设网官方网站,销售的三个核心点,上海网站建设与设计公司,做做网站2023下载目录 软件定时器介绍 FreeRTOS软件定时器特点 软件定时器的命令队列 软件定时器的相关配置 单次定时器和周期定时器 软件定时器结构体成员 FreeRTOS软件定时器相关API函数 实验源码 软件定时器介绍 定时器描述:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件…

目录

软件定时器介绍

FreeRTOS软件定时器特点

软件定时器的命令队列

软件定时器的相关配置

单次定时器和周期定时器

软件定时器结构体成员

FreeRTOS软件定时器相关API函数

实验源码


软件定时器介绍

定时器描述:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可自定义定时器的周期

硬件定时器描述:芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息。

软件定时器:是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息。

软件定时器优点:

1.硬件定时器数量有限,而软件定时器理论上只需有足够内存,就可以创建多个

2.使用简单、成本低

软件定时器缺点:

1.软件定时器相对硬件定时器来说,精度没有那么高(因为它以系统时钟为基准,系统时钟中断优先级又是最低,容易被打断)。对于需要高精度要求的场合,不建议使用软件定时器。

FreeRTOS软件定时器特点

可裁剪:软件定时器是可裁剪可配置的功能,如果要使能软件定时器,需将configUSE_TIMERS配置项配置成 1

单次和周期:软件定时器支持设置成:单次定时器或周期定时器

注意:软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定时器的超时回调函数本身不是任务,因此不能在该回调函数中使用可能会导致任务阻塞的API函数。

软件定时器服务任务作用:

1.负责软件定时器超时的逻辑判断

2.调用超时软件定时器的超时回调函数

3.处理软件定时器命令队列

软件定时器的命令队列

FreeRTOS提供了许多软件定时器相关的API函数,这些API函数大多都是往定时器的队列中写入消息(发送命令) ,这个队列叫做软件定时器命令队列,是提供给FreeRTOS中的软件定时器使用的,用户是不能直接访问的。

软件定时器的相关配置

当FreeRTOS的配置项configUSE_TIMERS设置为1,在启动任务调度器时,会自动创建软件定时器的服务/守护任务prvTimerTask();

软件定时器服务任务的优先级为configTIMER_TASK_PRIORITY =31;

定时器的命令队列长度为 configTIMER_QUEUE_LENGTH =5 ;

注意:软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器。所以,定时器的回调函数不要影响其他定时器。

1.回调函数要尽快实行,不能进入阻塞状态,即不能调用那些会阻塞任务的API 函数,如:vTaskDelay();

2.访问队列或者信号量的非零阻塞时间的API函数也不能调用。

软件定时器的状态

软件定时器共有两种状态

休眠态:软件定时器可以通过其句柄被引用,但因为没有运行,所以其定时超时回调函数不会被执行

运行态:运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用

注意:新创建的软件定时器处于休眠状态,也就是未运行的!发送命令队列软件定时器从休眠态转变为运行态

单次定时器和周期定时器

单次定时器:单次定时器的一旦定时超时,只会执行一次其软件定时器超时回调函数,不会自动重新开启定时,不过可以被手动重新开启。

周期定时器:周期定时器的一旦启动以后就会在执行完回调函数以后自动的重新启动,从而周期地执行其软件定时器回调函数。

Timer1:周期定时器,定时超时时间为2个单位时间,开启后,一直以2个时间单位间隔重复执行;

Timer2:单次定时器,定时超时时间为1个单位时间,开启后,则在第一个超时后就不在执行了。

单次定时器状态转换图

 周期定时器状态转换图

软件定时器结构体成员

typedef struc
{
tconst char*   pcTimerName	/* 软件定时器名字*/
Listltem_t     xTimerListltem	/* 软件定时器列表项*/
TickType_t    xTimerPeriodInTicks;/*软件定时器的周期*/
void *        pvTimerID			/*软件定时器的ID*/
TimerCallbackFunction_t  pxCallbackFunction;/*软件定时器的回调函数*/
#if (configUSE_TRACE_FACILITY ==1)
UBaseType_t  uxTimerNumber		/*软件定时器的编号,调试用*/
#endif
uint8_t	ucStatus;					/*软件定时器的状态*/
}xTIMER;

FreeRTOS软件定时器相关API函数

 创建软件定时器API函数

TimerHandle_t xTimerCreate( const char* constpcTimerName,
const TickType_t xTimerPeriodInTicks,
const UBaseType_t  constuxAutoReload,
void* pvTimerlD,
TimerCallbackFunction_t  pxCallbackFunction );

开启软件定时器API函数

BaseType_t xTimerStart(TimerHandle_txTimer,const TickType_t xTicksToWait);

停止软件定时器API函数 

BaseType_t xTimerStop( TimerHandle_txTimer,const TickType_txTicksToWait);

复位软件定时器API函数

该功能将使软件定时器的重新开启定时,复位后的软件定时器以复位时的时刻作为开启时刻重新定时

BaseType_t xTimerReset( TimerHandle_txTimer,const TickType_txTicksToWait);

更改软件定时器超时时间API函数

BaseType_t xTimerChangePeriod(TimerHandle_txTimer,
const TickType_txNewPeriod,
const TickType_txTicksToWait);

实验源码

设计两个任务:start_task、task1

start_task:用来创建task1任务,并创建两个定时器(单次和周期)

task1:用于按键扫描,并对软件定时器进行开启、停止操作

/********************************************************************************* @file           : user_mian.h* @brief          : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "user_key.h"
#include "queue.h"
#include "event_groups.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/ 
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/
void Timer1_Callback(TimerHandle_t pxTimer);
void Timer2_Callback(TimerHandle_t pxTimer);TimerHandle_t Timer1 = 0;/*单次定时器*/
TimerHandle_t Timer2 = 0;/*周期定时器*/uint32_t Timer1_;
uint32_t Timer2_;//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_PRIO			4
//任务堆栈大小	
#define TASK1_STK_SIZE 		100  
//任务句柄
TaskHandle_t TASK1_Handler;
//任务函数
void task1(void *pvParameters);int main(void){	/*配置系统中断分组为4位抢占*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);/*延时函数初始化*/delay_init();/*RCC配置*/Rcc_config();/*GPIO初始化*/ Gpio_Init();/*USART1初始化*/Uart1_Init(9600);/*创建开始任务*/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();          //开启任务调度}/*!\brief		开始任务函数\param[in]	传递形参,创建任务时用户自己传入\param[out]	none\retval 	none
*/
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区/*创建单次软件定时器*//*名字,延时时间,pdFALSE单次,编号1,回调函数*/Timer1 = xTimerCreate("Tiner1",1000,pdFALSE,(void *)1,Timer1_Callback);/*创建周期软件定时器*//*名字,延时时间,pdTRUE周期,编号2,回调函数*/Timer2 = xTimerCreate("Tiner2",1000,pdTRUE,(void *)2,Timer2_Callback);//创建任务xTaskCreate((TaskFunction_t )task1,     	(const char*    )"task1",   	(uint16_t       )TASK1_STK_SIZE, (void*          )NULL,				(UBaseType_t    )TASK1_PRIO,	(TaskHandle_t*  )&TASK1_Handler);   vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}/*!\brief		任务1扫描控制软件定时器\param[in]	传递形参,创建任务时用户自己传入\param[out]	none\retval 	none
*/
void task1(void *pvParameters)
{uint8_t key = 0;while(1){	key = Key_Scan(0);if(key == KEY0_PRES){/*开启定时器*/xTimerStart(Timer1,portMAX_DELAY);xTimerStart(Timer2,portMAX_DELAY);taskENTER_CRITICAL();           //进入临界区		printf("开启2个定时器\r\n\r\n");taskEXIT_CRITICAL();            //退出临界区}else if(key == KEY1_PRES){/*关闭定时器*/xTimerStop(Timer1,portMAX_DELAY);xTimerStop(Timer2,portMAX_DELAY);Timer1_ = 0;Timer2_ = 0;taskENTER_CRITICAL();           //进入临界区		printf("停止2个定时器\r\n\r\n");taskEXIT_CRITICAL();            //退出临界区}vTaskDelay(10);}
} /*!\brief		单次定时器回调函数\param[in]	none\param[out]	none\retval 	none
*/
void Timer1_Callback(TimerHandle_t pxTimer)
{taskENTER_CRITICAL();           //进入临界区		printf("单次定时器运行次数:%d次数\r\n\r\n",++Timer1_);taskEXIT_CRITICAL();            //退出临界区}/*!\brief		周期定时器回调函数\param[in]	none\param[out]	none\retval 	none
*/
void Timer2_Callback(TimerHandle_t pxTimer)
{taskENTER_CRITICAL();           //进入临界区		printf("周期定时器运行次数:%d次数\r\n\r\n",++Timer2_);taskEXIT_CRITICAL();            //退出临界区	
}/************************************************************** END OF FILE ****/

http://www.qdjiajiao.com/news/1829.html

相关文章:

  • 网站设计与程序方向怎么接游戏推广的业务
  • 开发公司岗位设置东莞seo网站推广建设
  • 旅游政务网站建设方案知乎seo排名的搜软件
  • 那些网站专门做棋牌推广的东莞整站优化推广公司找火速
  • 做网站用福建省人民政府门户网站
  • 天津营销网站建设如何让百度收录
  • 大施品牌策划公司网络优化培训
  • 吉林省城乡住房建设厅网站百度一下你就知道官网网页版
  • 南宁公司的网站建设百度云资源搜索网站
  • 网站建设和管理中 经验可以免费发布广告的平台有哪些
  • 网站建设策划书是由谁编写的南昌百度推广联系方式
  • 武汉做网站公司生产厂家打开百度首页
  • 高端网站定制开发如何注册网站
  • java做网站浏览记录附子seo
  • 淘宝短网址生成seo服务套餐
  • 青海wap网站建设淘宝运营培训
  • 做网站用母版页不好么百度搜索智能精选
  • 长寿做网站的电话西安seo网站关键词
  • 哪些网站可以做免费广告推广视频剪辑培训班
  • 广东品牌网站制作公司网上销售哪些平台免费
  • 免费连接wifi的软件宁波seo搜索引擎优化公司
  • wordpress公司网站营销公司排行
  • 怎么更改网站的备案号潮州seo
  • 建行深圳网站2022年最新十条新闻
  • 哪个新闻网站好网站建设哪家好
  • 登封网站建设常见的网络营销推广方式有哪些
  • 做社交网站要注册哪类商标品牌推广软文
  • 淄博周村专业网站建设公司深圳网站建设开发公司
  • 中铁建设集团官方网站信息流优化师工作内容
  • 口腔医院网站优化服务商对网站外部的搜索引擎优化