freeRTOS滴答时钟相关源码分析
最近学习白问网韦东山老师在B站开源的freeRTOS课程,网址:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili和7天物联网训练营【第2期】7天物联网智能家居实战训练营
在学习过程中按照韦老师的方法分析了下freeRTOS源码,如果有不对的地方请指证。
freeRTOS滴答时钟相关源码分析,基于cubemx生成的freeRTOS工程
xPortStartScheduler vPortSetupTimerInterruptvoid vPortSetupTimerInterrupt( void ){/* 1、操作系统,是针对寄存器操作---效率高2、首先赋值装载寄存器值 = (CPU频率/配置周期)-12.1、HAL_RCC_ClockConfig() cpu频率实在硬件启动时,就已经获取了2.2、configTICK_RATE_HZ = 1000 是由cubemx配置而得3、配置控制寄存器3.1、开启时钟源3.2、使能中断3.3、使能systick4、可以参考,M4权威指南 9.5章节----systick定时器5、configTICK_RATE_HZ5.1、建议不要小于1ms5.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 );}xPortSysTickHandlerxTaskIncrementTickvoid 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 tickcount 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 thescheduler 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;
}
freeRTOS滴答时钟相关源码分析相关推荐
- 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )
文章目录 一.回调 StateChangedListener 接口 二.JobHandler 处理 ( 任务检查 ) 三.maybeRunPendingJobsH 方法 四.assignJobsToC ...
- Ansroid系统(262)---MTK安卓sim卡相关源码分析
MTK安卓sim卡相关源码分析 原文地址:http://m.blog.csdn.net/article/details?id=50039589 最近由于一个sim卡相关的需求,就去了解了一下Andro ...
- kafka-分区重分配及相关源码分析
tips:本文源码对应的kafka版本是2.3.1,源码分支2.3 分区重分配及相关源码分析 简单示例 kafka消费者分区重分配 消费者分区重分配简介 分区重分配的策略 RangeAssignor ...
- 计算机毕业设计Java滴答拍摄影项目(源码+系统+mysql数据库+lw文档)
计算机毕业设计Java滴答拍摄影项目(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java滴答拍摄影项目(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构:B/S架构 开 ...
- 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...
- 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )
文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...
- 详述 Spring MVC 启动流程及相关源码分析
文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...
- Vue中的methods配置项中的箭头函数this指向及相关源码分析
之前在使用Vue时遇到一个问题,我们知道在Vue的methods中定义函数时,要想使用到Vue实例或者组件实例的this时,我们就不能使用箭头函数定义方法,因为箭头函数中的this是在函数定义时生成的 ...
- ThreadPoolExecutor的应用和实现分析(中)—— 任务处理相关源码分析 线程利用(转)...
前面一篇文章从Executors中的工厂方法入手,已经对ThreadPoolExecutor的构造和使用做了一些整理.而这篇文章,我们将接着前面的介绍,从源码实现上对ThreadPoolExecuto ...
最新文章
- low逼三人组、nb二人组、归并、希尔排序----小结
- 【Verilog HDL 训练】第 04 天(竞争、冒险、译码等)
- 跳表(skipList)
- centos安装mysql 简书_在centos上安装mysql
- rails 两表关联查询_Rails中的单表继承与多态关联:找到适合您的方法
- 三年级计算机教案 渔舟唱晚,《渔舟唱晚》大班教案
- OpenCV-闭运算(CLOSE)
- MFC学习心得第一篇
- [软件更新]卡巴斯基全功能安全软件2010简体中文版程序发布
- idea设置Maven本地仓库
- Jlink下使用swd
- Windows 2008 Server R2 桌面体验
- 安装infinity后主页始终显示百度页面?
- Pycharm中c、m、F、f、v、p分别代表什么含义
- php表格中的caption,html中caption标签的使用方法及实例详解
- 下载MySQL并创建桌面数据库_桌面数据库下载_桌面数据库软件最新版下载 - 全方位下载手机版...
- [AH2017/HNOI2017]抛硬币
- HTML学习2之常用标签详细介绍
- Error: Cannot find module ‘process-nextick-args‘,error:0308010C:digital envelope routines::unsupport
- Vue+Electron学习系列 (三) -- 自动更新
热门文章
- 【JZOJ B组】艰难的选择
- Linux scp 后台运行传输文件
- 手机显示网关服务器未开,小森生活无可用网关服务器怎么回事?无可用网关服务器解决方法[多图]...
- Harbor仓库搭建及简单使用
- 华为云服务-微服务部署后的WEB服务日常如何运维
- 齐鲁鸿蒙是什么梗,对不起了,安卓!魅族:你好,鸿蒙!
- php 发送邮箱(添加附件)
- 语音输入php,html5在输入框添加语音输入功能
- Cannot read property 'getElementsByTagName' of null解决办法
- SAT阅读应对方法及相关要求