⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于周立功FAT32文件系统建立的项目
💻 C
字号:
/*
	Author: Johnny Chen
*/

#include <stdio.h>
#include <conio.h>
#include "config.h"
#include "vvdriver.h"

typedef struct {
    char    *str;
    void    (*command)(void);
} test_func;

extern uint16 VVCammand(uint8 Cammand, void *Parameter);


char *FileName = "a:\\单片机.txt";
char WritFileData[]=
"\r\n******************Copyright (c) 周立功单片机发展有限公司***********************\r\n\
\r\n\
    ZLG/FS是广州周立功单片机发展有限公司开发的面向嵌入式系统开发的小型文件系统,\r\n\
是ZLG系列中间件的重要成员之一。它是与FAT12、FAT16、FAT32高度兼容的文件系统,可以\r\n\
直接与个人电脑交换文件。它是可移植的、可固化的文件系统,可以用于前后台系统,也可\r\n\
用于多任务环境。目前ZLG/FS的最新版本为1.0。\
\r\n\
\r\n*********************************ARM开发部门************************************\r\n";

#if 0
char *strupr(char *Str)
{
    char *cp;
    
    cp = Str;
    while (*cp != 0)
    {
        if (*cp >= 'a' && *cp <= 'z' )
        {
            *cp -=  'a' - 'A';
        }
        cp++;
    }
    return Str;
}
#endif

/*********************************************************************************************************
** 函数名称: main
** 功能描述: 测试程序主函数
********************************************************************************************************/

void test_rw_vol(void);
void test_initial(void);
void test_readblock(void);
void dump_diskinfo(void);


void main(void)
{
    test_func   funcs[] = {
        {"1. test_rw_vol", test_rw_vol},
        {"2. test_initial", test_initial},
        {"3. test_readblock", test_readblock},
        {"4. dump_diskinfo", dump_diskinfo}
    };
    uint8   func_num = 4, i;
    int     ch;

    while (1) {
        printf("\n\n---------------------------");
        printf("\n#ZLG FileSystem Test Demo.");
        for (i = 0; i < func_num; i++) {
            printf("\n %s ", funcs[i].str);
            if (i == (func_num - 1))
                printf("\n Select: ");
        }

        do {
            i = FALSE;
            ch = getch();
            if ((ch >= '1') && (ch <= '4'))
            {
                putch(ch);
                printf("\n\n");
                funcs[ch - '1'].command();
                i = TRUE;
            }
            else if (ch == 'q' || ch == 'Q')
            {
                return;
            }
                
        } while(!i);
    }
}

void test_rw_vol(void)
{
    HANDLE file;
    int ch;
    uint8 temp = 0xFF;


    printf("\n\ntest_rw_vol, file operation:");

    DiskInit();
    FileInit();

    VV_SetVVName(0);
    AddFileDriver(VVCammand);

    while(1)
    {
        if (temp == 0xFF || temp == TRUE)
        {
            printf("\n---");
            printf("\n (FileOP: R-read, W-wirte, L-list, D-delete)");
        }
        temp = TRUE;
        ch = getch();
        switch(ch)
        {
            case 'R':
            case 'r':
            case 'W':
            case 'w':
            {
                uint8   *buf_a = "you are the best! try your best to do anything you want to!Trust yourself!";
                uint8   buf_b[1024];
                uint32  i, size;
                char    filename[1000] = ".\\test.TXT";

                memset(buf_b, 0, 1024);
                for (size = 0; buf_a[size] != '\0'; size++)
                    ;
                size++;
                
                file = FileOpen(filename, "RW");
                if (file == Not_Open_FILE)
                    printf("\n !Not_Open_FILE");
                FileWrite(buf_a, size, file);
                FileClose(file);
                FileCloseAll();

                file = FileOpen(filename, "RW");
                if (file == Not_Open_FILE)
                    printf("\n !Not_Open_FILE");
                FileRead(buf_b, size, file);
                printf("\n buf_a: %s", buf_a);
                printf("\n buf_b: %s", buf_b);
                FileClose(file);
            }
                break;
            case 'L':
            case 'l':

                break;
            case 'D':
            case 'd':

                break;
            case 'Q':
            case 'q':
                return;
            default:
                temp = FALSE;
                break;
        }

    }

}

void test_initial(void)
{
    printf("\n#test_initial \n");

    DiskInit();

    VV_SetVVName(0);
    AddFileDriver(VVCammand);
    VV_SetVVName(1);
    AddFileDriver(VVCammand);
    VV_SetVVName(2);
    AddFileDriver(VVCammand);

    dump_diskinfo();
}

void test_readblock(void)
{
    uint8   buffer[SIZE_SEC];
    uint16  i;

	VV_ReadBlock(0, buffer);

    for(i = 0; i < SIZE_SEC; i++)
    {
        if (i%6 == 0)   printf("\n");
        printf("%4lu-0x%02x | ", i, buffer[i]);
        if (i + 1 == SIZE_SEC)  printf("\n");
    }
}


extern Disk_Info DiskInfo[MAX_DRIVES];     //逻辑盘信息
void dump_diskinfo(void)
{
    uint8 Drive;
    Disk_Info *disk;

    printf("\n#dump_diskinfo");

    for (Drive = 0; Drive < MAX_DRIVES; Drive++)
    {
        if (DiskInfo[Drive].Drive != EMPTY_DRIVE)
        {
            VV_SetVVName(Drive);
        
            disk = DiskInfo + Drive;

            printf("\n Drive        : %ld", disk->Drive);
            printf("\n FATType      : %ld", disk->FATType);
            printf("\n SecPerClus   : %ld", disk->SecPerClus);
            printf("\n NumFATs      : %ld", disk->NumFATs);
            printf("\n SecPerDisk   : %lu", disk->SecPerDisk);
            printf("\n BytsPerSec   : %lu", disk->BytsPerSec);
            printf("\n RootDirTable : %lu", disk->RootDirTable);
            printf("\n RootSecCnt   : %lu", disk->RootSecCnt);
            printf("\n FATStartSec  : %lu", disk->FATStartSec);
            printf("\n DataStartSec : %lu", disk->DataStartSec);
            printf("\n ClusPerData  : %lu", disk->ClusPerData);
            printf("\n PathClusIndex: %lu", disk->PathClusIndex);
            printf("\n RsvdForLow   : %lu", disk->RsvdForLow);

            if (disk->DiakCommand != NULL)
            {
                Disk_RW_Parameter Pa;
                uint8   buf[SIZE_SEC];
                uint16  i;
                
                /* 从磁盘读取扇区数据 */
                Pa.Drive = Drive;
                Pa.SectorIndex = 0;
                Pa.RsvdForLow = disk->RsvdForLow;
                Pa.Buf = buf;

                printf("\n Run disk->DiakCommand ...");
                memset(buf, 0, SIZE_SEC);
                disk->DiakCommand(DISK_READ_SECTOR, &Pa);
                
                for(i = 0; i < SIZE_SEC; i++)
                {
                    if (i%6 == 0)   printf("\n");
                    printf("%4lu-0x%02x | ", i, buf[i]);
                }
                printf("\n");
            }
            else
                printf("\n disk->DiakCommand = NULL");

            printf("\n ----------------------- \n");
        }
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -