我目前正在C++中为STM32 C开发。基本上,我想在I S.c上添加一层抽象层,以便在物理I 2 c总线上的多路复用器后面有虚拟的I 2 c总线。
我们已经有了一个将驱动程序和多路复用器逻辑相结合的驱动程序,而OOP部门显然缺乏.因此,我在I 2 C访问中添加了一个间接级别,并增加了一个虚拟总线实现,以使驱动程序与多路复用器逻辑分离,并隐藏全局知识:
Device -> Virtual I²C -> I²C Multiplexer -> Abstracted I²C -> Low-Level I²C现在我的问题是,每个接口都必须定义一个传输函数。
virtual
transmit(const uint8_t address,
uint8_t *tx,
size_t lentx,
const uint8_t *rx,
const size_t lenrx,
const size_t timeout
);只是传递了一些论点。通常:
virtual
transmit(...) {
this->driver->transmit(this->address, ...);
}但是,事实证明,每个虚拟函数调用都会为我的堆栈需求增加多达40个字节,因为它们:
现在,我们只是最近才开始使用C++,所以我对嵌入式系统开发的精细调整还不太了解。然而,我觉得奇怪的是,已经有三个层次的间接方向会使我耗尽堆栈空间……例如,我只通过虚拟调用丢失164个字节:设备到虚拟总线,虚拟总线到I 2 C复用器,I 2 C复用器提取I 2 C,在这里进行真正的调用。
想要的解决方案是很明显的。显然,虚拟函数调用应该只为传递和重新排序参数所需的附加变量分配足够多的空间:
Incoming: tx*, len, rx*, len, to
Allocate: tx*, len, rx*, len, to, ___
Reorder : ___, tx*, len, rx*, len, to
Add args: sla, tx*, len, rx*, len, to
---------- Call ----------
Reorder : tx*, len, rx*, len, to, ___
Dealloc : tx*, len, rx*, len, to
Output : tx*, len, rx*, len, to所以,真正的问题是:我能不能强迫GCC注意到这种穿行式的行为,并迫使它尽可能地节省堆栈空间?我在这里真是不知所措,因为我一开始只用豆荚.
发布于 2014-06-08 23:56:36
虽然您无法说服gcc自动更改堆栈布局,但您当然可以通过定义一个设置参数的struct并传递指向该struct的共享指针来手动更改堆栈布局。
以下是您可以这样做的方法:
struct TxRxParams {
uint8_t *tx;
size_t lentx;
const uint8_t *rx;
const size_t lenrx;
};现在,您可以分配一次TxRxParams,并将指向它的指针传递给各种函数,不管是虚拟的还是非虚的,以节省堆栈空间。
https://stackoverflow.com/questions/24111650
复制相似问题