微型操作系统内核源码详解系列五(1):arm cortex m3架构

2024-06-15 19:28

本文主要是介绍微型操作系统内核源码详解系列五(1):arm cortex m3架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 系列一:微型操作系统内核源码详解系列一:rtos内核源码概论篇(以freertos为例)-CSDN博客

系列二:微型操作系统内核源码详解系列二:数据结构和对象篇(以freertos为例)-CSDN博客

系列三:微型操作系统内核源码详解系列三(0):空间存储及内存管理篇(前置篇)-CSDN博客

                微型操作系统内核源码详解系列三(1):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(2):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(3):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(4):arm架构篇-CSDN博客

                微型操作系统内核源码详解系列三(5):进程与线程-CSDN博客

系列四:

 ​​​​​微型操作系统内核源码详解系列四(1):操作系统调度算法(linux0.11版本内核)-CSDN博客

微型操作系统内核源码详解系列四(2):操作系统调度算法(rt-thread内核)-CSDN博客

微型操作系统内核源码详解系列四(3):操作系统调度算法(FreeRTOS内核篇上)-CSDN博客

微型操作系统内核源码详解系列四(4):操作系统调度算法(FreeRTOS内核篇下)-CSDN博客

系列五:

微型操作系统内核源码详解系列五(1):arm cortex m3架构-CSDN博客

本系列笔者又回到了FreeRTOS内核源码的讲解,这是笔者在之前的博客中讲解的函数源码,

读者可以参考该图回忆笔者的讲解流程:

        截至到目前为止,笔者已经讲完了入口函数xTaskCreat函数,具体参考上图,接下来准备从pxPortinitialiseStack函数入手,正式过渡到对arm cortex m3架构的讲解。

        通过前面的12篇博客,笔者对FreeRTOS的内核进行了抽象,讲述了FreeRTOS内核源码是如何构成一个调度器的,相信读者已经对rtos的执行过程有了清晰的概念,既然核心思想已经阐述完整,那么让我们顺着主干部分一步步构建FreeRTOS内核。

        理论上,在掌握FreeRTOS内核的调度框架后,读者其实可以自己尝试写一个rtos了,并不是要写一个完整能执行的FreeRTOS,而是根据笔者在前面十余篇博客提供的基础,把对应的内核框架写出来,把各种行为用面向对象的思想进行抽象,定义对应函数,每个函数对应的功能都需要读者进行仔细思考和分配,将调度器的行为具体到每一个函数中。在这之后,读者可以参考FreeRTOS源码,一步步补充自己编写的框架的细节。

        例如,读者可以先从简单切换任务出发,不断修改切换函数,比如定义两个任务,开始是不引入优先级,task_switch函数是直接切换到另一个任务,那么读者只要完成以下工作即可:链表对象的实现,内存管理,任务定义,task_switch换成另一个任务,systick和PendSV中断完成任务切换。这些东西笔者其实已经讲得大差不差了,由于systick和PendSV中断与计算机架构密切相关,模式相对固定,直接参考FreeRTOS内核即可。如此一来,其实一个os内核已经实现了,算下来绝对不会超过一千行代码,两个星期就可以完成,如果读者想深入理解实时操作系统内核,可以进行尝试。

        本系列笔者将会回到arm架构中断部分的源码,带领读者一步步揭开任务切换神秘的面纱,这几篇博客的重点是arm cortex m3架构,FreeRTOS源码中的systick中断和PendSV中断函数是我们理解官方手册的入口。只有通过官方手册,我们对arm架构的上下文切换技术的理解才会深刻。

        笔者在前面的博客讲过一点sysytick中断和PendSV中断在arm架构中是如何完成任务切换的,让我们看看arm cortex m3官方手册:

        这就是本系列博客要探讨的重点,笔者将会结合FreeRTOS内核源码来理解官方手册。

        不过在此之前,让笔者先讲一讲pxPortinitialiseStack函数,这是一个初始化任务栈的函数,这个函数的理论依据可以参考arm cortex m3官方手册对os堆栈初始化的介绍:

        接下来笔者准备结合arm cortex m3官方手册讲解pxPortinitialiseStack函数,以便于方便读者理解arm架构中栈是如何加载到cpu寄存器的,从而理解系统上下文切换函数的源码。

这篇关于微型操作系统内核源码详解系列五(1):arm cortex m3架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064355

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input