最近学习白问网韦东山老师在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滴答时钟相关源码分析相关推荐

  1. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )

    文章目录 一.回调 StateChangedListener 接口 二.JobHandler 处理 ( 任务检查 ) 三.maybeRunPendingJobsH 方法 四.assignJobsToC ...

  2. Ansroid系统(262)---MTK安卓sim卡相关源码分析

    MTK安卓sim卡相关源码分析 原文地址:http://m.blog.csdn.net/article/details?id=50039589 最近由于一个sim卡相关的需求,就去了解了一下Andro ...

  3. kafka-分区重分配及相关源码分析

    tips:本文源码对应的kafka版本是2.3.1,源码分支2.3 分区重分配及相关源码分析 简单示例 kafka消费者分区重分配 消费者分区重分配简介 分区重分配的策略 RangeAssignor ...

  4. 计算机毕业设计Java滴答拍摄影项目(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java滴答拍摄影项目(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java滴答拍摄影项目(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构:B/S架构 开 ...

  5. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )

    文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...

  6. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )

    文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...

  7. 详述 Spring MVC 启动流程及相关源码分析

    文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...

  8. Vue中的methods配置项中的箭头函数this指向及相关源码分析

    之前在使用Vue时遇到一个问题,我们知道在Vue的methods中定义函数时,要想使用到Vue实例或者组件实例的this时,我们就不能使用箭头函数定义方法,因为箭头函数中的this是在函数定义时生成的 ...

  9. ThreadPoolExecutor的应用和实现分析(中)—— 任务处理相关源码分析 线程利用(转)...

    前面一篇文章从Executors中的工厂方法入手,已经对ThreadPoolExecutor的构造和使用做了一些整理.而这篇文章,我们将接着前面的介绍,从源码实现上对ThreadPoolExecuto ...

最新文章

  1. low逼三人组、nb二人组、归并、希尔排序----小结
  2. 【Verilog HDL 训练】第 04 天(竞争、冒险、译码等)
  3. 跳表(skipList)
  4. centos安装mysql 简书_在centos上安装mysql
  5. rails 两表关联查询_Rails中的单表继承与多态关联:找到适合您的方法
  6. 三年级计算机教案 渔舟唱晚,《渔舟唱晚》大班教案
  7. OpenCV-闭运算(CLOSE)
  8. MFC学习心得第一篇
  9. [软件更新]卡巴斯基全功能安全软件2010简体中文版程序发布
  10. idea设置Maven本地仓库
  11. Jlink下使用swd
  12. Windows 2008 Server R2 桌面体验
  13. 安装infinity后主页始终显示百度页面?
  14. Pycharm中c、m、F、f、v、p分别代表什么含义
  15. php表格中的caption,html中caption标签的使用方法及实例详解
  16. 下载MySQL并创建桌面数据库_桌面数据库下载_桌面数据库软件最新版下载 - 全方位下载手机版...
  17. [AH2017/HNOI2017]抛硬币
  18. HTML学习2之常用标签详细介绍
  19. Error: Cannot find module ‘process-nextick-args‘,error:0308010C:digital envelope routines::unsupport
  20. Vue+Electron学习系列 (三) -- 自动更新

热门文章

  1. 【JZOJ B组】艰难的选择
  2. Linux scp 后台运行传输文件
  3. 手机显示网关服务器未开,小森生活无可用网关服务器怎么回事?无可用网关服务器解决方法[多图]...
  4. Harbor仓库搭建及简单使用
  5. 华为云服务-微服务部署后的WEB服务日常如何运维
  6. 齐鲁鸿蒙是什么梗,对不起了,安卓!魅族:你好,鸿蒙!
  7. php 发送邮箱(添加附件)
  8. 语音输入php,html5在输入框添加语音输入功能
  9. Cannot read property 'getElementsByTagName' of null解决办法
  10. SAT阅读应对方法及相关要求