打印
[51单片机]

keil 中模拟堆栈的问题

[复制链接]
887|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
溜溜溜溜|  楼主 | 2016-6-6 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做ucos-ii移植到51单片机上面。跟着网上的教程做了一部分,现在有一点问题不明白,希望大神能够提供帮助。
如果要移植ucos那么必须将所有函数都设计成可重入的。keil c51使用模拟堆栈来保证可重入。我使用的是Large模式,模拟堆栈的指针为?C_XBP
我的疑问有以下几个:
1、是不是每个可重入函数都有一个模拟堆栈,还是所有的可重入函数共享一个模拟堆栈。
2、如果是每个可重入函数都有一个模拟对战的话,因为只有一个指针 ?C_XBP, 当执行不同的函数的时候,如何切换模拟堆栈。
3、如果是每个可重入函数都有一个模拟对战的话,假如函数FuncA和FuncB都是可重入的函数,那么FunC调用 FuncB时,FuncB的参数是保存到哪里了?是FunC的模拟对战还是FuncB的模拟堆栈?

相关帖子

沙发
ayb_ice| | 2016-6-6 17:41 | 只看该作者
共享一个模拟堆栈,不同编译模式有不同的模拟堆栈,所最多有3个模拟堆栈

使用特权

评论回复
板凳
溜溜溜溜|  楼主 | 2016-6-7 09:14 | 只看该作者
ayb_ice 发表于 2016-6-6 17:41
共享一个模拟堆栈,不同编译模式有不同的模拟堆栈,所最多有3个模拟堆栈

我看了C51编译器手册,知道对于small、compact和large模式下各自的模拟堆栈指针不一样。比如说我选择了large模式,那么模拟堆栈的指针为?C_XBP,可是我不明白如果是共享一个堆栈的话,那么多个函数如何共享这个模拟堆栈?假如正在执行FuncA的时候,切换去执行FuncB,这种情况下堆栈怎么切换?

使用特权

评论回复
地板
ayb_ice| | 2016-6-7 12:07 | 只看该作者
一般内核不都只有一个堆栈指针吗,特别是MCU,

使用特权

评论回复
5
cuya| | 2016-6-7 20:57 | 只看该作者
对于同一任务来说:
1.  所有的可重入函数共享一个模拟堆栈。
2.  模拟堆栈是由编译器生成, 用软件维护, 共享一个模拟堆栈, 不存在切换模拟堆栈问题。
3.  与其他 CPU 的硬件栈相似, 参数被压入模拟栈中。

51 架构太老, 先天不足, 所以编译器会采用一些看似奇葩的做法。51硬件栈指针为 8 bit, 而且只能指向内部存储器。所以限制了应用, 比如 os 之类需要大量堆栈的应用。所以 os 只能采用用软件在外部存储器实现模拟堆栈的做法来解决问题。对于使用者来说, 把模拟堆栈当作普通堆栈即可。

要注意的问题是 os。 os 会给每一个任务分配一个独立的栈区用以保存上下文, 所以同一函数在不同的任务中可能会在不同的栈区。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