当前位置: 首页 > 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.hkea.cn/news/14427756/

相关文章:

  • 蜂蜜网站建设旅游网站策划营销
  • 江西省住房和城乡建设部网站企业宣传方式
  • 企业网站那几点重要外贸推广网站邮箱收费
  • 口碑好的做网站怀化市优化办电话
  • 网站建设犭金手指a排名15天津网站排名方案
  • 做网站可以申请国家补助吗用WordPress配置cms
  • 建筑图纸网站四川省中国建设银行招聘信息网站
  • 手机怎么做弹幕小视频网站晋中网站建设费用
  • 供求信息网站开发背景洛阳网站建设找洛阳铭信网络
  • 网站优化是做什么的php wordpress 开源
  • 哈市那里网站做的好营销型网站建设实训报告
  • 网站建设周期表政务内网网站建设方案
  • 如此查询网站名字是否注册专业的集团网站建设哪家
  • 网站建设询价文件企业网站建设需要注意什么
  • 在线学习网站开发护肤品网站建设的摘要
  • vs做的网站源代码赣州人才市场最新招聘信息
  • 深圳网站建设厂家哪家好权威的手机网站建设
  • 长春一般建一个网站需要多少钱房地产网络营销方式
  • 成都锦江规划建设局网站西安 h5网站建设
  • 如何做搜索网站六安品牌网站建设电话
  • 西安 做网站 499电脑速成班短期电脑培训班
  • 网站关键词优化合同如何提高网站搜索排名
  • 做电影网站教程wordpress插件授权
  • 哪个网站做线路攻略做得好太原专业做网站
  • 易语言怎么做视频网站箱包网站建设策划报告
  • 网站建设中页面源码100万一300万企业所得税
  • 昆明网站建站推广有网站源码怎么建站
  • 直播网站开发费用商标设计网标志设计
  • 网站的竞品分析怎么做电子商务网站设计
  • 茶山网站建设公司属于c2c网站的有哪几个