<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 建立一個(gè)AVR的RTOS(2)—人工堆棧

建立一個(gè)AVR的RTOS(2)—人工堆棧

作者: 時(shí)間:2016-12-03 來(lái)源:網(wǎng)絡(luò ) 收藏
第二篇:人工堆棧

單片機的指令集中,一類(lèi)指令是專(zhuān)門(mén)與堆棧和PC指針打道的,它們是

本文引用地址:http://dyxdggzs.com/article/201612/325273.htm

rcall相對調用子程序指令

icall間接調用子程序指令

ret子程序返回指令

reti中斷返回指令

對于ret和reti,它們都可以將堆棧棧頂的兩個(gè)字節被彈出來(lái)送入程序計數器PC中,一般用來(lái)從子程序或中斷中退出。其中reti還可以在退出中斷時(shí),重開(kāi)全局中斷使能。

有了這個(gè)基礎,就可以建立我們的人工堆棧了。

例:

#include <avr/io.h>

void fun1(void)

{

unsigned char i=0;

while(1)

{

PORTB=i++;

PORTC=0x01<<(i%8);

}

}

unsigned char Stack[100]; //建立一個(gè)100字節的人工堆棧

void RunFunInNewStack(void (*pfun)(),unsigned char *pStack)

{

*pStack--=(unsigned int)pfun>>8; //將函數的地址高位壓入堆棧,

*pStack--=(unsigned int)pfun; //將函數的地址低位壓入堆棧,

SP=pStack; //將堆棧指針指向人工堆棧的棧頂

__asm__ __volatile__("RET nt"); //返回并開(kāi)中斷,開(kāi)始運行fun1()

}

int main(void)

{

RunFunInNewStack(fun1,&Stack[99]);

}

RunFunInNewStack(),將指向函數的指針的值保存到一個(gè)unsigned char的數組Stack中,作為人工堆棧。并且將棧頂的數值傳遞組堆棧指針SP,因此當用"ret"返回時(shí),從SP中恢復到PC中的值,就變?yōu)榱酥赶騠un1()的地址,開(kāi)始運行fun1().

上面例子中在RunFunInNewStack()的最后一句嵌入了匯編代碼"ret",實(shí)際上是可以去除的。因為在RunFunInNewStack()返回時(shí),編譯器已經(jīng)會(huì )加上"ret"。我特意寫(xiě)出來(lái),是為了讓大家看到用"ret"作為返回后運行fun1()的過(guò)程。



關(guān)鍵詞: AVRRTOS人工堆

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>