Stk stk = ptos;         //将传递过来的堆栈指针值赋值给STKOSTaskStkInit

2023-12-01 08:32

本文主要是介绍Stk stk = ptos;         //将传递过来的堆栈指针值赋值给STKOSTaskStkInit,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UC/OS-II中OSTaskStkInit()移植详解(基于Cortex-M3)



  OSTaskStkInit()在Cortex-M3中主要功能为初始化任务的栈的桔构,使任务的栈看起来就好像刚发生了一个中断一样的结构,这些UC/OS的作者都有说到.现在我们须要了解的是Cortex-M3在发生中断时,它的堆栈结构.在我们之前有提它中断时的压栈过程为xPSR–>PC–>LR–>R12–>R3-R0(详情点这里:Cortex-M3中断时,自动压栈的顺序),推断出中断后的任务堆栈应该为下图:

所以OSTaskStkInit()的作用就是将传递过来的参数(其中包含了堆栈地址与任务入口地址等)

标准的OSTaskStkInit()的原型为:

OS_STK *OSTaskStkInit(void  (*task)(void *pd),void *pdata,OS_STK *ptos,INT16U opt);

ptos是传入是堆栈的初始值,task则是任务PC的起始地址指针.opt则是操作数,一般的任务都没用上.

所以我们最主要的任务就是把ptos,task按中断的方式压入堆栈中,堆栈的地址由ptos给出,然后再把新的堆栈的值传回去.方法:

opt=opt;             //未使用,防止编译器警告 
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;    //定义一个指针变量,用来对堆栈的操作 

stk = ptos;         //将传递过来的堆栈指针值赋值给STK

*(stk) = (INT32U)0×01000000L; //首先压入的是xPSR
*(–stk) = (INT32U)task;                    //然后自减一后把任务的入口地址压入
*(–stk) = (INT32U)0xFFFFFFFEL; //接下来压入LR,由于CORTEX-M3的LR在中断时是非常特殊值,所以这经的值须要根据实际情况去确定,比如在任务模式下使用PSP那么就得把LR的值设定为FFFFFFFE

*(–stk) = (INT32U)0×12121212L; /* R12 */
*(–stk) = (INT32U)0×03030303L; /* R3 */
*(–stk) = (INT32U)0×02020202L; /* R2 */
*(–stk) = (INT32U)0×01010101L; /* R1 */
*(–stk) = (INT32U)parg; /* R0 : ar 输入参数 */
/* Remaining registers saved on*/
/* process stack */
/* 剩下的寄存器保存到堆栈 */

*(–stk) = (INT32U)0×11111111L; /* R11 */
*(–stk) = (INT32U)0×10101010L; /* R10 */
*(–stk) = (INT32U)0×09090909L; /* R9 */
*(–stk) = (INT32U)0×08080808L; /* R8 */
*(–stk) = (INT32U)0×07070707L; /* R7 */
*(–stk) = (INT32U)0×06060606L; /* R6 */
*(–stk) = (INT32U)0×05050505L; /* R5 */
*(–stk) = (INT32U)0×04040404L; /* R4 */

return(stk);   //最后,返回新的堆栈的值.
}

至此,OSTaskStkInit就算移植完成,当然他具体的目的与作用,还是去看看UC/OS的作者说明是最全面的.

这篇关于Stk stk = ptos;         //将传递过来的堆栈指针值赋值给STKOSTaskStkInit的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

JAVA基础:值传递和址传递

1 值传递和址传递 值传递 方法调用时,传递的实参是一个基本类型的数据 形参改变,实参不变 public static void doSum(int num1,int num2){}main(){doSum(10,20);int i = 10 ;int j = 20 ;doSum(i,j) ;}   public static void t1(int num){num = 20

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

Go 数组赋值问题

package mainimport "fmt"type Student struct {Name stringAge int}func main() {data := make(map[string]*Student)list := []Student{{Name:"a",Age:1},{Name:"b",Age:2},{Name:"c",Age:3},}// 错误 都指向了最后一个v// a

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。 结构声明 在声明结构时,必须列出它包含的所有成员。 struct tag {member-list} variable-list ; 定义一个结构体变量x(包含

六、Maven依赖管理、依赖传递和依赖冲突

1.Maven依赖管理 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。 我们通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖,从而避免了手动