建立一个属于自己的AVR的RTOS(第二篇:人工堆栈)

来源:本站
导读:目前正在解读《建立一个属于自己的AVR的RTOS(第二篇:人工堆栈)》的相关信息,《建立一个属于自己的AVR的RTOS(第二篇:人工堆栈)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《建立一个属于自己的AVR的RTOS(第二篇:人工堆栈)》的详细说明。
简介:本文为建立一个属于自己的AVR的RTOS:第二篇:人工堆栈的相关知识。

第二篇:人工堆栈

在单片机的指令集中,一类指令是专门与堆栈和PC指针打道的,它们是

rcall相对调用子程序指令

icall间接调用子程序指令

ret子程序返回指令

reti中断返回指令

对于ret和reti,它们都可以将堆栈栈顶的两个字节被弹出来送入程序计数器PC中,一般用来从子程序或中断中退出。其中reti还可以在退出中断时,重开全局中断使能。

有了这个基础,就可以建立我们的人工堆栈了。

例:

#include<avr/io.h>

voidfun1(void)

{

unsignedchari=0;

while(1)

{

PORTB=i++;

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

}

}

unsignedcharStack[100];//建立一个100字节的人工堆栈

voidRunFunInNewStack(void(*pfun)(),unsignedchar*pStack)

{

*pStack--=(unsignedint)pfun>>8;//将函数的地址高位压入堆栈,

*pStack--=(unsignedint)pfun;//将函数的地址低位压入堆栈,

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

__asm____volatile__("RET

t");//返回并开中断,开始运行fun1()

}

intmain(void)

{

RunFunInNewStack(fun1,&Stack[99]);

}

RunFunInNewStack(),将指向函数的指针的值保存到一个unsignedchar的数组Stack中,作为人工堆栈。并且将栈顶的数值传递组堆栈指针SP,因此当用"ret"返回时,从SP中恢复到PC中的值,就变为了指向fun1()的地址,开始运行fun1().

上面例子中在RunFunInNewStack()的最后一句嵌入了汇编代码"ret",实际上是可以去除的。因为在RunFunInNewStack()返回时,编译器已经会加上"ret"。我特意写出来,是为了让大家看到用"ret"作为返回后运行fun1()的过程。

提醒:《建立一个属于自己的AVR的RTOS(第二篇:人工堆栈)》最后刷新时间 2024-03-14 01:08:19,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《建立一个属于自己的AVR的RTOS(第二篇:人工堆栈)》该内容的真实性请自行鉴别。