c - 对 VeriFone 库的内存可用调用

标签 c memory-management out-of-memory posix verifone

是否有任何开发人员发现在 svc_swi.h 中针对 Evo 系列的 VeriFone 库函数的内存调用结果不一致?
我们的旧代码似乎适合 Verix/VerixV。但是对于较新的单元(它们的内存比以前的硬件大得多),这些结果出现在我们的监控中:-

Total RAM: 65536k Total Flash: 131072k Available RAM: 114654k Available Flash: 114650k

自从我们将 Evo 添加到我们的马厩以来,获取这些统计数据的代码没有改变。

long GetFileSysAvail(const char *drive) const
{
    fs_size fs;

    fs.Avail = 0;
#ifdef __arm
    (void)dir_get_sizes(drive, &fs);
#else
    dir_get_sizes((char *)drive, &fs);
#endif

    return fs.Avail;
}

最佳答案

我不确定,但我敢猜测——在 Verix 和 VerixV 终端(例如 3740/3750 和 510/570)中,Flash AND RAM 并且您通过在文件名前指定 I:F: 来指定您想要的“驱动器”。在 520(我怀疑其他 eVo 终端,但我不确定)中没有(非 volatile )RAM,因此即使您指定 I:,您仍然存储到闪存.

如果您查看dir_get_sizes 的文档,您会注意到Verix V 版本中的内容与eVo 一个。对我来说真正突出的主要区别是注释:

I: and F: are both on the Nand flash, the “Avail” member of the resulting struct fs_sizes tells the total (I: + F:) available NAND flash memory at the time the function is called.

这一切都很好,可以解释为什么“可用”高于“总计”,特别是因为您使用不同的 API 来获取总大小(我假设 SVC_RAM_SIZE 和SVC_FLASH_SIZE) 这可能在 I:F: 之间做出某种区分。如果是这种情况,则意味着您仅使用了大约 81954k 的可用存储空间。 ...除了一个棘手的问题:“可用 RAM”比“可用闪存”高 4k,我们希望它们是相同的。除非您在调用之间分配和/或存储一堆其他东西,否则我无法解释...?

另一个显着差异是,虽然两者都返回 int,但 Verix V 版本仅指示失败时返回 -1(暗示但未明确说明成功时返回 0 ) 将 errno 设置为 ENOENTEACCES。另一方面,eVo 版本指出返回值是“可用内存字节数”。比较从 dir_get_sizes 返回的值与在 fs.Avail 中设置的值可能很有趣。

关于c - 对 VeriFone 库的内存可用调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074084/

相关文章:

algorithm - "2D memory management"的高效算法

windows - 对 32 位 Windows 可执行文件使用/LARGEADDRESSAWARE 的缺点?

c# - 无法让 .Dispose() 在 foreach 循环中工作

c# - 用于字符串连接的 StringBuilder 抛出 OutOfMemoryException

c# - Linq 连接上的 System.OutOfMemoryException

c - 我应该在类函数宏中做哪些更改以使其符合 MISRA 标准?

c - 信号处理程序中奇怪的 sleep 行为

c - 内存资源(strdup)

c - 从内存中获取操作数的最坏情况时间

c++ - 如何更改进程可以分配的最大内存(每次大约 2040 MB 时都会出现访问冲突)