您的位置 首页 设计

树立一个AVR的RTOS(2)—人工仓库

第二篇:人工堆栈在单片机的指令集中,一类指令是专门与堆栈和PC指针打道的,它们是rcall相对调用子程序指令icall间接调用子程序指令ret子…

第二篇:人工仓库

单片机的指令会集,一类指令是专门与仓库和PC指针打道的,它们是

rcall相对调用子程序指令

icall直接调用子程序指令

ret子程序回来指令

reti中止回来指令

关于ret和reti,它们都能够将仓库栈顶的两个字节被弹出来送入程序计数器PC中,一般用来从子程序或中止中退出。其间reti还能够在退出中止时,重开大局中止使能。

有了这个根底,就能够树立咱们的人工仓库了。

例:

#include <avr/io.h>

void fun1(void)

{

unsigned char i=0;

while(1)

{

PORTB=i++;

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

}

}

unsigned char Stack[100]; //树立一个100字节的人工仓库

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

{

*pStack–=(unsigned int)pfun>>8; //将函数的地址高位压入仓库,

*pStack–=(unsigned int)pfun; //将函数的地址低位压入仓库,

SP=pStack; //将仓库指针指向人工仓库的栈顶

__asm__ __volatile__(“RET \n\t”); //回来并开中止,开端运转fun1()

}

int main(void)

{

RunFunInNewStack(fun1,&Stack[99]);

}

RunFunInNewStack(),将指向函数的指针的值保存到一个unsigned char的数组Stack中,作为人工仓库。而且将栈顶的数值传递组仓库指针SP,因而当用”ret”回来时,从SP中康复到PC中的值,就变为了指向fun1()的地址,开端运转fun1().

上面比如中在RunFunInNewStack()的最终一句嵌入了汇编代码”ret”,实际上是能够去除的。由于在RunFunInNewStack()回来时,编译器已经会加上”ret”。我特意写出来,是为了让我们看到用”ret”作为回来后运转fun1()的进程。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部