嵌入式系统开发过程中,SD卡是比较常见的外设,SD卡的稳定性与整个嵌入式系统的稳定息息相关,除了相应的驱动,还应有完整的异常检测机制。

异常检测demo(包含SD卡和U盘的检测):

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/time.h>//cw_mark
#define STORAGE_UDISK 0
#if 0
#include "MenuPicCfg.h"
#include "srv_menu_arm.h"
#include "misc.h"
#endif// ASSUMING BOTH ARE DEFINED
#define ZHE_DCT360V3_nHARDCODE_DIR
#define ZHE_SUPPORT_MMC_STORAGE#ifdef ZHE_EXT_UDISK_DEV_NAME#define NUM_DISK_ID (26*10)#define DISK_ID_START 1
#else#define NUM_DISK_ID    26
#endif#define DISK_ID_START1 1
#define DISK_ID_START2 31
#define NUM_MMCDISK_ID 5// State machine
// diskStatus:
#define UDISK_UCONN_UFSCHK 0
#define UDISK_CONN_UFSCHK 1
#define UDISK_CONN_FSCHK 2#define PRINT_POLLUDISK_TRACE
#define PRINT_POLLUDISK_TRACE_DETAILS// check if /dev/sda1,sdb1 or sdc1 even exist
// or /dev/mmcblkNp1
#if 0
#ifdef ZHE_BIGVERSION2
#define SCRIPT_FILE "/opt/DCT360V2/polludisk.sh"
#else
#define SCRIPT_FILE "/opt/DCT360V3/polludisk.sh"
#endif
#endif#define DOSFSCK_NO_ERR 0
#define DOSFSCK_ERR_CORRECTED 1
#define DOSFSCK_REBOOT 2
#define DOSFSCK_ERR_UNCORRECTED 4
#define DOSFSCK_OPER_ERR 8
#define DOSFSCK_USAGE_ERR 16
#define DOSFSCK_CANCELED 32
#define DOSFSCK_LIB_ERR 128#define DOSFSCK_RST_ERR (DOSFSCK_ERR_UNCORRECTED|DOSFSCK_OPER_ERR)//cw_mark
#if 0
extern volatile int srvAppExit;
char videoWritePath[128];
#endif//cw_mark
//extern void resync_videoWritePath( char *path );volatile int uDiskNChked = 1;
int is_udisk_chked() {return (1-uDiskNChked);
}volatile int diskStatus = UDISK_UCONN_UFSCHK;
volatile int currDiskId = 0;
volatile int resetUDisk = 0;//cw_mark
#if 0
extern DCT360V2Menu *gMenuPtr;
extern MenuRuntime mrt;
extern volatile int menumode;
#endifvolatile int updateStatusPg;void reset_udisk() {resetUDisk = 1;
}#ifdef PRINT_POLLUDISK_TRACE
int udiskPrevPrtSec = -1;
#endifint is_udisk_ok_chk(int ignoreMenu) {
#ifdef PRINT_POLLUDISK_TRACEint prt=0;int sec;unsigned int currSec;struct timeval time;gettimeofday(&time,NULL);currSec = time.tv_sec;if (udiskPrevPrtSec==-1) {prt=1;} else {sec = currSec - udiskPrevPrtSec;if ( sec>10 || sec<-10 ) {prt=1;}}if (prt) {udiskPrevPrtSec = currSec;}
#endifif ( ignoreMenu ) {if (diskStatus == UDISK_CONN_FSCHK && resetUDisk==0 ) {
#ifdef PRINT_POLLUDISK_TRACEif (prt) {printf("UDisk OK wo menumode check\n");}
#endifreturn 1;} else {
#ifdef PRINT_POLLUDISK_TRACEif (prt) {printf("UDisk Err wo menumode check:diskStatus=%d,resetUDisk=%d\n",diskStatus,resetUDisk);}
#endifreturn 0;}} else {// NOTE: in menumode, the export and import operation require sync// since udisk is being written, the sync will never be finished// that's why we don't allow write in menumode
//cw_mark
#if 0if (diskStatus == UDISK_CONN_FSCHK && resetUDisk==0 && menumode==0 ) {
#endifif (diskStatus == UDISK_CONN_FSCHK && resetUDisk==0 ) {
#ifdef PRINT_POLLUDISK_TRACEif (prt) {printf("UDisk OK\n");}
#endifreturn 1;} else {
#ifdef PRINT_POLLUDISK_TRACEif (prt) {
//cw_mark
#if 0printf("UDisk Err:diskStatus=%d,resetUDisk=%d,menumode=%d\n",
#endifprintf("UDisk Err:diskStatus=%d,resetUDisk=%d\n",diskStatus,resetUDisk);}
#endifreturn 0;}}
}int is_udiskfs_in_check() {if ( diskStatus == UDISK_CONN_UFSCHK ) {return 1;} else {return 0;}
}int is_udisk_ok() {int ignoreMenu = 0;// must also check menureturn is_udisk_ok_chk(ignoreMenu);
}int is_udisk_ok_in_menu() {int ignoreMenu = 1;return is_udisk_ok_chk(ignoreMenu);
}// support both /dev/sda and /dev/sda1
#ifdef ZHE_EXT_UDISK_DEV_NAME
static int is_udisk_connected_udisk(char *devNameOut) {
#else
static int is_udisk_connected_udisk() {
#endifint fds = 0;int i,diskId;char devName[64] = "/dev/sda1";
#ifdef ZHE_EXT_UDISK_DEV_NAMEint j, aLen;
#endifdiskId = 0;
#ifdef ZHE_EXT_UDISK_DEV_NAMEaLen=7;for (i=0;i<NUM_DISK_ID;i+=26) {for (j=0;j<26;j++) {fds = open(devName,O_RDONLY);if (fds<=0) {} else {
#ifdef PRINT_POLLUDISK_TRACEprintf("[ARM]: poll udisk %s exists\n",devName);
#endifdiskId = i+DISK_ID_START;close(fds);strcpy(devNameOut,devName);return diskId;}devName[aLen]++;}devName[aLen]='a';aLen++;devName[aLen]='a'; devName[aLen+1]='1'; devName[aLen+2]=0;}
#else for (i=0;i<NUM_DISK_ID;i++) {fds = open(devName,O_RDONLY);if (fds<=0) {} else {//printf("%s exists\n",devName);diskId = i+DISK_ID_START1;close(fds);break;}devName[7]++;}
#endifif ( diskId != 0 )return diskId;// now check /dev/sdastrcpy(devName,"/dev/sda");diskId = 0;
#ifdef ZHE_EXT_UDISK_DEV_NAMEaLen=7;for (i=0;i<NUM_DISK_ID;i+=26) {for (j=0;j<26;j++) {fds = open(devName,O_RDONLY);if (fds<=0) {} else {
#ifdef PRINT_POLLUDISK_TRACEprintf("[ARM]: poll udisk %s exists\n",devName);
#endifdiskId = (i+DISK_ID_START)|0x08000000 ;close(fds);strcpy(devNameOut,devName);return diskId;}devName[aLen]++;}devName[aLen]='a';aLen++;devName[aLen]='a'; devName[aLen+1]=0;}
#else for (i=0;i<NUM_DISK_ID;i++) {fds = open(devName,O_RDONLY);if (fds<=0) {} else {//printf("%s exists\n",devName);diskId = i+DISK_ID_START2;close(fds);break;}devName[7]++;}
#endifreturn diskId;
}// support both /dev/sda and /dev/sda1
static int is_udisk_connected_mmc() {int fds = 0;int i,diskId;char devName[32] = "/dev/mmcblk0p1";diskId = 0;for (i=0;i<NUM_MMCDISK_ID;i++) {//printf("=====open %s...\n",devName);fds = open(devName,O_RDONLY);if (fds<=0) {} else {diskId = i+DISK_ID_START1;close(fds);break;}devName[11]++;}if ( diskId != 0 ) {//printf("=====find mmc%d...\n",diskId);return diskId;}// now check /dev/mmcblk0strcpy(devName,"/dev/mmcblk0");diskId = 0;for (i=0;i<NUM_MMCDISK_ID;i++) {//printf("=====open %s...\n",devName);fds = open(devName,O_RDONLY);if (fds<=0) {} else {diskId = i+DISK_ID_START2;close(fds);//printf("=====find mmc%d...\n",diskId);break;}devName[11]++;}return diskId;
}//cw_mark
static volatile int storePath=STORAGE_UDISK;
int is_storage_path_udisk() {if ( storePath==STORAGE_UDISK) {return 1;} else {return 0;}
}#ifdef ZHE_EXT_UDISK_DEV_NAME
int is_udisk_connected(char *devName) {
#else
int is_udisk_connected() {
#endifif ( is_storage_path_udisk() ) {
#ifdef ZHE_EXT_UDISK_DEV_NAMEreturn is_udisk_connected_udisk(devName);
#elsereturn is_udisk_connected_udisk();
#endif} else {return is_udisk_connected_mmc();}
}// Explanation:
/*if ( resetUDisk || is_udisk_connected()==0 ) {write "NG" to /media/ram/udiskerr.txtreturn -1}// maybe resource busy?umount /media/sda1rstWrong=1;fixTime=0;while( fixTime<10 && rstWrong==1 ) {if ( resetUDisk ) {write "NG" to /media/ram/udiskerr.txtreturn -1      }execute dosfsck cmdif (cmd return success) {rstWrong=0; // should break out of loop} else {fixTime++;}}if (rstWrong) {write "NG" to /media/ram/udiskerr.txtreturn -1} else {mount udisk to /media/sda1set currDiskIdremove *.RECreturn 0}
*/static int check_udisk_fs_udisk() {int fixTime=1;char diskPath[128];char rstPath[] = "/media/ram/fsckrst.txt";char cmd[128];char str[] = "Free cluster summary wrong";int i, len, rstWrong=1;FILE *fp;int diskId=0;int rtCode;
#ifdef ZHE_EXT_UDISK_DEV_NAMEchar devName[64];
#endif//cw_markchar UDISK_DIR[32] = {"/media/sda1"};fixTime = 10; if ( resetUDisk ) {rstWrong = 1;goto output_rst;}// first lets poll if /dev/sda1 sdb1 or sdc1 exist
#ifdef ZHE_EXT_UDISK_DEV_NAMEdiskId = is_udisk_connected(devName);
#elsediskId = is_udisk_connected();
#endifif (diskId==0) {printf("@@@@check_udisk_fs: Disk not exist when checking fs\n");goto output_rst;}#ifdef ZHE_EXT_UDISK_DEV_NAMEstrcpy(diskPath,devName);strcpy(cmd,"umount /media/sda1");
#elseif (diskId>=DISK_ID_START1 && diskId<(DISK_ID_START1+NUM_DISK_ID) ) {strcpy(diskPath,"/dev/sda1");diskPath[7] = 'a'+(diskId-DISK_ID_START1);sprintf(cmd,"umount %s",UDISK_DIR); // /media/sda1} else if (diskId>=DISK_ID_START2 && diskId<(DISK_ID_START2+NUM_DISK_ID) ) {strcpy(diskPath,"/dev/sda");diskPath[7] = 'a'+(diskId-DISK_ID_START2);sprintf(cmd,"umount %s",UDISK_DIR); // /media/sda1}
#endif#ifdef PRINT_POLLUDISK_TRACEprintf("Checking filesys on %s\n", diskPath);
#endif//printf("@@@@check_udisk_fs: %s\n",cmd);system(cmd);//printf("@@@@check_udisk_fs: %s done\n",cmd);i = 0;len = strlen(str) - 1;#ifdef ZHE_DISABLE_FSCHKrstWrong = 0;#else// ZHENGTING: WHAT IS THIS?// (i<fixTime && rstWrong==1)while( (i<fixTime) & rstWrong ) {
#ifdef PRINT_POLLUDISK_TRACEprintf("checkfix %d time ...\n",i);
#endifif ( resetUDisk ) {rstWrong = 1;break;}// command to check filesyssprintf(cmd,"dosfsck -aw %s",diskPath);printf("@@@@check_udisk_fs: %s\n",cmd);system(cmd);sprintf(cmd, "echo $? > %s",rstPath);printf("@@@@check_udisk_fs: %s\n",cmd);system(cmd);    // open resultfp = fopen(rstPath,"rb");if (!fp) {
#ifdef PRINT_POLLUDISK_TRACEprintf("@@@@check_udisk_fs: cannot open %s\n",rstPath);
#endifbreak;}// check result in filei++;rstWrong = 0;rtCode=-1;fscanf(fp,"%d",&rtCode);if (rtCode==DOSFSCK_NO_ERR || rtCode==DOSFSCK_ERR_CORRECTED) {printf("@@@@check_udisk_fs: OK %d\n",rtCode);} else {printf("@@@@check_udisk_fs: NG %d\n",rtCode);rstWrong=1;}// close result fileif (fp) {fclose(fp);}}
#endifoutput_rst:if ( rstWrong ) {fp = fopen("/media/ram/udiskerr.txt","wb");if (fp) {fprintf(fp,"NG");fclose(fp);} else {printf("@@@@check_udisk_fs: Failed to open /media/ram/udiskerr.txt\n");}
#ifdef PRINT_POLLUDISK_TRACEprintf("@@@@check_udisk_fs: UDisk filesys not fixed NG\n");
#endif// THIS PROBABLY SHOULD BE REMOVED// If there is an UFS eror, cannot remove *.REC anyway
#ifndef ZHE_DISABLE_FSCHKsprintf(cmd,"rm %s/FSCK*.REC",UDISK_DIR);printf("@@@@check_udisk_fs: %s\n",cmd);system(cmd);
#endifreturn -1;} else {fp = fopen("/media/ram/udiskok.txt","wb");if (fp) {fprintf(fp,"OK");fclose(fp);} else {printf("@@@@check_udisk_fs: Failed to open /media/ram/udiskok.txt\n");}
#ifdef PRINT_POLLUDISK_TRACEprintf("@@@@check_udisk_fs: UDisk filesys fixed\n");
#endif#ifdef ZHE_EXT_UDISK_DEV_NAMEif ( diskId!=0 ) {sprintf(cmd,"mount -t vfat %s /media/sda1", diskPath);
//cw_mark//strcpy(videoWritePath,"/media/sda1");}
#elseif (diskId>=DISK_ID_START1 && diskId<(DISK_ID_START1+NUM_DISK_ID) ) {sprintf(cmd,"mount -t vfat /dev/sda1 %s",UDISK_DIR);
//cw_mark//strcpy(videoWritePath,UDISK_DIR);cmd[21] = 'a'+(diskId-DISK_ID_START1);} else if (diskId>=DISK_ID_START2 && diskId<(DISK_ID_START2+NUM_DISK_ID) ) {sprintf(cmd,"mount -t vfat /dev/sda %s",UDISK_DIR);
//cw_mark//strcpy(videoWritePath,UDISK_DIR);cmd[21] = 'a'+(diskId-DISK_ID_START2);}
#endifprintf("@@@@check_udisk_fs: %s\n",cmd);system(cmd);currDiskId = diskId;sprintf(cmd,"rm %s/FSCK*.REC",UDISK_DIR);printf("@@@@check_udisk_fs: %s\n",cmd);system(cmd);return 0;}
}static int check_udisk_fs_mmc() {int fixTime=1;char diskPath[128];char rstPath[] = "/media/ram/fsckrst.txt";char cmd[128];char str[] = "Free cluster summary wrong";int i, len, rstWrong=1;FILE *fp;int diskId=0;int rtCode;
#ifdef ZHE_EXT_UDISK_DEV_NAMEchar dummyDevName[64];
#endif//cw_markchar UDISK_DIR[32] = {"/media/mmc1"};fixTime = 10; if ( resetUDisk ) {rstWrong = 1;goto output_rst;}// first lets poll if /dev/sda1 sdb1 or sdc1 exist
#ifdef ZHE_EXT_UDISK_DEV_NAMEdiskId = is_udisk_connected(dummyDevName);
#elsediskId = is_udisk_connected();
#endifif (diskId==0) {//printf("@@@@@@@@check_udisk_fs: Disk not exist when checking fs\n");goto output_rst;}if (diskId>=DISK_ID_START1 && diskId<(DISK_ID_START1+NUM_MMCDISK_ID) ) {strcpy(diskPath,"/dev/mmcblk0p1");diskPath[11] = '0'+(diskId-DISK_ID_START1);sprintf(cmd,"umount %s",UDISK_DIR); // /media/mmc1} else if (diskId>=DISK_ID_START2 && diskId<(DISK_ID_START2+NUM_MMCDISK_ID) ) {strcpy(diskPath,"/dev/mmcblk0");diskPath[11] = '0'+(diskId-DISK_ID_START2);sprintf(cmd,"umount %s",UDISK_DIR); // /media/mmc1}#ifdef PRINT_POLLUDISK_TRACEprintf("Checking filesys on %s\n", diskPath);
#endif//printf("@@@@@@@@check_udisk_fs: %s\n",cmd);system(cmd);//printf("@@@@@@@@check_udisk_fs: %s done\n",cmd);i = 0;len = strlen(str) - 1;#ifdef ZHE_DISABLE_FSCHKrstWrong = 0;#else// ZHENGTING: WHAT IS THIS?// (i<fixTime && rstWrong==1)while( (i<fixTime) & rstWrong ) {
#ifdef PRINT_POLLUDISK_TRACEprintf("==========checkfix %d time ...\n",i);
#endifif ( resetUDisk ) {rstWrong = 1;break;}// command to check filesyssprintf(cmd,"dosfsck -aw %s",diskPath);printf("@@@@@@@@check_udisk_fs: %s\n",cmd);system(cmd);sprintf(cmd, "echo $? > %s",rstPath);printf("@@@@@@@@check_udisk_fs: %s\n",cmd);system(cmd);    // open resultfp = fopen(rstPath,"rb");if (!fp) {
#ifdef PRINT_POLLUDISK_TRACEprintf("@@@@@@@@check_udisk_fs: cannot open %s\n",rstPath);
#endifbreak;}// check result in filei++;rstWrong = 0;rtCode=-1;fscanf(fp,"%d",&rtCode);if (rtCode==DOSFSCK_NO_ERR || rtCode==DOSFSCK_ERR_CORRECTED) {printf("@@@@@@@@check_udisk_fs: OK %d\n",rtCode);} else {printf("@@@@@@@@check_udisk_fs: NG %d\n",rtCode);rstWrong=1;}// close result fileif (fp) {fclose(fp);}}
#endifoutput_rst:if ( rstWrong ) {fp = fopen("/media/ram/udiskerr.txt","wb");if (fp) {fprintf(fp,"NG");fclose(fp);} else {printf("@@@@@@@@check_udisk_fs: Failed to open /media/ram/udiskerr.txt\n");}
#ifdef PRINT_POLLUDISK_TRACEprintf("@@@@@@@@check_udisk_fs: UDisk filesys not fixed NG\n");
#endif// THIS PROBABLY SHOULD BE REMOVED// If there is an UFS eror, cannot remove *.REC anyway
#ifndef ZHE_DISABLE_FSCHKsprintf(cmd,"rm %s/FSCK*.REC",UDISK_DIR);printf("@@@@@@@@check_udisk_fs: %s\n",cmd);system(cmd);
#endifreturn -1;} else {fp = fopen("/media/ram/udiskok.txt","wb");if (fp) {fprintf(fp,"OK");fclose(fp);} else {printf("@@@@@@@@check_udisk_fs: Failed to open /media/ram/udiskok.txt\n");}
#ifdef PRINT_POLLUDISK_TRACEprintf("@@@@@@@@check_udisk_fs: UDisk filesys fixed\n");
#endifif (diskId>=DISK_ID_START1 && diskId<(DISK_ID_START1+NUM_MMCDISK_ID) ) {sprintf(cmd,"mount -t vfat /dev/mmcblk0p1 %s",UDISK_DIR);
//cw_mark//strcpy(videoWritePath,UDISK_DIR);cmd[25] = '0'+(diskId-DISK_ID_START1);} else if (diskId>=DISK_ID_START2 && diskId<(DISK_ID_START2+NUM_MMCDISK_ID) ) {sprintf(cmd,"mount -t vfat /dev/mmcblk0 %s",UDISK_DIR);
//cw_mark//strcpy(videoWritePath,UDISK_DIR);cmd[25] = '0'+(diskId-DISK_ID_START2);}printf("@@@@@@@@check_udisk_fs: %s\n",cmd);system(cmd);currDiskId = diskId;sprintf(cmd,"rm %s/FSCK*.REC",UDISK_DIR);printf("@@@@@@@@check_udisk_fs: %s\n",cmd);system(cmd);return 0;}
}int check_udisk_fs() {if ( is_storage_path_udisk() ) {return check_udisk_fs_udisk();} else {return check_udisk_fs_mmc();}
}//cw_mark
#if 0
void* poll_udisk_func(void *param) {
#endif
int main(){char buf[128];char cmdbuf[128];int diskFsErr = -1;int diskId = 1;
#ifdef PRINT_POLLUDISK_TRACEint prtCnt = 0;int prtCntTrd = 10;
#endifint chkCnt = 0;
#ifdef ZHE_EXT_UDISK_DEV_NAMEchar devName[64];
#endif#ifdef PRINT_POLLUDISK_TRACEprintf("ZHE: srvapp_polludisk started.\n");
#endifwhile(1) {
#ifdef PRINT_POLLUDISK_TRACEprtCnt++;if (prtCnt>=prtCntTrd) {prtCnt=0;}
#endif//printf("======== Checking UDISK/MMC ...\n");if ( diskStatus == UDISK_UCONN_UFSCHK ) {//printf("========= current status un-connected\n");// do not check file write timeout since we started fixing ufs
//cw_mark
//      reset_fw_time();
#ifdef ZHE_EXT_UDISK_DEV_NAMEdiskId = is_udisk_connected(devName);
#elsediskId = is_udisk_connected();
#endifresetUDisk = 0; // clear the flagcurrDiskId = diskId;if (diskId==0) {//printf("========= remain un-connected\n");
#ifdef PRINT_POLLUDISK_TRACEif ( prtCnt==0 ) {printf("UDisk: 1, unconnected\n");}
#endif} else {//printf("========= change to connected but not checked\n");diskStatus = UDISK_CONN_UFSCHK;} }if ( diskStatus == UDISK_CONN_UFSCHK ) {//printf("========= current status connected but not checked\n");// connected, lets check the fsdiskFsErr = check_udisk_fs();if (diskFsErr==-1) {currDiskId = 0;diskStatus = UDISK_UCONN_UFSCHK;//printf("========= fs error, change to unconnected status\n");
#ifdef PRINT_POLLUDISK_TRACEif ( prtCnt==0 ) {printf("UDisk: 2, connected, fs error\n");}
#endif} else {// currDiskId should have been set in check_udisk_fs// ZHE_CHKUDISK_FILEOP// delay a bit before allowing file opsleep(2);//printf("========= fs ok, change to connected & checked\n");diskStatus = UDISK_CONN_FSCHK;
//cw_mark
//        resync_videoWritePath( videoWritePath );//cw_mark
#if 0if (menumode==0) { //printf("========= notify to update status page due to mmc GOOD\n");updateStatusPg = 1;}
#endif#ifdef PRINT_POLLUDISK_TRACEif ( prtCnt==0 ) {printf("UDisk: 3, connected, fs OK\n");}
#endif}}if ( diskStatus == UDISK_CONN_FSCHK ) {//printf("========= current status connected & checked\n");
#ifdef ZHE_EXT_UDISK_DEV_NAMEdiskId = is_udisk_connected(devName);
#elsediskId = is_udisk_connected();
#endifif ( diskId!=currDiskId || resetUDisk ) {// udisk is disconnected
#ifdef PRINT_POLLUDISK_TRACEif ( prtCnt==0 ) {printf("UDisk: 4, unconnected, diskId=%d,currDiskId=%d,resetUDisk=%d!\n",diskId,currDiskId,resetUDisk);}
#endif//printf("========= diskId=%d, change to unconnected status\n",diskId);        diskStatus = UDISK_UCONN_UFSCHK;// we might got error:// umount: can't umount /media/sda1: Device or resource busysleep(1);
//cw_mark//sprintf(cmdbuf,"umount %s",videoWritePath);printf("%s\n",cmdbuf);system(cmdbuf);
//cw_mark//strcpy(videoWritePath,"nexist");printf("%s done\n",cmdbuf);currDiskId = 0;
//cw_mark
#if 0if (menumode==0) { //printf("========= notify to update statusPg due to mmc loss\n");  updateStatusPg = 1;}
#endif} else {// stay connected, do nothing//printf("========= MMC STATE GOOD\n");diskStatus = UDISK_CONN_FSCHK;
#ifdef PRINT_POLLUDISK_TRACEif ( prtCnt==0 ) {printf("UDisk: 5, connected, fs OK\n");}
#endif} }usleep(1000000);if (chkCnt++) {if (chkCnt >= 3) {uDiskNChked = 0;}}}printf("srvapp_polludisk exited\n");return 0;
}

sd卡U盘异常检测程序相关推荐

  1. 威纶触摸屏使用U盘/SD卡上传或下载程序步骤及编译失败处理对策

    威纶触摸屏使用U盘/SD卡上传或下载程序步骤及编译失败处理对策 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 上传 首先,我们需要准备一个U盘,存 ...

  2. android u盘读写权限,Android 外部SD卡/U盘无法写入解决方法(需要root)

    但今天我遇到一个问题,就是我买了只TF卡装上去以后发现:一般程序无法写入TF卡,而系统自带的文件工具能够写入. 什么原因呢? 好在这个平板已经是root的,马上调出rootexplorer文件管理器查 ...

  3. 手把手教你如何让电脑将SD卡/U盘识别为本地磁盘

    目录 一.手把手教你如何让电脑将SD卡/U盘识别为本地磁盘 二.解决Win10安装驱动时,INF不包含数字签名信息 一.手把手教你如何让电脑将SD卡/U盘识别为本地磁盘 1.点击这里下载cfadisk ...

  4. 【疑难杂症爆破委员会】解决Surface Go等插sd卡的设备无法把程序装到sd卡里的问题

    [疑难杂症爆破委员会] 解决Surface Go等插sd卡的设备无法把程序装到sd卡里的问题 状况说明 在Windows系统中,当我们插了SD卡(tf卡)时,有些程序无法装在卡里,该如何解决呢? 解决 ...

  5. linux sd卡启动盘制作工具,fedora liveusb creator linux u盘启动盘制作工具

    fedora liveusb creator是一款专业的linux u盘启动盘制作工具,使用这款linux启动盘制作工具您可以制作用于安装linux系统的U盘启动盘,也可以实现把linux系统安装到U ...

  6. 基于S3C2440丛SD卡启动WinCE(或其它程序)的实现

    [楼主位] liuweiele Liuwei 积分:687 派别: 等级:------ 来自: 系统上电后,如果发现SD卡中有boot.ini文件,便按boot.ini文件中的指定参数运行,否则继续启 ...

  7. 嵌入式之SD卡/U盘只读问题解决方案(FAT只读修复方式)

    SD卡异常问题分类解决 嵌入式存储对SD卡的使用是比较普遍的,如何把SD卡的性能用到极致避免出现各类问题,需要大家在代码的设计过程中实现异常错误处理. SD卡问题主要有以下3个 1.SD卡无法识别 2 ...

  8. linux sd卡启动盘制作工具,使用Etcher来创建可启动盘(可引导的USB盘或SD卡)的方法...

    本文介绍在 Linux 下安装 Etcher 的方法及使用 Etcher 来创建可启动盘,即创建一个可引导的 USB 盘或 SD 卡.同时它还能在 Windows.MacOS 上使用,Etcher L ...

  9. 计算机文档DIR什么意思,lost.dir是什么文件夹?Win7 Sd卡U盘里lost.dir是什么意思?...

    最近有用户用户发现在电脑上插入U盘或是Sd卡等储存设备就会有一个lost.dir文件夹,那么lost.dir是什么意思,lost.dir是什么文件夹,有什么作用呢?下面小编就为大家带来详细的介绍,快来 ...

最新文章

  1. 开源超美css动态背景 可直接引入html文件使用 含注释、可更改
  2. 010-映射诊断环境
  3. java获取系统运行日志文件_java – 如何获取特定的日志文件并在jenkins控制台输出中显示其内容...
  4. java课堂疑问解答与思考2
  5. 线性复杂度的素数筛选法
  6. 校园网搭建案例(课堂总结)
  7. python统计词频_Python统计四六级考试的词频
  8. 【BZOJ2073】[POI2004]PRZ 状压DP
  9. Redis研究-3.7 有序集合中范围以及数学集合运算
  10. Python + Appium 环境搭建
  11. 读书笔记-01大型网站架构演化的价值观
  12. 以正常使用来进行测试
  13. Qt6.2.1在线安装教程
  14. 研发项目wbs分解简单案例_2013项目管理案例分析:工作分解结构(WBS)(精选五篇)...
  15. html怎么实现聊天界面设计,纯css制作仿微信聊天页面
  16. 【Python_PyQtGraph 学习笔记(五)】基于PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,且保留全部绘图信息
  17. Python----数据分析-使用scikit-learn构建模型实训(wine数据集、wine_quality数据)
  18. GJM : 各大开发游戏引擎
  19. Synchronized-偏向锁
  20. 暴力拉丁方阵(C语言 6阶)

热门文章

  1. フローのパラメータについて
  2. Android安卓拖拉机版Docker
  3. Q版京剧脸谱来喽——小生
  4. 最新 2022中国大学排名发布~
  5. Java 输出执行开始时间,结束时间和运行时间
  6. PC微信更改文件默认保存位置后聊天记录丢失
  7. 从人机交互到人机协作,人类在抑制 AI 时代的焦虑时做的尝试
  8. 快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力
  9. Russ Cox:这不是Go项目的标准布局 | Gopher Daily (2021.04.28) ʕ◔ϖ◔ʔ
  10. matlab是计算机模拟吗,MATLAB计算机模拟,MATLAB calculator simulate,音标,读音,翻译,英文例句,英语词典...