RTOS关于SysTickHandler()

2023-05-16

我们知道FREERTOS会自动装载PendSV_Handler()和SVC_Handler()函数,这里我们希望自己对其从新定义,故做如下处理。

#include "delay.h"
#include "sys.h"
// 	 

#if SYSTEM_SUPPORT_OS
#include "FreeRTOS.h"					//FreeRTOS使用的头文件		  
#include "task.h"             //FreeRTOS使用的头文件	
#endif

static u8  fac_us=0;							//us延时倍乘数			   
static u16 fac_ms=0;							//ms延时倍乘数,在ucos下,代表每个节拍的ms数
	
static u32 sysTickCnt=0;	
extern void xPortSysTickHandler(void);

/**************************************************************************
函数功能:初始化延迟函数
入口参数:无
返回  值:无
**************************************************************************/
void delay_init()
{
	u32 reload;
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLK
	fac_us=SystemCoreClock/1000000;				//不论是否使用OS,fac_us都需要使用
	reload=SystemCoreClock/1000000;				//每秒钟的计数次数 单位为M  
	reload*=1000000/configTICK_RATE_HZ;			//根据configTICK_RATE_HZ设定溢出时间
												//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右	
	fac_ms=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    
}									    
/**************************************************************************
函数功能:延时nus的延迟函数
入口参数:延时的时长
返回  值:无
**************************************************************************/  								   
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;			//时间超过/等于要延迟的时间,则退出.
		}  
	};										    
}  
/**************************************************************************
函数功能:延时nms的延迟函数
入口参数:延时的时长
返回  值:无
**************************************************************************/  
void delay_ms(u32 nms)
{	
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
	{		
		if(nms>=fac_ms)						//延时的时间大于OS的最少时间周期 
		{ 
   			vTaskDelay(nms/fac_ms);	 		//FreeRTOS延时
		}
		nms%=fac_ms;						//OS已经无法提供这么小的延时了,采用普通方式延时    
	}
	delay_us((u32)(nms*1000));				//普通方式延时
}
/**************************************************************************
函数功能:延时ms的延迟函数
入口参数:延时的时长
返回  值:无
**************************************************************************/  
void delay_xms(u32 nms)
{
	u32 i;
	for(i=0;i<nms;i++) delay_us(1000);
}

