freeRTOS滴答时钟相关源码分析

2023-05-16

最近学习白问网韦东山老师在B站开源的freeRTOS课程,网址:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili和7天物联网训练营【第2期】7天物联网智能家居实战训练营

在学习过程中按照韦老师的方法分析了下freeRTOS源码,如果有不对的地方请指证。
 

freeRTOS滴答时钟相关源码分析,基于cubemx生成的freeRTOS工程

xPortStartScheduler	
	    vPortSetupTimerInterrupt
	
	
	void vPortSetupTimerInterrupt( void )
	{
		
		/* 
			1、操作系统,是针对寄存器操作---效率高
			2、首先赋值装载寄存器值 = (CPU频率/配置周期)-1
				2.1、HAL_RCC_ClockConfig() cpu频率实在硬件启动时,就已经获取了
				2.2、configTICK_RATE_HZ = 1000 是由cubemx配置而得
			3、配置控制寄存器
				3.1、开启时钟源
				3.2、使能中断
				3.3、使能systick
			4、可以参考,M4权威指南  9.5章节----systick定时器
			
			5、configTICK_RATE_HZ
				5.1、建议不要小于1ms
				5.2、建议以整数倍赋值  10ms 100ms  1000ms  便于计算管理

		/* Configure SysTick to interrupt at the requested rate. */
		portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
		portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
	}




xPortSysTickHandler
        xTaskIncrementTick

void xPortSysTickHandler( void )
{
    
	
	/*关闭中断,不让中断打断systick中断服务,就是进入临界段*/
	vPortRaiseBASEPRI();
	{
		     操作系统调度接口
			如果调度器返回true,触发pendSV异常
		if( xTaskIncrementTick() != pdFALSE )
		{
			
			触发pendSV异常
			portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
		}
	}
	清除中断屏蔽,打开中断,执行pendSV异常
	vPortClearBASEPRIFromISR();
}






//SysTick任务调度
BaseType_t xTaskIncrementTick( void )
{
   TCB_t * pxTCB;
   TickType_t xItemValue;
   //返回值,表示是否进行上下文切换
   BaseType_t xSwitchRequired = pdFALSE;

	
	traceTASK_INCREMENT_TICK( xTickCount );
	/*内核调度器是否有挂起,pdFALSE表示内核调度器没有挂起*/
	if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
	{
		/* tick计数值+1 */
		const TickType_t xConstTickCount = xTickCount + 1;

		
		xTickCount = xConstTickCount;
        //判断tick是否溢出越界
		if( xConstTickCount == ( TickType_t ) 0U )
		{
		    //如果溢出,要更新延时列表
			taskSWITCH_DELAYED_LISTS();
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}
/* 
			1、当前节拍大于时间片的锁定时间
			2、就说明,有任务需要进行调度了,时间片用完了
		
		
		*/
		if( xConstTickCount >= xNextTaskUnblockTime )
		{
			for( ;; )//会一直遍历整个任务延时列表,主要目的是,找到时间片最短的任务,进行切换
			{
			
			    //1、判断任务延时列表中,是否为空,也就是说,有没有任务在等待调度
				if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
				{
					//如果没有任务等待,把时间片赋值为最大值,不再调度
					xNextTaskUnblockTime = portMAX_DELAY; 
					break;
				}
				else
				{
					
					/* 
						1、从任务延时列表中,获取第一个任务控制块
							1、延时列表,插入永远是把时间片最短的任务,放在第一个
							
						2、获取任务控制块的延时时间
					
					
					*/
					pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
					xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );
                    //再次判断,这个任务的时间片是否到达
					if( xConstTickCount < xItemValue )
					{
						/* 没有到达,把此任务的时间片更新为当前系统的时间片 */
						xNextTaskUnblockTime = xItemValue;
						break;
					}
					else
					{
						mtCOVERAGE_TEST_MARKER();
					}

					/* 把任务从延时列表中移除 */
					( void ) uxListRemove( &( pxTCB->xStateListItem ) );

					/* 把任务从事件列表中移除 */
					if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
					{
						( void ) uxListRemove( &( pxTCB->xEventListItem ) );
					}
					else
					{
						mtCOVERAGE_TEST_MARKER();
					}

				/* 把任务添加到就绪列表中 */
					prvAddTaskToReadyList( pxTCB );

					/* 抢占式处理 */
					#if (  configUSE_PREEMPTION == 1 )
					{
						
						/*
							1、判断优先级是否大于当前任务
								1.1、大于则进行调度
						
						
						*/
						if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
						{
							xSwitchRequired = pdTRUE;
						}
						else
						{
							mtCOVERAGE_TEST_MARKER();
						}
					}
					#endif /* configUSE_PREEMPTION */
				}
			}
		}

		  /* 时间片处理机制 */
		#if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )
		{
		//1、获取就绪列表长度
				1.1、就绪列表指的是,当前任务优先级的列表
				1.2、如果有其他任务在就绪列表中,就开始调度
		    
			if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 )
			{
				xSwitchRequired = pdTRUE;
			}
			else
			{
				mtCOVERAGE_TEST_MARKER();
			}
		}
		#endif

		#if ( configUSE_TICK_HOOK == 1 )
		{
			/* Guard against the tick hook being called when the pended tick
			count is being unwound (when the scheduler is being unlocked). */
			if( uxPendedTicks == ( UBaseType_t ) 0U )
			{
				vApplicationTickHook();
			}
			else
			{
				mtCOVERAGE_TEST_MARKER();
			}
		}
		#endif /* configUSE_TICK_HOOK */
	}
	//内核调度器挂起了
	else
	{
		++uxPendedTicks;//挂起的tick+1

		/* The tick hook gets called at regular intervals, even if the
		scheduler is locked. */
		#if ( configUSE_TICK_HOOK == 1 )
		{
			vApplicationTickHook();
		}
		#endif
	}
     如果是抢占模式,要开启调度
	#if ( configUSE_PREEMPTION == 1 )
	{
		if( xYieldPending != pdFALSE )
		{
			xSwitchRequired = pdTRUE;
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}
	}
	#endif /* configUSE_PREEMPTION */
    //返回调度器状态
	return xSwitchRequired;
}


 

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

