2024年最新嵌入式实时操作系统10——系统时钟节拍_xtaskincrementtick,深入理解物联网嵌入式动画原理

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

时钟节拍越高,意味着时钟中断越频繁,处理器需要花时间执行中断程序,如果时钟节拍大到一定程度比如1MHz,此时处理器将会一直周期性的执行时钟中断程序,而用户程序将几乎得不到执行。
在这里插入图片描述

2.系统时钟节拍服务实现

系统时钟节拍的实现依靠以下两个部分:

1、硬件定时器
2、系统时钟节拍服务

硬件定时器用于产生中断,配置硬件定时器产生一个频率为10~1000Hz之间的中断,硬件定时器周期性触发中断,当定时器中断发生时处理执行定时器中断程序。

系统时钟节拍服务用于执行系统时间管理相关操作,系统时钟节拍服务被定时器中断程序调用。系统时钟节拍服务完成了以下操作:
1、更新系统节拍时间。
2、更新等待表和就绪表。
3、处理时间片轮询。
4、切换任务。

请添加图片描述
更新系统节拍时间
每次定时器中断调用系统时钟节拍服务时,完成系统节拍时间更新,将系统节拍时间计数值加1,通常情况下系统节拍时间计数值为一个32位的变量,时间计数值自加时需要考虑值溢出情况。

更新等待表和就绪表
每次进入系统时钟节拍服务更新系统节拍时间后,操作系统内核检查等待表是否有任务完成等待,如果有任务完成等待,操作系统内核会将任务从等待表中移除,并将该任务添加到就绪表中,完成更新等待表和就绪表。

处理时间片轮询
每次进入系统时钟节拍服务,操作系统内核会对当前运行优先级中多个任务进行时间片轮询操作。

切换任务
每次进入系统时钟节拍服务等待表和就绪表更新后,若有更高优先级任务就绪,操作系统内核将启动任务切换。

3.FreeRTOS系统时钟节拍实现

分析对象为:cortex-m4硬件平台,FreeRTOS操作系统。
系统时钟节拍实现依靠cortex-m4中的SysTick硬件定时器产生时钟中断,时钟中断服务为:

SysTick_Handler

FreeRTOS操作系统中的系统时钟节拍服务为

xTaskIncrementTick

SysTick定时器配置成1ms中断,配置函数实现如下:

/\*配置定时器 1ms中断 \*/
HAL\_SYSTICK\_Config(HAL\_RCC\_GetHCLKFreq()/8000);
HAL\_SYSTICK\_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);

定时器中断程序SysTick_Handler实现如下:

#define xPortSysTickHandler SysTick\_Handler
	void xPortSysTickHandler( void )
	{
		/\* 屏蔽相关中断 \*/
		vPortRaiseBASEPRI();
		{
			/\* 调用系统时钟节拍服务 \*/
			if( xTaskIncrementTick() != pdFALSE )
			{
				/\* 如果由高任务就绪,切换任务\*/
				portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
			}
		}
		/\* 开启相关中断 \*/
		vPortClearBASEPRIFromISR();
	}

xTaskIncrementTick为系统时钟节拍服务,完成更新系统节拍时间,更新等待表和就绪表,处理时间片轮询,切换任务,代码实现如下:

BaseType_t xTaskIncrementTick( void )
{
	TCB_t \* pxTCB;
	TickType_t xItemValue;
	BaseType_t xSwitchRequired = pdFALSE;

	traceTASK\_INCREMENT\_TICK( xTickCount );
	/\* 调度器是否打开 \*/
	if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
	{
		/\* 系统节拍计数器xTickCount 镜像 \*/
		const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
		/\* 系统节拍计数器xTickCount 加1\*/
		xTickCount = xConstTickCount;
		/\* 系统节拍计数器xTickCount 是否溢出\*/
		if( xConstTickCount == ( TickType_t ) 0U ) 
		{
			taskSWITCH\_DELAYED\_LISTS();
		}
		else
		{
			mtCOVERAGE\_TEST\_MARKER();
		}

		if( xConstTickCount >= xNextTaskUnblockTime )
		{
			
			for( ;; )/\* 将完成延时等待的相关任务移除等待表 \*/
			{
				/\* 等待表是否为空\*/
				if( listLIST\_IS\_EMPTY( pxDelayedTaskList ) != pdFALSE )
				{
					/\* 等待表为空 则将xNextTaskUnblockTime赋值成最大值 \*/
					xNextTaskUnblockTime = portMAX_DELAY; 
					break;
				}
				else/\* 等待表不为空\*/
				{					
					/\*读取等待表中的第一个任务对象
 等待表队列时按照等待时间大小进行排序,等待表队列的第一个对象就是最小等待时间对象 \*/
					pxTCB = listGET\_OWNER\_OF\_HEAD\_ENTRY( pxDelayedTaskList );
					/\* 读取任务的延时完成时间 \*/
					xItemValue = listGET\_LIST\_ITEM\_VALUE( &( pxTCB->xStateListItem ) );
					/\* 比较延时完成时间和当前时间 \*/
					if( xConstTickCount < xItemValue )
					{
						/\* 比较延时完成时间未到 退出for循环 \*/
						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 )
					{
						/\* 如果等待中的任务的优先级高于当前任务
 触发任务切换\*/
						if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
						{


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/bc7294ff3f9446d89b6902ac10958585.png)
![img](https://img-blog.csdnimg.cn/img_convert/a88c410a9e7c478174a2b31f91baafd5.png)

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

.(img-DuUDwzb2-1715645380507)]

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值