/**************************************************************************
函数功能:滴答定时器中断服务函数
入口参数:延时的时长
返回  值:无
**************************************************************************/  
void SysTick_Handler(void)
{	
    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
    {
        xPortSysTickHandler();	
    }
		else
		{
		sysTickCnt++;	/*调度开启之前计数*/
	}
}
/**************************************************************************
函数功能:获取上次执行函数的时间
入口参数:无
返回  值:上一次执行程序的时间
**************************************************************************/ 
u32 getSysTickCnt(void)
{
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)	/*系统已经运行*/
		return xTaskGetTickCount();
	else
		return sysTickCnt;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RTOS关于SysTickHandler() 的相关文章

  • RTOS随笔之FreeRTOS

    RTOS几点思考 为什么使用RTOS 1 先考虑OS有什么特点 xff1f 2 再考虑什么情况下使用OS FreeRTOS调试技巧任务管理1 任务调度流程2 任务栈大小 xff0c 栈溢出检测3 中断管理4 内存管理 FreeRTOS AP
  • 关于RTOS中信号量、互斥量、邮箱、消息队列的一些理解

    1 信号量 信号量有两种 xff1a 计数性信号量和二值信号量 xff0c 计数性信号量可以被获取多次 xff0c 二值信号量只有0和1两种状态 xff0c 只能被获取一次 信号量可以用来对资源进行保护 xff0c 防止多个任务同时访问某个
  • RTOS任务调度过程(上下文切换)

    RTOS任务调度过程 xff08 上下文切换 xff09 解析 xff1a RTOS任务调度的机制是基于内核异常机制的 xff0c 即每产生一次调度就会产生一次内核异常 xff0c 那么 xff0c 要了解RTOS的任务调度机制需要先明白内
  • 手写RTOS-使用PendSV进行压栈与出栈操作

    学会使用PendSV中断进行压栈和出栈操作 xff0c 是实现任务调度的关键 今天我们就来学习一下如何使用不超过20行的汇编实现压栈和出栈操作 我们现在来实现这么一个例子 xff1a 先把R4 R11通用寄存器的值保存到一个缓冲区里面 xf
  • CCS v6.1下完成TI-RTOS配置

    TI RTOS 是实时操作系统的TI微控制器 TI RTOS实现更快的发展不再需要开发人员编写和维护的系统软件 xff0c 如调度程序 xff0c 协议栈和驱动程序 它结合了实时多任务内核与其他中间件组件 xff0c 包括TCP IP和US
  • RTOS滴答Tick设置多少才合适

    本文转载 xff0c 留作笔记 xff0c 如有侵权 xff0c 请联系删除 xff0c 原文链接地址 xff1a 嵌入式开发 RTOS滴答Tick设置多少才合适 xff1f qq com https mp weixin qq com s
  • RTOS信号量、邮箱、队列与事件

    一 定义 信号量 xff0c 邮箱 xff0c 队列的最大不同在于它们发送的内容不同 1 信号量是一个触发信号 xff0c 也是一个计数器 xff0c 等待接收信号的任务一般只有接收到信号才可以执行 xff0c 否则任务一直暂停 xff08
  • RTOS概念介绍

    事件标志组 事件标志组是实现多任务同步的有效机制之一 也许有不理解的初学者会问采用事件标志组多麻烦 xff0c 搞个全局变量不是更简单 xff0c 其实不然 在裸机编程时 xff0c 使用全局变量的确比较方便 xff0c 但是在加上 RTO
  • RTOS 中 Task 之间资源共享示例

    RTOS 中 Task 之间资源共享示例 什么是共享资源 大型项目往往需要创建多个任务 xff0c 任务之间协同合作完成一个大型的功能 在前述的章节中 xff0c 我们讲述了任务间的同步与通信 xff0c 但合作与竞争总是相辅相成的 任务
  • 【STM32CubeMX】STM32H7-RTOS-SPI-W5500

    工程源码下载 xff1a 基于裸机和Freertos的W5500网络通信工程 目录 1 移植W5500步骤 2 Cobemx配置步骤 2 1 时钟配置Clock Configuration 2 2 Trace and Debug配置 2 3
  • 什么是RTOS?RTOS与普通操作系统的区别

    一 xff1a 什么是RTOS RTOS Real Time Operating System xff0c 实时操作系统 实时性是其最大特征 xff0c 实时操作系统中都要包含一个实时任务调度器 xff0c 这个任务调度器与其它操作系统的最
  • FreeRTOS 事件组

    实现功能 当任务A B完成后执行串口任务 不同任务用不同的位表示 configUSE 16 BIT TICKS 1 bitx 0 7 configUSE 16 BIT TICKS设置为0 bitx 0 23 串口任务的头文件 ifndef
  • UCOS2的文件目录

    想着闲着也是闲着 把之前学习ucos2源码的笔记整理一下 复盘一次 总结内容将其写为博客作为学习的输出 一 为什么要学RTOS或者IOTOS 我在大一时 开始进入实验室接触单片机 摸爬滚打的参加了几次比赛 也因此入了嵌入式的坑 大三时开始思
  • RTT-信号量

    RTT 信号量 概念 信号量就是一个标记位 释放信号量就是标记位加一 获取信号量后自动减一 减到0后不能再获取了 信号量 Semaphore 是一种实现线程间通信的机制 实现线程之间同步或临界资源的互斥访问 常用于协助一组相互竞争的线程来访
  • FreeRTOS(1):任务

    目录 一 FreeRTOS 介绍 什么是 FreeRTOS 为什么选择 FreeRTOS FreeRTOS 资料与源码下载 FreeRTOS 实现多任务的原理 二 移植 FreeRTOS 到STM32 手动移植 使用CubeMX快速移植 快
  • 自己动手写RTOS:02-在M3内核上实现pendsvc

    自己动手写RTOS 自己动手写RTOS 01基础知识和理论部分 自己动手写RTOS 02 在M3内核上实现pendsvc 文章目录 自己动手写RTOS 一 M3内核的相关知识 1 1寄存器 1 2特殊寄存器 1 3堆栈 二 pendSVC实
  • Nuttx操作系统(三):构建模式

    1 1 Nuttx构建配置以及模式 Nuttx有三种不同的构建配置 FLAT构建 这种构建是所代码驻留在公共地址空间中 1 应用 内核以及board logic在一个flat地址环境中 2 所有的地址空间具有相同的属性 PROTECTED构
  • RT-Thread记录(七、IPC机制之邮箱、消息队列)

    讲完了线程同步的机制 我们要开始线程通讯的学习 线程通讯中的邮箱消息队列也属于 RT Thread 的IPC机制 目录 前言 一 邮箱 1 1 邮箱控制块 1 2 邮箱操作 1 2 1 创建和删除 1 2 2 初始化和脱离 1 2 3 发送
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站