freeRTOS滴答时钟相关源码分析 的相关文章

  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • FreeRTOS学习笔记(3、信号量、互斥量的使用)

    FreeRTOS学习笔记 3 信号量 互斥量的使用 前言 往期学习笔记链接 学习工程 信号量 semaphore 两种信号量的对比 信号量的使用 1 创建信号量 2 give 3 take 4 删除信号量 使用计数型信号量实现同步功能 使用
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • 防止GCC LTO删除函数

    我使用 GCC ARM Embedded 和 FreeRTOS FreeRTOS具有的功能vTaskSwitchContext 仅在某些情况下使用 内联汇编代码 问题是 当我使用LTO时 GCC不考虑内联汇编代码并认为该函数没有被使用 因此
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

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

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • Ubuntu安装ftp实现文件上传

    ftp服务安装与配置 sudo apt install vsftpd 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img UlscHRVo 1598855886357 https img blog csdn net
  • Docker安装Tomcat镜像并部署web项目简述

    一 安装Tomcat 1 查找Docker Hub上的tomcat镜像 docker search tomcat 2 拉取官方的镜像 docker pull tomcat 等待下载完毕 xff0c 需要一些时间 3 查看docker所有的镜
  • Docker删除镜像和容器

    删除docker中的镜像 xff0c 我们可以使用如下命令 xff1a docker rmi 镜像id 删除docker中的容器可以使用如下命令 xff1a docker rm 容器id 使用如下命令可以查看当前正在运行的容器 docker
  • ubuntu安装SonarQube实现代码质量检测

    一 ubuntu中安装jdk 下载并安装jdk 详细过程可参考 xff1a https blog csdn net qq 26709459 article details 80466239 二 ubuntu中安装mysql 详细过程可参考
  • springboot整合quartz(集群环境)

    使用quartz实现定时任务 xff0c 若是部署多台机器 xff0c 那么到了时间点 xff0c 多台服务器便会同时均开始执行定时任务 xff0c 这不符合我们的功能实现 quartz集群分为水平集群和垂直集群 xff0c 水平集群即将定
  • tomcat集群环境下实现负载均衡、session共享

    一 高可用 高可用HA High Availability 是分布式系统稳定运行必须考虑的因素之一 xff0c 它指的是通过处理减少系统不能提供服务的时间 比如说系统能够一直正常提供服务 xff0c 我们就说这个系统可用性为100 我们知道
  • 搭建RocketMq

    安装所需要的所有安装包 自己可以搜索源码自己打包 xff0c 也可以自己百度下载 xff0c 下面的是我的相关软件包 xff0c 有需要可以自己下载 xff1a https download csdn net download qq 267
  • ros launch中的节点工作空间路径

    原链接 运行测试平台 小强ROS机器人 在launch文件中启动节点 xff0c 那么这个节点的工作目录是什么呢 xff1f 在node程序中如果创建一个文件 xff0c 这个文件的默认位置在哪里 xff1f 在launch中node节点有
  • 搭建Git服务器并安装管理工具Gitblit

    一 安装Git服务 1 移除旧版git yum remove git 2 下载git 在如下链接中可以看到git所有版本 xff0c 选择自己需要的版本进行下载 xff0c 这里我选择最新版本 https github com git gi
  • FastDFS的安装配置及其使用

    一 fastDFS是什么 fastDFS是c语言编写的一款开源分布式文件系统 xff0c 使用fastDFS可以很方便搭建一套高性能的文件服务器集群提供文件上传 下载等服务 二 fastDFS工作原理 fastDFS包括Tracker se
  • centos编译hadoop源码包

    一 所需工具 JDK maven protobuf CMake ant hadoop 2 x x src 如下所示 xff1a 二 安装 1 安装jdk 2 安装maven 可以参考如下地址 xff1a https blog csdn ne
  • CentOs搭建Zookeeper

    下载地址 https mirrors tuna tsinghua edu cn apache zookeeper zookeeper 3 4 14 一 zookeeper环境搭建 安装jdk xff1a 略 本次我们在192 168 0 1
  • CensOs搭建Solr环境并配置

    下载地址 xff1a https mirrors tuna tsinghua edu cn apache lucene solr 8 1 1 注 xff1a 这里我使用的8 1 1版本 xff0c 可以根据自己需要选择版本 若是版本相差较大
  • Centos安装Docker

    Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的 Linux 机器上 xff0c 也可以实现虚拟化 Docker 技术的三大核心概念 xff0c
  • Docker图形管理工具的安装与使用

    1 搜索Portainer镜像 docker search portainer 2 下载镜像 docker pull portainer portainer 3 启动 docker run d p 9000 9000 restart 61
  • PV3953L1光流定点激光定高四轴悬停模块说明书

    PV3953L1光流定点激光定高四轴悬停模块说明书 视频效果 xff1a STM32F103 270飞控 四轴飞行器大机架 DIY安装 视频教程 1 产品图片 型号 xff1a PV3953L1 接线标识 xff1a V xff1a 3 3
  • 【OpenCV3.2】Detection of ArUco Markers

    姿态估计 xff08 Pose estimation xff09 在 计算机视觉 领域扮演着十分重要的角色 xff1a 机器人 导航 增强现实以及其它 这一过程的基础是找到现实世界和图像投影之间的对应点 这通常是很困难的一步 xff0c 因
  • FreeRTOS学习之前后台系统存在的问题

    最近报了百问网7天物联网的训练营 https www 100ask net detail term 6216e88bc00cf 3clJb1 25 和在B站上学习的韦东山老师的freeRTOS做了下学习记录 1 什么是前后台系统 这是一个典
  • 速腾聚创16线激光雷达rslidar-16的ros驱动安装与rviz点云显示

    原链接 https community bwbot org topic 520 运行测试平台 小强ROS机器人 速腾聚创16线激光雷达rslidar 16的供电是直流12v 3A xff0c 通信接口是rs485网络接口 小强ros开发平台
  • freeRTOS滴答时钟相关源码分析

    最近学习白问网韦东山老师在B站开源的freeRTOS课程 xff0c 网址 xff1a 韦东山直播公开课 xff1a RTOS实战项目之实现多任务系统 第1节 xff1a 裸机程序框架和缺陷 哔哩哔哩 bilibili和7天物联网训练营 第