可以建设网站,沈阳互联网公司排名,做个网站费用多少,河北邯郸做移动网站前言
通过前几章的学习#xff0c;我们学会了如何为RTOS设计一个合理的内存管理算法。现在#xff0c;是时候学习设计RTOS内核了。 关于RTOS内核的文章也有很多#xff0c;但都有一点先射箭再化靶子的意味。要么是代码连篇解释却寥寥无几#xff0c;要么是要先怎么样再怎么…前言
通过前几章的学习我们学会了如何为RTOS设计一个合理的内存管理算法。现在是时候学习设计RTOS内核了。 关于RTOS内核的文章也有很多但都有一点先射箭再化靶子的意味。要么是代码连篇解释却寥寥无几要么是要先怎么样再怎么样的说教式教程。并不是说这样的教程不好而是他们缺乏读者普遍需要的东西也就是更关键的思想方法
为此笔者决定从我们的需求与应用出发通过从结果思考过程的方式使用面向对象的思想逐步构建一个RTOS的内核。
程序 数据结构 算法
至于为什么要使用面向对象的思想是因为面向对象思想本身和程序 数据结构 算法思想就是相通的我们可以通过类和对象来表现数据结构通过方法实现算法从对象与对象的交互关系来构建从而实现更加健壮的程序。
另外再借用linus的一句话“Bad programmers worry about the code. Good programmers worry about data structures and their relationships.”
我们需要实现什么
如果读者有过使用RTOS的经历那么请你思考RTOS实现了什么带来了怎样的便利
笔者先提出一点多线程与优先级带来的实时性
RTOS将应用程序划分为多个独立的任务也就是多线程。多线程允许同时执行多个任务提高系统的处理能力和效率。例如在嵌入式系统中一个线程可以处理传感器数据另一个线程可以更新用户界面。
实时性的需求要求RTOS必须在指定的时间内完成关键任务。
我们创建一个又一个的任务知道这是一个又一个的线程它们可以并行执行。设置优先级时我们知道优先级高的任务会优先执行从而满足实时性。当我们想让任务同时且更有主次地执行时我们第一个想到的就是使用RTOS。那么强大的实时性与同时执行的任务这就是我们想要实现的结果但是我们该如何去实现它呢
如何实现实时性
请读者想一想我们创建任务设置优先级时往往希望某些任务被优先执行这是实时性实现的关键也就是说会有一个调度器来选择高优先级的任务因此我们得到了两个对象任务和调度器。 #mermaid-svg-zE5chRBjdd82hjDt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zE5chRBjdd82hjDt .error-icon{fill:#552222;}#mermaid-svg-zE5chRBjdd82hjDt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zE5chRBjdd82hjDt .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-zE5chRBjdd82hjDt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zE5chRBjdd82hjDt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zE5chRBjdd82hjDt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zE5chRBjdd82hjDt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zE5chRBjdd82hjDt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zE5chRBjdd82hjDt .marker.cross{stroke:#333333;}#mermaid-svg-zE5chRBjdd82hjDt svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zE5chRBjdd82hjDt .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zE5chRBjdd82hjDt .cluster-label text{fill:#333;}#mermaid-svg-zE5chRBjdd82hjDt .cluster-label span{color:#333;}#mermaid-svg-zE5chRBjdd82hjDt .label text,#mermaid-svg-zE5chRBjdd82hjDt span{fill:#333;color:#333;}#mermaid-svg-zE5chRBjdd82hjDt .node rect,#mermaid-svg-zE5chRBjdd82hjDt .node circle,#mermaid-svg-zE5chRBjdd82hjDt .node ellipse,#mermaid-svg-zE5chRBjdd82hjDt .node polygon,#mermaid-svg-zE5chRBjdd82hjDt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zE5chRBjdd82hjDt .node .label{text-align:center;}#mermaid-svg-zE5chRBjdd82hjDt .node.clickable{cursor:pointer;}#mermaid-svg-zE5chRBjdd82hjDt .arrowheadPath{fill:#333333;}#mermaid-svg-zE5chRBjdd82hjDt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zE5chRBjdd82hjDt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zE5chRBjdd82hjDt .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-zE5chRBjdd82hjDt .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-zE5chRBjdd82hjDt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zE5chRBjdd82hjDt .cluster text{fill:#333;}#mermaid-svg-zE5chRBjdd82hjDt .cluster span{color:#333;}#mermaid-svg-zE5chRBjdd82hjDt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zE5chRBjdd82hjDt :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 优先级依次递减 调度器_选择当前优先级最高的任务执行 任务1 就绪列表存放任务 任务2 任务3 任务4 调度器对象
通过上图我们可以推断调度器会选择就绪列表中优先级高的任务。同时就绪列表经常会发生变化当优先级最高的任务发生变化那么调度器还要切换任务因此我们得到了下图 #mermaid-svg-0h2iVrmhAtPGqXyl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0h2iVrmhAtPGqXyl .error-icon{fill:#552222;}#mermaid-svg-0h2iVrmhAtPGqXyl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0h2iVrmhAtPGqXyl .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-0h2iVrmhAtPGqXyl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0h2iVrmhAtPGqXyl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0h2iVrmhAtPGqXyl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0h2iVrmhAtPGqXyl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0h2iVrmhAtPGqXyl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0h2iVrmhAtPGqXyl .marker.cross{stroke:#333333;}#mermaid-svg-0h2iVrmhAtPGqXyl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0h2iVrmhAtPGqXyl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0h2iVrmhAtPGqXyl .cluster-label text{fill:#333;}#mermaid-svg-0h2iVrmhAtPGqXyl .cluster-label span{color:#333;}#mermaid-svg-0h2iVrmhAtPGqXyl .label text,#mermaid-svg-0h2iVrmhAtPGqXyl span{fill:#333;color:#333;}#mermaid-svg-0h2iVrmhAtPGqXyl .node rect,#mermaid-svg-0h2iVrmhAtPGqXyl .node circle,#mermaid-svg-0h2iVrmhAtPGqXyl .node ellipse,#mermaid-svg-0h2iVrmhAtPGqXyl .node polygon,#mermaid-svg-0h2iVrmhAtPGqXyl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0h2iVrmhAtPGqXyl .node .label{text-align:center;}#mermaid-svg-0h2iVrmhAtPGqXyl .node.clickable{cursor:pointer;}#mermaid-svg-0h2iVrmhAtPGqXyl .arrowheadPath{fill:#333333;}#mermaid-svg-0h2iVrmhAtPGqXyl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0h2iVrmhAtPGqXyl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0h2iVrmhAtPGqXyl .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-0h2iVrmhAtPGqXyl .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-0h2iVrmhAtPGqXyl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0h2iVrmhAtPGqXyl .cluster text{fill:#333;}#mermaid-svg-0h2iVrmhAtPGqXyl .cluster span{color:#333;}#mermaid-svg-0h2iVrmhAtPGqXyl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0h2iVrmhAtPGqXyl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 调度器 初始化 选择优先级最高的任务启动 切换任务 切换任务
切换任务时我们肯定不希望先前任务的状态丢失因此需要保存任务状态。线程任务切换如下
1.保存之前运行的线程的上下文
2.选择优先级高的任务
3.调用准备运行的线程的上下文
因此有了下图 #mermaid-svg-zDzbwK02Qg35NrZO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zDzbwK02Qg35NrZO .error-icon{fill:#552222;}#mermaid-svg-zDzbwK02Qg35NrZO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zDzbwK02Qg35NrZO .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-zDzbwK02Qg35NrZO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zDzbwK02Qg35NrZO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zDzbwK02Qg35NrZO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zDzbwK02Qg35NrZO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zDzbwK02Qg35NrZO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zDzbwK02Qg35NrZO .marker.cross{stroke:#333333;}#mermaid-svg-zDzbwK02Qg35NrZO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zDzbwK02Qg35NrZO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zDzbwK02Qg35NrZO .cluster-label text{fill:#333;}#mermaid-svg-zDzbwK02Qg35NrZO .cluster-label span{color:#333;}#mermaid-svg-zDzbwK02Qg35NrZO .label text,#mermaid-svg-zDzbwK02Qg35NrZO span{fill:#333;color:#333;}#mermaid-svg-zDzbwK02Qg35NrZO .node rect,#mermaid-svg-zDzbwK02Qg35NrZO .node circle,#mermaid-svg-zDzbwK02Qg35NrZO .node ellipse,#mermaid-svg-zDzbwK02Qg35NrZO .node polygon,#mermaid-svg-zDzbwK02Qg35NrZO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zDzbwK02Qg35NrZO .node .label{text-align:center;}#mermaid-svg-zDzbwK02Qg35NrZO .node.clickable{cursor:pointer;}#mermaid-svg-zDzbwK02Qg35NrZO .arrowheadPath{fill:#333333;}#mermaid-svg-zDzbwK02Qg35NrZO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zDzbwK02Qg35NrZO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zDzbwK02Qg35NrZO .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-zDzbwK02Qg35NrZO .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-zDzbwK02Qg35NrZO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zDzbwK02Qg35NrZO .cluster text{fill:#333;}#mermaid-svg-zDzbwK02Qg35NrZO .cluster span{color:#333;}#mermaid-svg-zDzbwK02Qg35NrZO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zDzbwK02Qg35NrZO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 调度器 初始化 启动 切换任务 保存任务状态 选择优先级最高的任务 切换到下一个任务 保存任务状态这部分就涉及到和任务对象的交互了。
任务对象
为了方便管理任务比如设置优先级啥的我们肯定需要一个任务控制块也方便我们把任务挂载到就绪列表中。同时我们要保存当前状态也就是说我们需要内存那么这段内存我们给它命名为栈。 #mermaid-svg-4CrfE2D4sXuD4vJj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4CrfE2D4sXuD4vJj .error-icon{fill:#552222;}#mermaid-svg-4CrfE2D4sXuD4vJj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4CrfE2D4sXuD4vJj .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-4CrfE2D4sXuD4vJj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4CrfE2D4sXuD4vJj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4CrfE2D4sXuD4vJj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4CrfE2D4sXuD4vJj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4CrfE2D4sXuD4vJj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4CrfE2D4sXuD4vJj .marker.cross{stroke:#333333;}#mermaid-svg-4CrfE2D4sXuD4vJj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4CrfE2D4sXuD4vJj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4CrfE2D4sXuD4vJj .cluster-label text{fill:#333;}#mermaid-svg-4CrfE2D4sXuD4vJj .cluster-label span{color:#333;}#mermaid-svg-4CrfE2D4sXuD4vJj .label text,#mermaid-svg-4CrfE2D4sXuD4vJj span{fill:#333;color:#333;}#mermaid-svg-4CrfE2D4sXuD4vJj .node rect,#mermaid-svg-4CrfE2D4sXuD4vJj .node circle,#mermaid-svg-4CrfE2D4sXuD4vJj .node ellipse,#mermaid-svg-4CrfE2D4sXuD4vJj .node polygon,#mermaid-svg-4CrfE2D4sXuD4vJj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4CrfE2D4sXuD4vJj .node .label{text-align:center;}#mermaid-svg-4CrfE2D4sXuD4vJj .node.clickable{cursor:pointer;}#mermaid-svg-4CrfE2D4sXuD4vJj .arrowheadPath{fill:#333333;}#mermaid-svg-4CrfE2D4sXuD4vJj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4CrfE2D4sXuD4vJj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4CrfE2D4sXuD4vJj .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-4CrfE2D4sXuD4vJj .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-4CrfE2D4sXuD4vJj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4CrfE2D4sXuD4vJj .cluster text{fill:#333;}#mermaid-svg-4CrfE2D4sXuD4vJj .cluster span{color:#333;}#mermaid-svg-4CrfE2D4sXuD4vJj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4CrfE2D4sXuD4vJj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务 任务控制块 任务栈 任务控制块
一个任务需要记录任务栈的信息也就是pxTopOfStack栈顶、pxStack栈起始地址、self_stack栈对象这三个结构体。为了实时性我们还需要优先级。
把图进一步展开 #mermaid-svg-ni7HW3WyzcTsBp7W {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ni7HW3WyzcTsBp7W .error-icon{fill:#552222;}#mermaid-svg-ni7HW3WyzcTsBp7W .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ni7HW3WyzcTsBp7W .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ni7HW3WyzcTsBp7W .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ni7HW3WyzcTsBp7W .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ni7HW3WyzcTsBp7W .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ni7HW3WyzcTsBp7W .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ni7HW3WyzcTsBp7W .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ni7HW3WyzcTsBp7W .marker.cross{stroke:#333333;}#mermaid-svg-ni7HW3WyzcTsBp7W svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ni7HW3WyzcTsBp7W .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ni7HW3WyzcTsBp7W .cluster-label text{fill:#333;}#mermaid-svg-ni7HW3WyzcTsBp7W .cluster-label span{color:#333;}#mermaid-svg-ni7HW3WyzcTsBp7W .label text,#mermaid-svg-ni7HW3WyzcTsBp7W span{fill:#333;color:#333;}#mermaid-svg-ni7HW3WyzcTsBp7W .node rect,#mermaid-svg-ni7HW3WyzcTsBp7W .node circle,#mermaid-svg-ni7HW3WyzcTsBp7W .node ellipse,#mermaid-svg-ni7HW3WyzcTsBp7W .node polygon,#mermaid-svg-ni7HW3WyzcTsBp7W .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ni7HW3WyzcTsBp7W .node .label{text-align:center;}#mermaid-svg-ni7HW3WyzcTsBp7W .node.clickable{cursor:pointer;}#mermaid-svg-ni7HW3WyzcTsBp7W .arrowheadPath{fill:#333333;}#mermaid-svg-ni7HW3WyzcTsBp7W .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ni7HW3WyzcTsBp7W .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ni7HW3WyzcTsBp7W .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ni7HW3WyzcTsBp7W .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ni7HW3WyzcTsBp7W .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ni7HW3WyzcTsBp7W .cluster text{fill:#333;}#mermaid-svg-ni7HW3WyzcTsBp7W .cluster span{color:#333;}#mermaid-svg-ni7HW3WyzcTsBp7W div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ni7HW3WyzcTsBp7W :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务 任务控制块 任务栈 栈顶 栈起始地址 栈对象 优先级 现在我们关键的数据结构已经出来了请读者写下这些代码,pxCurrentTCB就是当前执行的优先级最高的任务了
sparrow.cClass(TCB_t)
{volatile uint32_t * pxTopOfStack;unsigned long uxPriority;uint32_t * pxStack;Stack_register *self_stack;
};
typedef TCB_t *TaskHandle_t;__attribute__( ( used ) ) TCB_t * volatile pxCurrentTCB NULL;
typedef void (* TaskFunction_t)( void * );
栈对象
对于栈对象我们要保存先前的任务状态方便下一次任务执行时取出当前任务状态到CPU中那么任务状态是CPU中的哪些信息呢答案是寄存器 以及XPSR它是非常重要的特殊寄存器 寄存器包括两部分寄存器一部分是发生中断时硬件自动帮我们保存的寄存器另一部分是需要我们手动保存的寄存器。
因此继续展开我们的图 #mermaid-svg-JSb1kkPCJG2kx6MS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JSb1kkPCJG2kx6MS .error-icon{fill:#552222;}#mermaid-svg-JSb1kkPCJG2kx6MS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JSb1kkPCJG2kx6MS .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-JSb1kkPCJG2kx6MS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JSb1kkPCJG2kx6MS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JSb1kkPCJG2kx6MS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JSb1kkPCJG2kx6MS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JSb1kkPCJG2kx6MS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JSb1kkPCJG2kx6MS .marker.cross{stroke:#333333;}#mermaid-svg-JSb1kkPCJG2kx6MS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JSb1kkPCJG2kx6MS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JSb1kkPCJG2kx6MS .cluster-label text{fill:#333;}#mermaid-svg-JSb1kkPCJG2kx6MS .cluster-label span{color:#333;}#mermaid-svg-JSb1kkPCJG2kx6MS .label text,#mermaid-svg-JSb1kkPCJG2kx6MS span{fill:#333;color:#333;}#mermaid-svg-JSb1kkPCJG2kx6MS .node rect,#mermaid-svg-JSb1kkPCJG2kx6MS .node circle,#mermaid-svg-JSb1kkPCJG2kx6MS .node ellipse,#mermaid-svg-JSb1kkPCJG2kx6MS .node polygon,#mermaid-svg-JSb1kkPCJG2kx6MS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JSb1kkPCJG2kx6MS .node .label{text-align:center;}#mermaid-svg-JSb1kkPCJG2kx6MS .node.clickable{cursor:pointer;}#mermaid-svg-JSb1kkPCJG2kx6MS .arrowheadPath{fill:#333333;}#mermaid-svg-JSb1kkPCJG2kx6MS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JSb1kkPCJG2kx6MS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JSb1kkPCJG2kx6MS .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-JSb1kkPCJG2kx6MS .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-JSb1kkPCJG2kx6MS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JSb1kkPCJG2kx6MS .cluster text{fill:#333;}#mermaid-svg-JSb1kkPCJG2kx6MS .cluster span{color:#333;}#mermaid-svg-JSb1kkPCJG2kx6MS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JSb1kkPCJG2kx6MS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务 任务控制块 任务栈 寄存器 自动保存的寄存器 手动保存的寄存器 栈顶 栈起始地址 栈对象 优先级 因此让我们写下代码
Class(Stack_register)
{//automatic stackinguint32_t r4;uint32_t r5;uint32_t r6;uint32_t r7;uint32_t r8;uint32_t r9;uint32_t r10;uint32_t r11;//manual stackinguint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12;uint32_t LR;uint32_t PC;uint32_t xPSR;
};总结
现在我们的大蓝图已经构建完毕各种对象与它们之间的关系已然跃出水面。准备就绪是时候去实现一个RTOS了