
Liteos-A任务调度之OsTaskStackInit函数 原创
之前看过Liteos-a任务调度部分源码,本来想系统的记录一下学习的结果,但是奈何能力不足,又不甘心啥都不写,所以决定碎片化的记录一下学习到的东西。liteos-a是一个操作系统,所以看源码也需要了解基本的操作系统知识,本文不对这些基本知识进行多余的解释。如:
<font color=blue>什么是任务?任务和线程有什么区别?任务或线程都有哪些状态?
而任务调度这部分也涉及汇编语言,liteos-a是基于arm架构,所以用的是arm汇编,需要各位了解arm架构和汇编的一些知识。
任务调度包含了任务的初始化,任务的切换,而任务切换包括保存当前任务,加载新任务,当新任务运行完或运行时被更高的任务打断时,就会再次进行任务切换,即保存当前任务,加载新任务。。。这都是后话,本文讲的是任务调度之前的任务栈的初始化,具体函数是OsTaskStackInit函数。
一、代码简单注释
二、任务栈和任务上下文的初始化
上面的代码总共做了两件事,一个是任务栈的初始化,一个是任务上下文结构体的初始化,其中任务栈是包含任务上下文结构体的。
1.任务栈的初始化
任务栈的初始化代码是:
任务栈初始化完成后会有一行代码:
声明一个任务上下文结构体,并指向任务栈中的某一位置,空间分布大概是这样:
这个栈空间我是以栈底作为高地址,栈顶作为低地址,栈空间初始化完成了,下面就该初始化任务上下文结构体了。
2.任务上下文结构体初始化
首先是任务上下文结构体代码:
结构体中包括ARM的R0~R12通用寄存器,PC、LR、CPSR以及32个64位浮点寄存器,还有FPSCR和FPEXC寄存器,这些都是ARM硬件上结构,还有reserved1、reserved2,这两个成员是保留的,USP和ULR是任务调度时非特权模式下要用到,这是后话。
根据OsTaskStackInit函数的代码,在任务栈初始化时主要初始化了PC、LR、R0、CPSR、32个64位浮点寄存器、FPSR和FPEXC这几个任务上下文结构体成员,这是加载任务并成功运行所必须的,所以必须初始化。
一个任务被创建并初始化后就可以参加调度了,创建任务和任务调度部分有机会的话会继续写,而任务栈的初始化现在就到此为止了,再写就不礼貌了。。
欢迎访问我的CSDN博客:请添加链接描述
