freertos 源码分析五 任务调度一

vTaskStartScheduler
创建空闲进程, 调用适配xPortStartScheduler();

void vTaskStartScheduler( void )
{xReturn = xTaskCreate( prvIdleTask,configIDLE_TASK_NAME,configMINIMAL_STACK_SIZE,( void * ) NULL,portPRIVILEGE_BIT,&xIdleTaskHandle );if( xReturn == pdPASS ){portDISABLE_INTERRUPTS();xNextTaskUnblockTime = portMAX_DELAY;xSchedulerRunning = pdTRUE;xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;xPortStartScheduler();}else{configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY );}
}

stm32,适配不同有差异

设置挂起中断和系统定时中断优先级,设置定时中断

BaseType_t xPortStartScheduler( void )                                                                                                             
{portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;   //pendsv 优先级portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;  // systick 优先级vPortSetupTimerInterrupt();uxCriticalNesting = 0;prvPortStartFirstTask();vTaskSwitchContext();prvTaskExitError();return 0;
}

设置系统定时中断

__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void )                                                                                    
{portNVIC_SYSTICK_CTRL_REG = 0UL;portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
}

portNVIC_SYSTICK_LOAD_REG 系统定时计数器重载时间
portNVIC_SYSTICK_CTRL_REG

[2]CLKSOURCE 1 = core clock.
[1]TICKINT 1 = counting down to 0 pends the SysTick handler.
[0]ENABLE 1

prvPortStartFirstTask,调用svc中断

static void prvPortStartFirstTask( void )                                                                                                          
{__asm volatile (" ldr r0, =0xE000ED08   \n"  " ldr r0, [r0]          \n"                //中断向量表偏移" ldr r0, [r0]          \n"				// 取出中断向量表第一个数据 即栈顶指针" msr msp, r0           \n"			//设置msp指向栈顶" cpsie i               \n"					// 开中断" cpsie f               \n"					//开异常" dsb                   \n"					//数据同步屏障" isb                   \n"						//清空流水线" svc 0                 \n"					//svc中断" nop                   \n"" .ltorg                \n"   			// 数据缓冲池);
}

恢复任务context

void vPortSVCHandler( void )
{__asm volatile ("   ldr r3, pxCurrentTCBConst2      \n"     //当前任务块"   ldr r1, [r3]                    \n"							"   ldr r0, [r1]                    \n"						 //第一个数据为任务块栈顶指针"   ldmia r0!, {r4-r11}             \n" 			 	// 恢复r4-r11"   msr psp, r0                     \n"					//恢复栈"   isb                             \n"                              //清空流水线                                                                      "   mov r0, #0                      \n"					"   msr basepri, r0                 \n""   orr r14, #0xd                   \n""   bx r14                          \n"					//从中断返回"                                   \n""   .align 4                        \n""pxCurrentTCBConst2: .word pxCurrentTCB             \n");
}

就绪链表查找最高优先级,赋值给当前任务

void vTaskSwitchContext( void )
{if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ){xYieldPending = pdTRUE;}else{xYieldPending = pdFALSE;taskSELECT_HIGHEST_PRIORITY_TASK();}
}
#define taskSELECT_HIGHEST_PRIORITY_TASK()                                \
{                                                                         \UBaseType_t uxTopPriority = uxTopReadyPriority;                       \\\while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \{                                                                     \configASSERT( uxTopPriority );                                    \--uxTopPriority;                                                  \}                                                                     \\\listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \uxTopReadyPriority = uxTopPriority;                                                   \
}

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

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

相关文章

C++之std::tuple(一) : 使用精讲(全)

相关系列文章 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二):深入剖析 深入理解可变参数(va_list、std::initializer_list和可变参数模版) std::apply源码分析 目录 1.简介 2.std::ignore介绍 3.创建元组 3.1.…

什么是元数据、IDC

元数据(metadata)是描述对象的数据,对对象的属性、操作及联系的描述性信息。现实世界的一本书可以当作是一个对象,而描述这本书的信息,比如书名、作者、出版时间、页数、分类等等都是对象的属性。书可以看,…

C语言中的内存函数你知道多少呢?

目录 ​编辑 1. memcpy的使用和模拟实现 1.1函数介绍 ​编辑 1.2函数的使用 1.3模拟实现 2. memmove的使用和模拟实现 2.1函数介绍 2.2函数的使用 2.3模拟实现 3. memset函数的使用 3.1函数介绍 3.2函数的使用 ​编辑 4. memcmp函数的使用 4.1函数介绍 4.2函数…

debian12 - openssh-9.6.P1的编译安装

文章目录 debian12 - openssh-9.6.P1的编译安装概述笔记备注END debian12 - openssh-9.6.P1的编译安装 概述 在debian12上, 源码编译安装了openssl3.2 导致ssh失败. lostspeeddebian12d4x64:~$ openssl version OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2…

HCIA-HarmonyOS设备开发认证V2.0-3.轻量系统内核基础

