您的位置 首页 技术

自己写单片机操作系统2栈的使用

栈在MCU中有着非常重要的作用。定义局部变量,函数跳转,寄存器保护都需要使用到栈。但是在MCU中,只会默认一定大小的栈给我们使用。那么多

在MCU中有着非常重要的效果。界说局部变量,函数跳转,寄存器维护都需求运用到栈。
但是在MCU中,只会默许必定巨细的栈给咱们运用。那么多使命就需求多个栈了,那只能自己的发明栈了。

static unsigned int stkbuf[100];//发明一个100个word的使命栈。这个是16位单片机寄存器要以16位为准

void NewFunBuff(VOID_FUN_PTR task,unsigned int* opt)
{
*opt = (U16)(((U32)task) >> 8);//将使命的指针放到stkbuf中
opt–;
*opt = 0x80;//设置地址偏移
((U8*)opt)–;
*opt= 0x55; //设置地址偏移
asm{
lds opt/将终究的地址得到的指针放到sP中,这个时分体系的SP就会给改动
}
asmnop

这个最重要的当地便是在回来的时分需求从sp中取出进入函数前的数据。这个时分也会取出PC指针。而在取值的过程中SP是自增的,咱们需求确保取PC的时分便是取到stkbuf 中存task方位上。然后回来的时分就直接回来到了task中去了。
}
void InitSystem(void)
{
InitSystemClock();
InitSystemIo();
}
void main(void) {
/* put your own code here */
DisableInterrupts;
InitSystem();
EnableInterrupts;
//FunTask1();
NewFunBuff(FunTask1,&stkbuf[99]);
while(1) {
}
/* please make sure that you never leave main */
}
而task的指针便是Funtask1.那程序就会去跑Funtask1了、
有问题吗?仿真吧,看看内存的改变就知道为什么了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/317445.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部