keil C51 uCOS模拟堆栈,重入函数,动态变量分配浅析.doc

keil C51 uCOS模拟堆栈,重入函数,动态变量分配浅析.doc

ID:51888931

大小:75.00 KB

页数:3页

时间:2020-03-18

keil C51 uCOS模拟堆栈,重入函数,动态变量分配浅析.doc_第1页
keil C51 uCOS模拟堆栈,重入函数,动态变量分配浅析.doc_第2页
keil C51 uCOS模拟堆栈,重入函数,动态变量分配浅析.doc_第3页
资源描述:

《keil C51 uCOS模拟堆栈,重入函数,动态变量分配浅析.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、1,模拟堆栈C51编译器为可重入函数生成一个模拟栈(相对丁•系统堆栈或是硬件堆栈来说),通过这个模拟栈来完成参数传递和存放局部变量。模拟栈以全局变量?CIBP、?CPBP和?CXBP作为栈指针(系统堆栈栈顶指针为SP),这些变量定义在DATA地址空间,并且可在文件startup.a51中进行初始化。根据编译时采用的存储器模式,模拟栈区可位于内部(IDATA)或外部(PDATA或XDATA)存储器中,向下生长。如表所示:存储模式栈指针栈区域Small?CIBP(1I?)间接访问的内部数据存储器(1DATA),栈区最大为256字节Compact?CPBP(1字节)分页寻址的外部数据存储器(PD

2、ATA),栈区最大为256字节Large?CXBP(2字节)外部数据存储器(XDATA),栈区最大为64K2,可重入函数“可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数任何时候都可以被中断,一段时间以后又可以运行,而相应的数据不会丢失。”(摘自嵌入式实时操作系统uC/OSII)Ke订C51下,默认时函数时不支持重入,但uC/OSII操作系统中的函数是可重入的,那么如何让函数成为可重入函数呢?C51编译器釆用了一个扩展关键字reentrant作为定义函数时的选项,需要将…个函数定义为可重入函数时,只要在函数后血加上关键字reentrantBP可。例:voidtaskl(

3、void)reentrant3,局部变量的分配c局部变量分配在RAM中:一种是固定分配:由编译器给定固定地址;…种是动态分配的:由编译器预分配大小,给合动态堆指针计算出实际动态地址。KeilC51下默认情况下变量都是固定分配,由编译器编译时自动分配变量的空间,确保不会被覆盖,这种变量是不可重入的。如下:符Si<0。

4、□画耳亘回王二・二・®Q越DisassemblyNamee叱■cToxoooo02000ELCMPvoidtaskl(void)voidC:OOOEunsignedcharrxbuffer!(50];MOVcam(void)rxbufferl(0J-10xlArtdx5runs

5、ignedcharrx_bufferl(16J;EA-1;rxbufferl(O]-0x55;KeilC51中函数后而加上关键字reentrant这种情况下,函数内部的局部变量会动态计算地址。如下:预分配地址+?CIBP内容,得到实际地址。NameLocation/ValueCKhOO5OType«rr«y(50)ofu<

6、CXhOO63ChOxOA・irdrrtfy(16]ofu

7、0x005719::0x005920:)24CEF57E7601MOVtasJc3();120026LCALLuffex2[50);BRO八0x01taak3(C:0026)stonedch«rMOVA.?C-XBP(0x"7E)ADDA,«0xCEMOV?C_I3P(0x7E),Arx_buffer2[0)-1;(0-0x32=0xCE)结合CIBP内容,动态算出了结果(CIBP开始时为0),然后CIBP为OxCE用于下个变量申请。函数返时,在释放rxbuffei'2空间,如下,CIBP+0x32=0;C:Ox005CE57EMOVA,?C_IBP(0x7E)C:Ox005E2432AD

8、DC:0x0060F57EMOVIB^(0x7E)rAC:0x0062m•一■心〜22»_■£■RETrxbuffer2地址是:编译器预分配rxbuffer2,向下分配RAM大小50,则指向OxCE,1,KeilC51移植UCOS时的系统堆栈SP与模拟堆栈?CIBP、?CPBP、?CXBPC51的SP指针为8位寻址,即最大256个字节,向上圧栈,而UCOS占用的RAM比较多,51中一般都选XDATA,即16位的寻址,模拟的栈,变量放在64K区域,此时系统POPPUSH的指令无法访问。在51中UCOS由系统栈,模拟堆栈共同运作实现任务的切换。当前任务的压栈数据放在系统栈中(SP指向的地址),

9、任务切换时,先把当前系统栈的内容拷贝到任务的模拟栈区(低地址)。再把要运行任务的模拟栈(低地址)中的栈内容拷贝系统栈中,即切换了任务。任务的模拟栈,高地址存放的是任务内部的局部变量,向下递减,而低地址存放的内容就是上血拷贝的系统栈内容,存放的是压栈数据,如寄存器A,B,R0~R7,DPTR,PSW,PC指针等,向上增加。所以在L'COS定义MaxStkSize堆栈大小时,要考虑局部变量的大小深度,要考虑函数嵌套深度及中断

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。