久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

自己寫單片機操作系統(tǒng)2棧的應(yīng)用

作者:huqin   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年01月31日   【字體:

棧在MCU中有著非常重要的作用。定義局部變量,函數(shù)跳轉(zhuǎn),寄存器保護都需要使用到棧。
但是在MCU中,只會默認(rèn)一定大小的棧給我們使用。那么多任務(wù)就需要多個棧了,那只能自己的創(chuàng)造棧了。

static unsigned int stkbuf[100];    //創(chuàng)造一個100個word的任務(wù)棧。這個是16位單片機寄存器要以16位為準(zhǔn)

void NewFunBuff(VOID_FUN_PTR task,unsigned int* opt)
{
    *opt = (U16)(((U32)task) >> 8);    //將任務(wù)的指針放到stkbuf中
    opt--;
    *opt = 0x80;    //設(shè)置地址偏移
    ((U8*)opt)--;
    *opt  = 0x55; //設(shè)置地址偏移
   asm{
  lds opt        /將最終的地址得到的指針放到sP中,這個時候系統(tǒng)的SP就會給改變
  }
  asm nop

    這個最重要的地方就是在返回的時候需要從sp中取出進入函數(shù)前的數(shù)據(jù)。這個時候也會取出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了、
有問題嗎?仿真吧,看看內(nèi)存的變化就知道為什么了。

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 老司机午夜免费精品视频 | 亚洲视频二区 | 伊人干综合 | 国产91在线播放 | 在线观看日韩精品 | 狠狠干在线视频 | 日韩成人在线观看 | 国产精品久久久久久久午夜 | a毛片免费看| 国产精品视频专区 | 日日夜夜精品免费 | 亚洲成年人在线观看 | 亚洲精品综合 | 91亚洲精品乱码久久久久久蜜桃 | 午夜视频在线播放 | 国产精品久久久久久久成人午夜 | 国产传媒在线播放 | 欧美日在线| 亚洲精品一区二三区不卡 | 亚洲成人免费网站 | 亚洲欧美日韩成人 | 日韩中文在线观看 | 91看片网| 欧美一级网站 | 美国特色黄a大片 | 国产理论片| 精品视频在线观看 | 99一区二区 | 久久精品久久久久 | 五月婷婷在线视频 | 欧美一级网站 | 日韩一区二区中文字幕 | 日日干夜夜草 | 久久精品在线观看 | 亚洲女优在线 | 成人午夜毛片 | 久久av在线 | 亚洲精品久久久蜜桃 | 久久久久久国产精品 | 久久精品6 | 国产欧美日韩在线视频 |