随机推荐

  • ubuntu16.04+GTX1650 安装cuda,驱动会自动安装!+安装cudnn

    补充一句 只是做深度学习跑模型的话 xff0c 装完驱动后就可以了 xff0c 不需要额外按照NVIDIA官网的教程配置CUDA和CUDNN 我们的代码实际用到的是python环境下的包 比如我用anaconda配置环境 xff0c 直接在
  • ADRC线性自抗扰控制感应电机矢量控制调速Matlab Simulink仿真

    ADRC线性自抗扰控制感应电机矢量控制调速Matlab Simulink仿真 1 模型简介 模型为基于线性自抗扰控制 xff08 LADRC xff09 的感应 xff08 异步 xff09 电机矢量控制仿真 xff0c 采用Matlab
  • xubuntu16.04下安装向日葵并设置开机自启

    1 安装Sunlogin 下载 SunloginClient 11 0 1 44968 amd64 deb 解压后将SunloginClient 11 0 1 44968 amd64 deb拷贝到目标设备上 xff0c 终端运行 xff1a
  • xubuntu16.04下安装turboVNC并设置开机自启(TurboVNC + VirtualGL)

    关于TightVNC的安装和使用可参考 xff1a 在Ubuntu 16 04上安装和配置VNC 使用VNC过程中遇到的问题总结 为什么使用TurboVNC xff1f 虽然TightVNC可以进行远程桌面登录 xff0c 但如果运行有界面
  • xubuntu16.04安装x11vnc

    内容 1 安装x11vnc1 1 设置x11vnc的连接密码1 2 启动x11vnc服务 2 设置x11vnc开机自启动3 如何解决x11vnc远程连接后操作卡顿 xff0c cpu占用高 xff1f 1 安装x11vnc 有网络的情况下直
  • 服务器以root身份登录

    终端输入 su root xff0c 然后输入密码就行了
  • Linux系统下----make命令详解,地球人都在用的“编译工具”

    Make命令 1 功能介绍2 准备工作 写法和用法3 注意事项4 买家秀 5 其他 1 功能介绍 make命令是用来自动完成大批量源文件的编译工作的维护工具 xff1b 能够建立不同文件之间的依赖关系 xff1b 自动识别被修改的源文件并重
  • 小四轴实验:空心杯电机驱动

    单片机的io口带负载能力是较弱的 xff0c 即输出电流较小 xff0c 不能直接用io口驱动电机 事实上 xff0c 单片机的io口接大功率的LED灯都是比较困难的 因此我们需要外部电源供电 xff0c 通过驱动电路驱动电机转动 对于大型
  • 小四轴实验:四旋翼无人机飞行原理

    转速与飞行方式说明 参考博客 https blog csdn net qq 27270029 article details 79877022 https blog csdn net sinat 29315697 article detai
  • ST-LINK JLINK JTAG SWD接线图

  • PID参数起什么作用

    PID控制中有P I D三个参数 只有明白这三个参数的含义和作用才能完成控制器PID参数整定 让控制器到达最佳控制效果 昌晖仪表在本文给大家介绍PID控制中P I D参数的作用 比例作用 比例控制器实际上就是个放大倍数可调的放大器 要说明的
  • 如何在I2C通信中同时和多个从机通信

    对于不同地址的模块就不用多说了 xff0c 直接分别对其地址进行通信即可 那么若拿到相同地址的模块 xff0c 或者直接是相同的多个模块怎么办呢 xff1f 方法一 xff1a xff08 内置了两种地址的模块 xff09 对于内置了两种地
  • CUDA是什么-CUDA简介

    CPU GPU CPU CPU xff08 Central Processing Unit xff09 是一块超大规模的集成电路 xff0c 是一台计算机的运算核心 xff08 Core xff09 和控制核心 xff08 Control
  • 自动驾驶传感器评估 ——IMU惯性测量单元

    自动驾驶传感器评估 IMU惯性测量单元 前言 对于自动驾驶来说 xff0c 高精度定位必不可少 为了让自动驾驶系统更高频率的获取定位信息 xff0c 就必须引入更高频率的传感器 xff0c 这时就体现出了惯性测量单元 xff08 Inert
  • 洛谷:P1238 走迷宫(DFS)

    题目描述 有一个mn格的迷宫 表示有m行 n列 xff0c 其中有可走的也有不可走的 xff0c 如果用1表示可以走 xff0c 0表示不可以走 xff0c 文件读入这m n个数据和起始点 结束点 起始点和结束点都是用两个数据来描述的 xf
  • 通过ajax进行文件上传及回显并解决后台返回图片路径却不能直接显示问题

    1 选中图片立刻回显 前端代码 lt div class 61 34 row 34 id 61 34 uplodFilel 34 gt lt div class 61 34 col md 8 34 gt lt label gt 上传身份证正
  • STM32CubeMX配置串口

    配置串口 1 在Piont amp Configuration中的A gt Z找到USART1 xff1b 2 第一个选项Mode是用来设置串口模式或关闭串口 xff0c 第二个选项Hardware Flow Control用来开启硬件流控
  • postman汉化教程(历史老版本)

    目录 1 下载对应版本的postman 2 替换url中对应的版本号 3 下载postman对应版本的汉化包 4 打开postman文件位置 5 打开后寻找 app 9 12 2 resources 目录 然后将下载好的压缩包解压 6 重启
  • c++学习 :函数形参4种传递形式:(int a)(int &a)(int *a)(int *& a)

    c 43 43 学习 xff1a 函数形参4种传递形式 1 void func int para 2 void func int amp para 3 void func int pointer 4 void func int amp po
  • RTOS关于SysTickHandler()

    我们知道FREERTOS会自动装载PendSV Handler 和SVC Handler 函数 xff0c 这里我们希望自己对其从新定义 xff0c 故做如下处理 include 34 delay h 34 include 34 sys h