专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

作者:huqin   来源:本站原创   点击数:  更新时间:2014年01月31日   【字体:

栈在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就会给改变
  }
  asm nop

    这个最重要的地方就是在返回的时候需要从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了、
有问题吗?仿真吧,看看内存的变化就知道为什么了。

关闭窗口

相关文章