freertos 源码分析六 任务调度二

任务调度由SysTick_Handler和 PendSV_Handler两个中断接管
系统时钟计数器按给定频率倒计时,至0触发SysTick_Handler中断,此中断函数为宏中对xPortSysTickHandler的重命名。
增加计数,置位可挂起中断。

void xPortSysTickHandler( void )
{portDISABLE_INTERRUPTS();{if( xTaskIncrementTick() != pdFALSE ){portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;}}portENABLE_INTERRUPTS();
}

xTaskIncrementTick 以设定频率增加计数,处理延时任务。

BaseType_t xTaskIncrementTick( void )
{TCB_t * pxTCB;                                                                                                                                 TickType_t xItemValue;BaseType_t xSwitchRequired = pdFALSE;if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ){const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;xTickCount = xConstTickCount;if( xConstTickCount == ( TickType_t ) 0U ){taskSWITCH_DELAYED_LISTS();  //计数溢出 交换延时链表与溢出链表}if( xConstTickCount >= xNextTaskUnblockTime )   //处理延时链表{for( ; ; ){if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )  //空{xNextTaskUnblockTime = portMAX_DELAY;break;}else  //非空{pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );if( xConstTickCount < xItemValue ){                                                                                                                              xNextTaskUnblockTime = xItemValue;break;}listREMOVE_ITEM( &( pxTCB->xStateListItem ) );  //延时已过if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ){listREMOVE_ITEM( &( pxTCB->xEventListItem ) );}prvAddTaskToReadyList( pxTCB );  //添至就绪链表#if ( configUSE_PREEMPTION == 1 ){if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ){xSwitchRequired = pdTRUE;  //优先级大于现运行任务需切换}}#endif}}}#if ( configUSE_PREEMPTION == 1 ){if( xYieldPending != pdFALSE ){xSwitchRequired = pdTRUE;}}#endif}else{++xPendedTicks;  // 增加计数}return xSwitchRequired;
}

listLIST_IS_EMPTY宏定义

#define listLIST_IS_EMPTY( pxList )   ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) 

可挂起中断,此中断函数在宏中重命名为PendSV_Handler。系统时钟中断中对其置位,以低优先级运行,无高于其优先级时会调入对任务进行切换。

void xPortPendSVHandler( void )
{__asm volatile("   mrs r0, psp                         \n""   isb                                 \n""   ldr r3, pxCurrentTCBConst           \n" //当前运行任务"   ldr r2, [r3]                        \n" "   stmdb r0!, {r4-r11}                 \n"  //保存r4-r11 psp"   str r0, [r2]                        \n"  //保存当前栈顶pxTopOfStack "   stmdb sp!, {r3, r14}                \n"  //保存r3 r14至msp"   mov r0, %0                          \n"  // 优先级"   msr basepri, r0                     \n"  "   bl vTaskSwitchContext               \n" // 在就绪链表寻找最高优先级设为当前切换任务"   mov r0, #0                          \n""   msr basepri, r0                     \n""   ldmia sp!, {r3, r14}                \n"  // 恢复 r3 lr"   ldr r1, [r3]                        \n"  //当前TCB指针 TCB已切换"   ldr r0, [r1]                        \n"  //当前TCB栈顶pxTopOfStack"   ldmia r0!, {r4-r11}                 \n"  //从TCB栈恢复 r4-r11 变动后指向任务参数"   msr psp, r0                         \n"  //psp栈指向tcb栈 "   isb                                 \n"  // "   bx r14                              \n"  // 中断返回从PSP栈恢复寄存器值,任务回调函数指针载入PC,完成任务切换。"                                       \n""   .align 4                            \n""pxCurrentTCBConst: .word pxCurrentTCB  \n"::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ));
}

参考创建任务时,任务堆栈设置

StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,TaskFunction_t pxCode,void * pvParameters )
{pxTopOfStack--;                                                      *pxTopOfStack = portINITIAL_XPSR;   //thumb                                 pxTopOfStack--;*pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; //task回调函数指针pxTopOfStack--;*pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS;             /* LR */pxTopOfStack -= 5;                                                   /* R12, R3, R2 and R1. */*pxTopOfStack = ( StackType_t ) pvParameters;                        /* R0 */pxTopOfStack -= 8;                                                   /* R11, R10, R9, R8, R7, R6, R5 and R4. */return pxTopOfStack;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过dockerfile 生成自定义nginx镜像

通过dockerfile生成自定义nginx镜像 &#xff01;&#xff01;&#xff01;docker 必须在linux环境下才能进行如果你是window则需要装虚拟机 新建一个文件名字为Dockerfile&#xff0c;无需后缀 文件完整名就是Dockerfile 编写dockerfile FROM nginx RUN echo hello nginx!…

Ubuntu Linux使用PL2302串口和minicom进行开发板调试

调试远程的服务器上面的BMC&#xff0c;服务器上面安装了Ubuntu&#xff0c;想着可以在服务器接个串口到BMC&#xff0c;然后SSH到服务器的Ubuntu&#xff0c;用minicom来查看串口信息。 准备&#xff1a; 服务器Ubuntu安装mimicom 本机可以ssh到Ubuntu 串口工具PL2302 或者CH3…

【数据分享】1929-2023年全球站点的逐年平均降水量(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全…

全局唯一id生成器 各种实现记录

全局唯一id生成器 Redis 生成 前提知识~~ 时间戳 时间戳这个东西我们老是听到,却可能不是特别了解 首先,时间戳是从1970年1月1号0点0分开始的秒数,我查了蛮多资料,理论上来说,时间戳是没有上限的,而我们一般用位数来限制这里的上限,比如32位 我们来实际计算一下 32位的二进…

巴尔加瓦算法图解:算法运用。

树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个节点&#xff0c;左子节点的值都比它小&#xff0c;…

MySQL用心总结

大家好&#xff0c;好久不见&#xff0c;今天笔者用心一步步写一份mysql的基础操作指南&#xff0c;欢迎各位点赞收藏 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath mysqld_bin_path(注意&#xff1a;等号与值之间有空格) mysql -h 地址 -…

Android Studio安装过程遇到SDK无法安装问题解决

首次打开studio遇到该类问题&#xff0c;需要下载SDK文件&#xff0c;后又发现SDK由于是Google源&#xff0c;无法进行正常安装&#xff0c;故转而进行SDK的镜像安装。 一、下载SDK Tools 地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio…

华为配置访客接入WLAN网络示例(MAC优先的Portal认证)

配置访客接入WLAN网络示例&#xff08;MAC优先的Portal认证&#xff09; 组网图形 图1 配置WLAN MAC优先的Portal认证示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 某企业为了提高WLAN网络的安全性&#xff0c;采用MAC优先的外置Portal认…

新型RedAlert勒索病毒针对VMWare ESXi服务器

前言 RedAlert勒索病毒又称为N13V勒索病毒&#xff0c;是一款2022年新型的勒索病毒&#xff0c;最早于2022年7月被首次曝光&#xff0c;主要针对Windows和Linux VMWare ESXi服务器进行加密攻击&#xff0c;到目前为止该勒索病毒黑客组织在其暗网网站上公布了一名受害者&#x…

pyspark 在 pycharm本地执行demo

pyspark本地运行:环境变量确保有 SPAKR_HOME启动hadoop 否则报错 localhost:9000 端口被拒绝不需要启动本地spark from pyspark.sql import SparkSession from pyspark.sql import Row from datetime import datetime, datespark SparkSession.builder.getOrCreate() df spar…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-任务管理

目录 一、任务管理1.1、任务状态1.2、任务基本概念1.3、任务管理使用说明1.4、任务开发流程1.5、任务管理接口 一、任务管理 从系统角度看&#xff0c;任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。 O…

C语言操作符详解

操作符的分类 • 算数操作符 &#xff1a; 、 - 、 * 、 / 、 % • 移位操作符 &#xff1a; << 、 >> • 位操作符 &#xff1a; & 、 | 、 ^ • 赋值操作符 &#xff1a; 、 、 - 、 * 、 / 、 % 、 << 、 >> 、 & 、 |…

音视频色彩:RGB/YUV

目录 1.RGB 1.1介绍 1.2分类 1.2.1RGB16 1)RGB565 2)RGB555 1.2.2RGB24 1.2.3RGB222 2.YUV 2.1介绍 2.2分类 2.2.1 YUV444 2.2.2 YUV 422 2.2.3 YUV 420 2.3存储格式 2.3.1 YUYV 2.3.2 UYVY 2.3.3 YUV 422P 2.3.4 YUV420P/YUV420SP 2.3.5 YU12 和…

IS-IS 接口认证密码平滑更换

拓扑图 配置 AR1、AR2建立ISIS level-2邻居关系&#xff0c;并配置接口认证密码为huawei sysname AR1 # isis 1is-level level-2network-entity 49.0000.0000.0000.0001.00 # interface GigabitEthernet0/0/0ip address 12.1.1.1 255.255.255.0 isis enable 1isis authentica…

Spark安装(Yarn模式)

一、解压 链接&#xff1a;https://pan.baidu.com/s/1O8u1SEuLOQv2Yietea_Uxg 提取码&#xff1a;mb4h tar -zxvf /opt/software/spark-3.0.3-bin-hadoop3.2.tgz -C /opt/module/spark-yarn mv spark-3.0.3-bin-hadoop3.2/ spark-yarn 二、配置环境变量 vim /etc/profile…

【typescript】特殊符号用法(?:)(??)(?.)(!)(!!)

一. 问号冒号&#xff08;?:&#xff09; 1.可以作为对象类型的可选属性&#xff0c;如&#xff1a; interface Person{name : string;age?: number; }const person1 : Person {name:"zien"} const person2 : Person {name:"sad", age:18} console.l…

MacBook有必要装清理软件吗?CleanMyMac的一些主要特点

MacBook是苹果公司的一款高端笔记本电脑&#xff0c;但是&#xff0c;随着使用时间的增长&#xff0c;MacBook也会出现一些问题&#xff0c;比如运行缓慢、卡顿、垃圾文件堆积、磁盘空间不足等。这些问题不仅影响了用户的使用体验&#xff0c;也可能对MacBook的寿命和安全性造成…

装饰者设计模式总结

现有问题&#xff1a; 如何动态的增加功能&#xff0c;即对原有功能进行增强。 方案1&#xff1a; 利用Java的继承方式来实现&#xff0c;但若继承层次过深或者增加功能过多&#xff0c;会导致继承爆炸&#xff0c;扩展性低&#xff0c;后续也很难维护&#xff0c;本质上属于继…

感觉 sheet.setDefaultColumnStyle 存在 bug

场景是已经有模板&#xff0c;有表头&#xff0c;获取模板后还需要动态增加一些表头&#xff0c;在使用 org.apache.poi 的包导出 excel 的时候&#xff0c;我用了 sheet.setDefaultColumnStyle 来设置动态表头整列的格式为文本&#xff0c;这个也是参考了网上的很多办法&#…

如何将国风与品牌信息相结合?

随着人们消费观念的转型升级。「国风」成为深受品牌欢迎的营销元素&#xff0c;它能够通过东方美学引起用户。然而有许多品牌在国风营销中稍不注意就会踩雷&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;国风营销怎么做才能吸引用户。 一、 与用户生活结合 要找到传统文…