我有一个嵌入式Linux系统,它可以根据SD卡中的请求开始记录数据。控制系统的软件有一个定期调用的功能,用于检查SD卡中的可用空间量,如果达到99%的占用率则停止记录。我正在使用的代码是以下statvfs
作为读取存储数据的文件夹的函数:
struct statvfs buff;
const int resp = statvfs("/media/mmcblk0p2/", &buff);
if (resp < 0)
{
const QString strTemp = QString("INTERFACE: An error occurred while trying to read the file system info");
mDebugS(strTemp);
mLog(strTemp);
return;
}
const float size = float(buff.f_bsize * buff.f_blocks) / float(1024 * 1024 * 1024);
const float free = float(buff.f_bsize * buff.f_bfree) / float(1024 * 1024 * 1024);
const float available = float(buff.f_bsize * buff.f_bavail) / float(1024 * 1024 * 1024);
//const float used = size - free;
const float percentUsed = (size - free)/size; //E.g.: 0.98
const float percentAvailable = available/size;
const float totalStorageTime = size/1.2f * 24.0f;
//const float hoursUsed = percentUsed * totalStorageTime;
const float timeAvailable = percentAvailable * totalStorageTime;
const qint32 hoursLeft = (qint32)timeAvailable;
const qint32 minutesLeft = qint32((timeAvailable - (float)hoursLeft) * 60.0f);
// mDebugS(QString("INTERFACE: mmcblk0p2 info: size: %1 | free: %2 | available: %3 | percent used: %4 | percent available: %5 | totalStorageTime: %6 | time available: %7 \n | hoursLeft: %8 "
// "| minutes left: %9")
// .arg(size).arg(free).arg(available).arg(percentUsed).arg(percentAvailable).arg(totalStorageTime).arg(timeAvailable).arg((qint32)timeAvailable)
// .arg(qint32((timeAvailable - (float)hoursLeft) * 60.0f)));
emit signalSetMassMemory(hoursLeft,minutesLeft);
if (percentUsed >= 0.99f)
//...
注意:1.2f值与录制速度有关:每天1.2 Gb。我也使用这个功能来了解剩余的录音时间。
此算法首先在4 Gb SD卡中进行了测试,并且运行正常。该SDC分为两个分区,相关的分区称为/media/mmcblk0p2/
。我面临的问题是,当使用不同的SD卡在另一个系统中运行确切的代码时,文件夹大小的返回值是错误的:SDC是16 Gb,函数返回的是2.22 Gb。什么可能是错的,因为算法和其他一切都完全相同?
我现在唯一怀疑的是,SD卡存在问题,金士顿16 Gb micro sdhc Class 4与另一个成功的完全相同,但大小除外。但我不确切知道它可能有什么问题,因为它可以正常工作(复制,粘贴,创建文件夹等)。顺便说一下,两张存储卡的格式都是一样的,我没有其他的可以运行一些额外的测试。
那么有人对可能发生的事情有所了解吗? statvfs
文档没有谈到某种限制吗?我应该更改功能吗?
答案 0 :(得分:1)
32位数据类型最多可以容纳4G,而要表示16G需要更多位,因此必须使用64位数据类型。尝试使用quint64而不是现在使用的,或者检查编译器支持的本机无符号64位数据类型。它通常是unsigned long long。