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

网站如何不让百度抓取淮南先锋网

网站如何不让百度抓取,淮南先锋网,众筹网站建设费用,教育行业网站建设软件定时器 在FreeRTOS中可以设置无数个软件定时器,都是基于系统滴答中断。 使用软件定时器需要指定时间:启动定时器和运行回调函数。启动定时器和运行回调函数的间隔为定时器的周期。 使用软件定时器需要指定类型:一次性(回调函数…

软件定时器

在FreeRTOS中可以设置无数个软件定时器,都是基于系统滴答中断。

使用软件定时器需要指定时间:启动定时器和运行回调函数。启动定时器和运行回调函数的间隔为定时器的周期。

使用软件定时器需要指定类型:一次性(回调函数只被调用一次,可手动再次启动)或自动加载(回调函数间歇调用)。

使用软件定时器需要指定事件:指定回调函数。

守护任务

FreeRTOS中有一个Tick中断,软件定时器基于Tick来运行。定时器函数一般在中断里执行,如在中断中判断定时器是否超时,如果超时就调用回调函数。

但FreeRTOS是RTOS,不允许在内核、中断中执行不确定的代码(如果定时器函数很耗时会影响整个系统)。所以FreeRTOS中,不在Tick中断中执行定时器函数。

而是在RTOS Damemon Task(RTOS守护任务)里执行。当FreeRTOS配置项configUSE_TIMERS被设置为1,在启动调度器时会自动创建RTOS守护任务。

我们编写的任务函数要使用定时器时,是通过定时器命令队列(timer command queue)和守护任务交互。

守护任务的优先级为:configTIMER_TASK_PRIORITY,定时器命令队列长度为configTIMER_QUEUE_LENGTH。

当守护任务是当前优先级最高的就绪态任务时,它就可以运行。它的工作有两类:

        处理命令:从命令队列里取出命令、处理。

        执行定时器的回调函数。

能否及时处理定时器的命令、能否及时执行定时器的回调函数,严重依赖于守护任务的优先级。

/* 定时器的回调函数 */
void ATimerCallback( TimerHandle_t xTimer );

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

        回调函数要尽快执行,不能进入阻塞状态。

        不用调用会导致阻塞的API函数,如vTaskDelay()。

        可以调用xQueueReceive()等函数,但是超时时间要设为0,不阻塞。

创建定时器

TimerHandle_t xTimerCreate( const char * const pcTimerName,					// 定时器名字const TickType_t xTimerPeriodInTicks,			// 定时器周期, 以Tick为单位const UBaseType_t uxAutoReload,					// 定时器是否自动重装载, pdTRUE表示自动加载, pdFALSE表示一次性void * const pvTimerID,							// 回调函数可以使用此参数, 比如分辨是哪个定时器TimerCallbackFunction_t pxCallbackFunction );	// 回调函数
/* 返回值: 成功则返回TimerHandle_t, 否则返回NULL */TimerHandle_t xTimerCreateStatic(	const char * const pcTimerName,				// 定时器名字TickType_t xTimerPeriodInTicks,				// 定时器周期, 以Tick为单位UBaseType_t uxAutoReload,					// 定时器是否自动重装载, pdTRUE表示自动加载, pdFALSE表示一次性void * pvTimerID,							// 回调函数可以使用此参数, 比如分辨是哪个定时器TimerCallbackFunction_t pxCallbackFunction,	// 回调函数StaticTimer_t *pxTimerBuffer );				// 传入一个StaticTimer_t结构体, 将在结构体构造定时器
/* 返回值: 成功则返回TimerHandle_t, 否则返回NULL */void ATimerCallback( TimerHandle_t xTimer );
typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer );

删除定时器

动态分配的定时器,不再需要时可以删除以回收内存。

/* * xTimer: 要删除哪个定时器* xTicksToWait: 超时时间* 返回值: 	pdFAIL表示"删除命令"在指定超时时间内无法写入队列* 			pdPASS表示成功
*/
BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );

定时器的很多API函数都是通过发送命令到命令队列,由守护任务来实现。如果队列满了,命令就无法立即写入队列,需要指定一个超时时间。

启动定时器

启动定时器就是设置它的状态为运行态。

xTicksToWait不是定时器超时时间,也不是定时器周期。

如果定时器已经被启动,但它的回调函数还没有被执行时,再次执行xTimerStart()函数相当于执行xTimerReset()函数,重新设定它的启动时间。

/* * xTimer: 哪个定时器* xTicksToWait: 超时时间* 返回值: 	pdFAIL表示"启动命令"在指定超时时间内无法写入队列* 			pdPASS表示成功*/
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );/* * xTimer: 哪个定时器* pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,如果守护任务的优先级比当前任务的高,则*pxHigherPriorityTaskWoken = pdTRUE,表示需要进行任务调度* 返回值:  pdFAIL表示"启动命令"无法写入队列* 			pdPASS表示成功*/
BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken );

停止定时器

启动定时器就是设置它的状态为睡眠态,让它无法运行。

/* * xTimer: 哪个定时器* xTicksToWait: 超时时间* 返回值: 	pdFAIL表示"停止命令"在指定超时时间内无法写入队列* 			pdPASS表示成功*/
BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );/* * xTimer: 哪个定时器* pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,如果守护任务的优先级比当前任务的高,* 则*pxHigherPriorityTaskWoken = pdTRUE,表示需要进行任务调度* 返回值: 	pdFAIL表示"停止命令"无法写入队列* 			pdPASS表示成功*/
BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken );

