[从0到1搭嵌入式工程]嵌入式应用层判断SD卡是否存在,获取大小和剩余空间

1,判断是否存在
    如果sd卡设备存在, 在生成/sys/block/mmcblk0/device/cid文件,存放sd卡的cid信息, 同目录下type文件可以判断卡类型,如果设备只支持sd卡,就不需要判断类型了。
    在代码中使用popen执行命令:cat /sys/block/mmcblk0/device/cid 2>/dev/null 。获取返回值,如果有返回值,则认为sd卡存在。如果cid文件或者目录不存在,因为2>重定向,把错误输入都丢到/dev/null中,所以如果出错,就不会有返回。只有cid文件存在,且读出了值,返回返回结果。(1>/dev/null 是标准输出到/dev/null)。
    在一个循环线程里一直监测。
2,判断是否存在,还有一种方法

    就是去access /dev/mmcblk0p1, /dev/mmcblk0px, x是因为sd卡不一定是p1分区, 甚至有的sd卡只有/dev/mmcblk0,来判断,显然不如第一种方法简单。或者执行命令 fdisk -l, 在设备列表里面去找mmcblk0,都比较麻烦。

3,获取总大小和剩余空间大小
    sd卡mount目录为/sdcard。
    使用statvfs系统调用,来获取sd卡的block size和块数,从而计算出大小。
    statvfs能够根据目录,返回已经mount的文件系统的信息,详细介绍见:https://www.yiibai.com/unix_system_calls/fstatvfs.html

struct statvfs sdinfo;
memset(&sdinfo, 0x00, sizeof(struct statvfs));
if(0 == statvfs("/sdcard", &sdinfo))
{
    block_size = sdinfo.f_bsize;
	total_size = sdinfo.f_blocks * block_size;
	free_size = sdinfo.f_bfree * block_size;
}
else
{
	//bad card
}

    这里存在一个问题,假设是total_size 是unsigned int类型,32位,那么最大值为4294967295(2^32-1),4GB 对于sd卡容量显然是不够的, 直接赋值,会溢出。 
    代码进一步优化为:
        total_size = sdinfo.f_blocks/1024 * block_size;
        free_size = sdinfo.f_bfree/1024 * block_size;

    这样total_size的单位就是KB,可以容纳4*1024GB,足够了。
    保险起见,在计算free_size时,应该表示为:
        free_size = min(total_size, sdinfo.f_bfree/1024 * block_size);
    保证不会比totalsize还大。

你可能感兴趣的:(嵌入式开发)