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

FreeRTOS学习(2)延时函数的封装

 以下是封装的延时函数:


/*-----------------------------------------------------*/
/*                                                     */
/*         		  	  延时函数                         */
/*                                                     */
/*-----------------------------------------------------*//**	delay_us()是us级延时函数,delay_ms和delay_xms()都是ms级的延时函数,delay_us()和*	delay_xms()不会导致任务切换。delay_ms()其实就是对 FreeRTOS中的延时函数vTaskDelay()的*	简单封装,所以在使用delay_ms()的时候就会导致任务切换。 */#include "delay.h"static u8  fac_us = 0;					//us延时倍乘数			   
static u16 how_ms_per_rate = 0;			//ms延时倍乘数/*-------------------------------------------------*/
/*函数名:延时初始化                    	       */
/*参  数:无                                       */
/*返回值:无                                       */
/*-------------------------------------------------*/
void delay_init()
{u32 reload;SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLKfac_us = SystemCoreClock/1000000;				//不论是否使用OS,fac_us都需要使用 reload = SystemCoreClock/configTICK_RATE_HZ;	//根据configTICK_RATE_HZ设定溢出时间//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右	how_ms_per_rate = 1000/configTICK_RATE_HZ;		//代表OS可以延时的最少单位	   SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;   	//开启SYSTICK中断SysTick->LOAD = reload; 						//每1/configTICK_RATE_HZ秒中断一次	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;   	//开启SYSTICK 					
}	 /*-------------------------------------------------*/
/*函数名:us延时                    			    */
/*参  数  us                                       */
/*返回值:无                                        */
/*-------------------------------------------------*/
void delay_us(u32 nus)
{		u32 ticks;u32 told,tnow,tcnt = 0;u32 reload = SysTick->LOAD;					//LOAD的值	    	 ticks = nus * fac_us; 						//需要的节拍数 told = SysTick->VAL;        				//刚进入时的计数器值while(1){tnow = SysTick->VAL;	if(tnow != told){	    if(tnow < told)tcnt += told - tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.else tcnt += reload - tnow + told;	    told = tnow;if(tcnt >= ticks)break;				//时间超过/等于要延迟的时间,则退出.}  };										    
} /*-------------------------------------------------*/
/*函数名:ms延时 (FreeRTOS vTaskDelay()封装)        */
/*参  数  ms                                       */
/*返回值:无                                        */
/*-------------------------------------------------*/
void delay_ms(u32 nms)
{	 		  	  if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED){if (nms >= how_ms_per_rate) {vTaskDelay(nms/how_ms_per_rate);}nms %= how_ms_per_rate;				//OS已经无法提供这么小的延时了,采用普通方式延时  		}delay_us((u32)(nms * 1000));		    //普通方式延时
} //延时nms,不会引起任务调度
//nms:要延时的ms数
void delay_xms(u32 nms)
{u32 i;for(i = 0; i < nms; i++) delay_us(1000);
}

 当我们移植FreeRTOS时,会出现了freertos.axf: Error: L6218E: Undefined symbol xTaskGetSchedulerState (referred from delay.o).

解决方法:

使用如下代码,首先要在FreeRTOS.h文件中加入以下宏定义,并设置为1

#ifndef INCLUDE_xTaskGetSchedulerState#define INCLUDE_xTaskGetSchedulerState 1
#endif

并且,然后在FreeRTOSconfig.h文件中配置这个宏为1

#define INCLUDE_xTaskGetSchedulerState          1 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【白话树】之 树的基本知识、存储结构和二叉树转换
  • MySQL 子查询
  • hiresfix_latent 使用Upscale放大节点 对图片进行放大Comfyui
  • 众店绿色积分模式:引领消费新风尚,共筑商业新生态
  • 研1日记10
  • 深入探索系统架构设计
  • CCF编程能力等级认证GESP—C++7级—20240907
  • 利用Idea远程调试
  • Python 从入门到实战15(字符串其它操作)
  • Day14笔记-函数简介定义调用参数一
  • 【Java】基于JWT+Token实现完整登入功能(原理+实操图解)
  • 鸿蒙开发5.0【帧率】解析
  • 宠物毛发对人体有什么危害?宠物空气净化器小米、希喂、352对比实测
  • Nginx的配置性能优化
  • Docker方式部署ProxySQL和Keepalived组合实现MGR的高可用访问
  • [iOS]Core Data浅析一 -- 启用Core Data
  • bearychat的java client
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Flex布局到底解决了什么问题
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • tweak 支持第三方库
  • webpack4 一点通
  • 初识MongoDB分片
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端之Sass/Scss实战笔记
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 延迟脚本的方式
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • ${factoryList }后面有空格不影响
  • (3)(3.5) 遥测无线电区域条例
  • (3)nginx 配置(nginx.conf)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (超详细)语音信号处理之特征提取
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (简单) HDU 2612 Find a way,BFS。
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (十八)SpringBoot之发送QQ邮件
  • (一)Dubbo快速入门、介绍、使用
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .net 程序发生了一个不可捕获的异常
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .NET开发不可不知、不可不用的辅助类(一)
  • .Net面试题4
  • .NET实现之(自动更新)
  • .NET使用存储过程实现对数据库的增删改查
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布