目录 一、前言二、LiteOS-M系统概述三、内核框架3.1、CMSIS 和 POSIX 整体架构3.2、LiteOS-M内核启动流程 四、内核基础4.1、任务管理4.2、时间管理(待续)4.3、中断管理(待续)4.4、软件定时器(待续) 五、内存管理5.1、静态内存(待续)5.2、动态内存(待续) 六、内核通信机制6.1、…

从差旅申请到易快报,企业如何通过聚道云实现流程自动化?

客户介绍 深圳某有限公司是一家专注于软件开发与解决方案。公司主要提供全面的技术支持和服务,涵盖了多个领域,包括但不限于教育、企业级服务、工具类软件等。该公司产品旨在为每一所学校、每一个学生及家庭提供简单高效的编程创作体验和专业服务&#…

Linux内核与驱动面试经典“小”问题集锦(4)

接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(3) 问题5 问:Linux内核中内存分配都有哪些方式?它们之间的使用场景都是什么? 备注:这个问题是笔者近期参加蔚来面试时遇到的一个问题。这…

React+Antd实现省、市区级联下拉多选组件(支持只选省不选市)

1、效果 是你要的效果,咱们继续往下看,搜索面板实现省市区下拉,原本有antd的Cascader组件,但是级联组件必须选到子节点,不能只选省,满足不了页面的需求 2、环境准备 1、react18 2、antd 4 3、功能实现 …

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏14(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言给树添加动画摇晃动画 效果(后补效果)源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&…

春节回家坐飞机后助听器就不好用了?如何过安检、拖运?

春节即将来临,很多人都要乘坐飞机回家或者出游。如果你是一位助听器使用者,你可能会有一些疑问:坐飞机能戴助听器吗?助听器会不会受到安检设备的影响?直接将助听器放在传送带上可以吗?……别担心&#xff0…

RPA技术介绍

RPA(Robotic Process Automation)技术是近年来快速发展的一种自动化工具,它允许软件机器人(或“机器人”)模拟人类用户的交互行为,在各种数字系统和软件应用中执行任务。RPA的目的是通过自动化那些重复性高…

RabbitMQ-5.消费者的可靠性

消费者的可靠性 5.消费者的可靠性5.1.消费者确认机制5.2.失败重试机制5.3.失败处理策略5.4.业务幂等性5.4.1.唯一消息ID5.4.2.业务判断 5.5.兜底方案 5.消费者的可靠性 当RabbitMQ向消费者投递消息以后,需要知道消费者的处理状态如何。因为消息投递给消费者并不代表…

U盘显示空间小于实际U盘空间的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

2024年【陕西省安全员C证】试题及解析及陕西省安全员C证复审考试

题库来源:安全生产模拟考试一点通公众号小程序 陕西省安全员C证试题及解析是安全生产模拟考试一点通总题库中生成的一套陕西省安全员C证复审考试,安全生产模拟考试一点通上陕西省安全员C证作业手机同步练习。2024年【陕西省安全员C证】试题及解析及陕西…

rtt设备驱动框架面向对象学习-i2c总线

本来想着i2c和spi是一样的,标题都想抄袭成《rtt设备驱动框架学习-i2c总线和设备》,然后看过源码发现,i2c没有分开总线和设备,我想着正常它和spi一样有总线和设备,设备存在竞争。估计是因为i2c设备可以通过i2c地址区分&…

Java玩转《啊哈算法》解密回文之栈

菩萨清凉月,常游毕竟空,众生心垢净,菩提影现中。 这目录 这开头这代码地址栈案例代码优化建议类似扩展 这开头 各位女士们,先生们好!本人最近在看《啊哈算法》,这本书写的确实还可以,很有趣味性…

IEC 104电力规约详细解读(三) - 遥信

1.功能简述 遥信,、即状态量,是为了将断路器、隔离开关、中央信号等位置信号上送到监控后台的信息。遥信信息包括:反应电网运行拓扑方式的位置信息。如断路器状态、隔离开关状态;反应一次二次设备工作状况的运行信息,如…

containerd中文翻译系列(九)主机

注册表配置 - 简介 containerd v1.5 为 ctr 客户端(用于管理员/开发人员的 containerd 工具)、containerd 镜像服务客户端和 CRI 客户端如kubectl和 crictl,提供了新的额外注册表主机配置支持。 为这些客户端配置注册表的方法是&#xff0c…

Leetcode刷题-(11~15)-Java+Python+JavaScript

算法是程序员的基本功,也是各个大厂必考察的重点,让我们一起坚持写算法题吧 遇事不决,可问春风,春风不语,即是本心。 我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可…

jvm内存分区的变化

随着 JDK 版本的变化,JVM 内存分区方面有一些变化和调整。以下是主要的一些变化: JDK 8 之前: 在 JDK 8 之前,HotSpot 虚拟机主要使用的是永久代(Permanent Generation)和堆内存(Heap Memory&…