复位定时器

使用xTimerReset()函数可以让定时器的状态从睡眠态转换为运行态,相当于使用xTimerStart()函数。

如果定时器已经处于运行态,使用xTimerReset()函数相当于重新确定超时时间。

/* * xTimer: 哪个定时器* xTicksToWait: 超时时间* 返回值: 	pdFAIL表示"复位命令"在指定超时时间内无法写入队列* 			pdPASS表示成功*/
BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );/* * xTimer: 哪个定时器* pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,如果守护任务的优先级比当前任务的高,* 则*pxHigherPriorityTaskWoken = pdTRUE,表示需要进行任务调度* 返回值: 	pdFAIL表示"停止命令"无法写入队列* 			pdPASS表示成功*/
BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken );

修改定时器周期

使用xTimerChangePeriod()函数,除了能修改定时器周期外,还可以让定时器的状态从睡眠态转换为运行态。

修改定时器周期时,会使用新的周期重新计算它的超时时间。

/* 返回值: 	pdFAIL表示"修改周期命令"在指定超时时间内无法写入队列* 			pdPASS表示成功*/
BaseType_t xTimerChangePeriod( 	TimerHandle_t xTimer, 		/* xTimer: 哪个定时器 */TickType_t xNewPeriod,		/* xNewPeriod: 新周期 */TickType_t xTicksToWait );	/* xTicksToWait: 超时时间, 命令写入队列的超时时间 *//* pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,如果守护任务的优先级比当前任务的高,* 则*pxHigherPriorityTaskWoken = pdTRUE,表示需要进行任务调度* 返回值: 	pdFAIL表示"修改周期命令"在指定超时时间内内无法写入队列* 			pdPASS表示成功*/
BaseType_t xTimerChangePeriodFromISR(	TimerHandle_t xTimer,						/* xTimer: 哪个定时器 */TickType_t xNewPeriod,						/* xNewPeriod: 新周期 */BaseType_t *pxHigherPriorityTaskWoken );	

定时器ID

typedef struct tmrTimerControl
{const char 				*pcTimerName;ListItem_t 				xTimerListItem;TickType_t 				xTimerPeriodInTicks;void 					*pvTimerID;			// 定时器IDTimerCallbackFunction_t pxCallbackFunction;
#if ( configUSE_TRACE_FACILITY == 1 )UBaseType_t uxTimerNumber;
#endifuint8 t ucStatus;
} xTIMER;

怎么使用定时器ID,完全由程序来决定:

        可以用来标记定时器,表示自己是什么定时器

        可以用来保存参数,供回调函数使用

它的初始值在创建定时器时由xTimerCreate()函数传入,后续可以使用这些函数来操作:

        更新ID:使用vTimerSetTimerID()函数

        查询ID:使用pvTimerGetTimerID()函数

这两个函数不涉及命令队列,都是直接操作定时器结构体的。

/* * xTimer: 哪个定时器* 返回值: 定时器的ID*/
void *pvTimerGetTimerID( TimerHandle_t xTimer );/* * xTimer: 哪个定时器* pvNewID: 新ID*/
void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID );

应用场景:一般使用

应用场景:消除抖动

http://www.yayakq.cn/news/864876/

相关文章:

  • 试述网站建设的流程苏州小程序开发制作公司
  • 创网站建筑平面设计图
  • 制作一个小型网站网站的建设及维护的费用
  • 网站建设外包平台wordpress 3.2.1
  • 阿里云网站域名证书网站微商城的建设运营实践和思考
  • 做网站要准备官方网站如何做
  • 原材料价格查询网站网站推广是怎么做的
  • 网站建设论文选题背景wordpress调取指定分类下的文章
  • 个人电脑做服务器网站房产交易网官网
  • 关于小说网站的一些建设流程青岛十大外贸公司
  • 做电影网站用什么软件有哪些常宁网站定制
  • 网站模板是指网站内容的总体结构和页面格式总体规划青岛济南网站制作
  • 网站模板侵权问题从留言板开始做网站
  • 上海互联网网站建设公司wordpress 内链插件
  • 网站后台模板安装显示不了手表欧米茄官网
  • 哪些网站的做的好看山东省建设八大员考试网站
  • 上海崇明网站建设wordpress 获取子页面内容
  • 五个h5制作网站滨州公司做网站
  • 昆明门户网站建设一般网络推广应该怎么做
  • 外贸网站推广多少费用南宫企业做网站
  • 武都区建设局网站广州越秀区东海大厦
  • 武穴市网站两学一做wordpress 注册 填写密码
  • 鞍山招聘网站灵雀云 wordpress
  • 企业网站建设方案文档贵州微网站建设公司
  • 企业手机网站建设新闻网页设计与制作(第2版)课件
  • 卖视频会员个人网站怎么做网站建设维护费 会计科目
  • 上海微网站公司秦皇岛营销式网站
  • 租号网站怎么做的百度 新网站 重定向过多
  • 做游戏的网站vs2010网站开发源码
  • 商业网站开发实训心得体会范文php做网站技术方案