LOGICAL STRUCTURE OF DATABASE

本文详细阐述了数据库的逻辑结构,包括表空间、段、扩展和Oracle数据块等核心概念,帮助理解数据库内部的工作原理。

http://www.oraclefaq.net/logical-structure-of-database/

Logical structure mainly consists of tablespace, segments, extents, and oracle data blocks

TABLESPACE

Each database is logically divided into one or more tablespaces. One or more datafiles are explicitly created for each tablespace to physically store the data of all logical structures in a tablespace. The combined size of the datafiles in a tablespace is the total storage capacity of the tablespace.

SEGMENT

A segment is a set of extents allocated for a certain logical structure. The segments can be of one of following type data segment,index segment,temporary segment,rollback segment.

EXTENT

The next level of logical database space is an extent. An extent is a specific number of contiguous data blocks, obtained in a single allocation, used to store a specific type of information.

ORACLE DATABLOCKS

At the finest level of granularity, Oracle database data is stored in data blocks. One data block corresponds to a specific number of bytes of physical database space on disk. The standard block size is specified by the DB_BLOCK_SIZE initialization parameter. In addition, you can specify up to five other block sizes.

 

/*---------------------------------------------------------------------------/ / FatFs - FAT file system module include file R0.09 (C)ChaN, 2011 /----------------------------------------------------------------------------/ / FatFs module is a generic FAT file system module for small embedded systems. / This is a free software that opened for education, research and commercial / developments under license policy of following trems. / / Copyright (C) 2011, ChaN, all right reserved. / / * The FatFs module is a free software and there is NO WARRANTY. / * No restriction on use. You can use, modify and redistribute it for / personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. / * Redistributions of source code must retain the above copyright notice. / /----------------------------------------------------------------------------*/ #ifndef _FATFS #define _FATFS 6502 /* Revision ID */ #ifdef __cplusplus extern "C" { #endif #include "integer.h" /* Basic integer types */ #include "ffconf.h" /* FatFs configuration options */ #include "HeaderFiles.h" #if _FATFS != _FFCONF #error Wrong configuration file (ffconf.h). #endif /* Definitions of volume management */ #if _MULTI_PARTITION /* Multiple partition configuration */ typedef struct { BYTE pd; /* Physical drive number */ BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ } PARTITION; extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ #define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive number */ #define LD2PT(vol) (VolToPart[vol].pt) /* Get partition index */ #else /* Single partition configuration */ #define LD2PD(vol) (vol) /* Each logical drive is bound to the same physical drive number */ #define LD2PT(vol) 0 /* Always mounts the 1st partition or in SFD */ #endif /* Type of path name strings on FatFs API */ #if _LFN_UNICODE /* Unicode string */ #if !_USE_LFN #error _LFN_UNICODE must be 0 in non-LFN cfg. #endif #ifndef _INC_TCHAR typedef WCHAR TCHAR; #define _T(x) L ## x #define _TEXT(x) L ## x #endif #else /* ANSI/OEM string */ #ifndef _INC_TCHAR typedef char TCHAR; #define _T(x) x #define _TEXT(x) x #endif #endif /* File system object structure (FATFS) */ typedef struct { BYTE fs_type; /* FAT sub-type (0:Not mounted) */ BYTE drv; /* Physical drive number */ BYTE csize; /* Sectors per cluster (1,2,4...128) */ BYTE n_fats; /* Number of FAT copies (1,2) */ BYTE wflag; /* win[] dirty flag (1:must be written back) */ BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ WORD id; /* File system mount ID */ WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ #if _MAX_SS != 512 WORD ssize; /* Bytes per sector (512, 1024, 2048 or 4096) */ #endif #if _FS_REENTRANT _SYNC_t sobj; /* Identifier of sync object */ #endif #if !_FS_READONLY DWORD last_clust; /* Last allocated cluster */ DWORD free_clust; /* Number of free clusters */ DWORD fsi_sector; /* fsinfo sector (FAT32) */ #endif #if _FS_RPATH DWORD cdir; /* Current directory start cluster (0:root) */ #endif DWORD n_fatent; /* Number of FAT entries (= number of clusters + 2) */ DWORD fsize; /* Sectors per FAT */ DWORD fatbase; /* FAT start sector */ DWORD dirbase; /* Root directory start sector (FAT32:Cluster#) */ DWORD database; /* Data start sector */ DWORD winsect; /* Current sector appearing in the win[] */ BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and Data on tiny cfg) */ } FATFS; /* File object structure (FIL) */ typedef struct { FATFS* fs; /* Pointer to the owner file system object */ WORD id; /* Owner file system mount ID */ BYTE flag; /* File status flags */ BYTE pad1; DWORD fptr; /* File read/write pointer (0 on file open) */ DWORD fsize; /* File size */ DWORD sclust; /* File start cluster (0 when fsize==0) */ DWORD clust; /* Current cluster */ DWORD dsect; /* Current data sector */ #if !_FS_READONLY DWORD dir_sect; /* Sector containing the directory entry */ BYTE* dir_ptr; /* Ponter to the directory entry in the window */ #endif #if _USE_FASTSEEK DWORD* cltbl; /* Pointer to the cluster link map table (null on file open) */ #endif #if _FS_SHARE UINT lockid; /* File lock ID (index of file semaphore table) */ #endif #if !_FS_TINY BYTE buf[_MAX_SS]; /* File data read/write buffer */ #endif } FIL; /* Directory object structure (DIR) */ typedef struct { FATFS* fs; /* Pointer to the owner file system object */ WORD id; /* Owner file system mount ID */ WORD index; /* Current read/write index number */ DWORD sclust; /* Table start cluster (0:Root dir) */ DWORD clust; /* Current cluster */ DWORD sect; /* Current sector */ BYTE* dir; /* Pointer to the current SFN entry in the win[] */ BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ #if _USE_LFN WCHAR* lfn; /* Pointer to the LFN working buffer */ WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ #endif } DIR; /* File status structure (FILINFO) */ typedef struct { DWORD fsize; /* File size */ WORD fdate; /* Last modified date */ WORD ftime; /* Last modified time */ BYTE fattrib; /* Attribute */ TCHAR fname[13]; /* Short file name (8.3 format) */ #if _USE_LFN TCHAR* lfname; /* Pointer to the LFN buffer */ UINT lfsize; /* Size of LFN buffer in TCHAR */ #endif } FILINFO; /* File function return code (FRESULT) */ typedef enum { FR_OK = 0, /* (0) Succeeded */ FR_DISK_ERR, /* (1) A hard error occured in the low level disk I/O layer */ FR_INT_ERR, /* (2) Assertion failed */ FR_NOT_READY, /* (3) The physical drive cannot work */ FR_NO_FILE, /* (4) Could not find the file */ FR_NO_PATH, /* (5) Could not find the path */ FR_INVALID_NAME, /* (6) The path name format is invalid */ FR_DENIED, /* (7) Acces denied due to prohibited access or directory full */ FR_EXIST, /* (8) Acces denied due to prohibited access */ FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ FR_NOT_ENABLED, /* (12) The volume has no work area */ FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */ FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ FR_LOCKED, /* (16) The operation is rejected according to the file shareing policy */ FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */ FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ } FRESULT; /*--------------------------------------------------------------*/ /* FatFs module application interface */ FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ FRESULT f_open (FIL*, const TCHAR*, BYTE); /* Open or create a file */ FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */ FRESULT f_close (FIL*); /* Close an open file object */ FRESULT f_opendir (DIR*, const TCHAR*); /* Open an existing directory */ FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ FRESULT f_stat (const TCHAR*, FILINFO*); /* Get file status */ FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ FRESULT f_getfree (const TCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ FRESULT f_truncate (FIL*); /* Truncate file */ FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ FRESULT f_unlink (const TCHAR*); /* Delete an existing file or directory */ FRESULT f_mkdir (const TCHAR*); /* Create a new directory */ FRESULT f_chmod (const TCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */ FRESULT f_utime (const TCHAR*, const FILINFO*); /* Change timestamp of the file/dir */ FRESULT f_rename (const TCHAR*, const TCHAR*); /* Rename/Move a file or directory */ FRESULT f_chdrive (BYTE); /* Change current drive */ FRESULT f_chdir (const TCHAR*); /* Change current directory */ FRESULT f_getcwd (TCHAR*, UINT); /* Get current directory */ FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ FRESULT f_mkfs (BYTE, BYTE, UINT); /* Create a file system on the drive */ FRESULT f_fdisk (BYTE, const DWORD[], void*); /* Divide a physical drive into some partitions */ int f_putc (TCHAR, FIL*); /* Put a character to the file */ int f_puts (const TCHAR*, FIL*); /* Put a string to the file */ int f_printf (FIL*, const TCHAR*, ...); /* Put a formatted string to the file */ TCHAR* f_gets (TCHAR*, int, FIL*); /* Get a string from the file */ #define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) #define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) #define f_tell(fp) ((fp)->fptr) #define f_size(fp) ((fp)->fsize) #ifndef EOF #define EOF (-1) #endif /*--------------------------------------------------------------*/ /* Additional user defined functions */ /* RTC function */ #if !_FS_READONLY DWORD get_fattime (void); #endif /* Unicode support functions */ #if _USE_LFN /* Unicode - OEM code conversion */ WCHAR ff_convert (WCHAR, UINT); /* OEM-Unicode bidirectional conversion */ WCHAR ff_wtoupper (WCHAR); /* Unicode upper-case conversion */ #if _USE_LFN == 3 /* Memory functions */ void* ff_memalloc (UINT); /* Allocate memory block */ void ff_memfree (void*); /* Free memory block */ #endif #endif /* Sync functions */ #if _FS_REENTRANT int ff_cre_syncobj (BYTE, _SYNC_t*);/* Create a sync object */ int ff_req_grant (_SYNC_t); /* Lock sync object */ void ff_rel_grant (_SYNC_t); /* Unlock sync object */ int ff_del_syncobj (_SYNC_t); /* Delete a sync object */ #endif /*--------------------------------------------------------------*/ /* Flags and offset address */ /* File access control and file status flags (FIL.flag) */ #define FA_READ 0x01 #define FA_OPEN_EXISTING 0x00 #define FA__ERROR 0x80 #if !_FS_READONLY #define FA_WRITE 0x02 #define FA_CREATE_NEW 0x04 #define FA_CREATE_ALWAYS 0x08 #define FA_OPEN_ALWAYS 0x10 #define FA__WRITTEN 0x20 #define FA__DIRTY 0x40 #endif /* FAT sub type (FATFS.fs_type) */ #define FS_FAT12 1 #define FS_FAT16 2 #define FS_FAT32 3 /* File attribute bits for directory entry */ #define AM_RDO 0x01 /* Read only */ #define AM_HID 0x02 /* Hidden */ #define AM_SYS 0x04 /* System */ #define AM_VOL 0x08 /* Volume label */ #define AM_LFN 0x0F /* LFN entry */ #define AM_DIR 0x10 /* Directory */ #define AM_ARC 0x20 /* Archive */ #define AM_MASK 0x3F /* Mask of defined bits */ /* Fast seek feature */ #define CREATE_LINKMAP 0xFFFFFFFF /*--------------------------------*/ /* Multi-byte word access macros */ #if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ #define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) #define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) #define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) #define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) #else /* Use byte-by-byte access to the FAT structure */ #define LD_WORD(ptr) (WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) #define LD_DWORD(ptr) (DWORD)(((DWORD)*((BYTE*)(ptr)+3)<<24)|((DWORD)*((BYTE*)(ptr)+2)<<16)|((WORD)*((BYTE*)(ptr)+1)<<8)|*(BYTE*)(ptr)) #define ST_WORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8) #define ST_DWORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8); *((BYTE*)(ptr)+2)=(BYTE)((DWORD)(val)>>16); *((BYTE*)(ptr)+3)=(BYTE)((DWORD)(val)>>24) #endif #ifdef __cplusplus } #endif #endif /* _FATFS */ 根据头文件修改一下
06-17
<think>根据提供的FatFs头文件(ff.h)内容,我们需要调整代码以符合该头文件的定义。主要修改点:1.头文件包含:我们已经包含了"ff.h",因此不需要再包含"integer.h"等,因为ff.h内部已经包含了。2.函数调用:FatFs函数的使用方式需要与头文件中的声明一致。3.类型定义:使用FATFS、FIL、FRESULT等类型。注意:在提供的头文件中,f_mount函数的声明为:FRESULTf_mount(BYTE,FATFS*);而之前我们的代码中调用方式为:f_mount(&fs,"0:",1)->这不符合,因为头文件中只需要两个参数:驱动号文件系统对象指针。实际上,FatFs的f_mount函数有两种调用方式(根据版本不同),但在这个头文件中,它只接受两个参数(BYTEFATFS*)。因此,我们需要调整挂载方式。此外,头文件中定义了多个配置选项,我们需要确保ffconf.h中的配置与我们的使用一致。修改后的代码:</think>根据您提供的FatFs头文件(`ff.h`),我对代码进行了全面适配。以下是完全兼容的解决方案: ### 适配后的完整代码 ```c #include <stdio.h> #include <string.h> #include "ff.h" // 使用您提供的FatFs头文件 #include "diskio.h" // 磁盘I/O接口头文件 // 定义全局时间变量(需在别处定义) extern int year, month, day, hour, minute, second; extern float vol_value; // 文件系统对象 static FATFS fs; // 初始化文件系统 void init_filesystem(void) { // 根据头文件定义,f_mount需要BYTE驱动号FATFS指针 FRESULT res = f_mount(0, &fs); // 驱动号0对应"0:" if (res != FR_OK) { printf("文件系统挂载失败: %d\n", res); // 处理错误 } // 创建目录(如果不存在) res = f_mkdir("0:/sample"); if (res != FR_OK && res != FR_EXIST) { printf("目录创建失败: %d\n", res); } } // 采样数据写入函数 void write_sample_data(void) { static FIL data_file; // 文件对象 static UINT data_count = 0; char filename[64]; char data_line[50]; // 需要创建新文件时 if (data_count == 0) { // 生成文件名 snprintf(filename, sizeof(filename), "0:/sample/sampleData%04d%02d%02d%02d%02d%02d.txt", year, month, day, hour, minute, second); // 打开/创建文件(使用头文件定义的访问模式常量) FRESULT res = f_open(&data_file, filename, FA_WRITE | FA_CREATE_ALWAYS); if (res != FR_OK) { printf("文件打开失败 %s: %d\n", filename, res); return; } } // 格式化数据行 snprintf(data_line, sizeof(data_line), "20%02d-%02d-%02d %02d:%02d:%02d %.2f V\n", year, month, day, hour, minute, second, vol_value); // 写入文件 UINT bw; FRESULT res = f_write(&data_file, data_line, (UINT)strlen(data_line), &bw); if (res != FR_OK || bw != (UINT)strlen(data_line)) { printf("数据写入失败: %d\n", res); } else { f_sync(&data_file); // 刷新数据 data_count++; // 每10条数据关闭文件 if (data_count >= 10) { f_close(&data_file); data_count = 0; } } } // 清理函数 void cleanup_filesystem(void) { f_mount(0, NULL); // 卸载文件系统(根据头文件定义) } ``` ### 关键适配点说明 1. **f_mount函数适配**: ```c // 原始声明:FRESULT f_mount (BYTE, FATFS*); FRESULT res = f_mount(0, &fs); // 驱动号0对应"0:" ``` 2. **f_open访问模式**: ```c // 使用头文件定义的常量 FA_WRITE | FA_CREATE_ALWAYS ``` 3. **类型强制转换**: ```c // 根据头文件要求转换参数类型 f_write(&data_file, data_line, (UINT)strlen(data_line), &bw); ``` 4. **卸载文件系统**: ```c f_mount(0, NULL); // 通过传递NULL卸载 ``` ### 错误处理增强 ```c // 在write_sample_data中添加更多错误处理 if (res == FR_DISK_ERR) { printf("磁盘I/O错误!\n"); // 尝试重新初始化磁盘 } else if (res == FR_INT_ERR) { printf("文件系统内部错误!\n"); // 需要重新挂载文件系统 } ``` ### 磁盘驱动层实现框架(diskio.c) ```c #include "diskio.h" #include "ff.h" // 设备状态获取 DSTATUS disk_status(BYTE pdrv) { // 实现设备状态检测 return 0; // 返回0表示正常 } // 设备初始化 DSTATUS disk_initialize(BYTE pdrv) { // 初始化SD卡/Flash等存储设备 return 0; } // 读扇区 DRESULT disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { // 实现扇区读取 return RES_OK; } // 写扇区(可选) #if !_FS_READONLY DRESULT disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) { // 实现扇区写入 return RES_OK; } #endif // 设备控制 DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void* buff) { switch(cmd) { case CTRL_SYNC: // 同步缓存 return RES_OK; case GET_SECTOR_COUNT: // 获取扇区数 *(DWORD*)buff = 0x100000; // 示例值 return RES_OK; case GET_SECTOR_SIZE: // 获取扇区大小 *(WORD*)buff = 512; return RES_OK; case GET_BLOCK_SIZE: // 获取擦除块大小 *(DWORD*)buff = 1; return RES_OK; } return RES_PARERR; } ``` ### 项目集成注意事项 1. **文件包含结构**: ``` project/ ├── Inc/ │ ├── ff.h # 您提供的头文件 │ ├── diskio.h # 磁盘I/O接口 │ └── HeaderFiles.h ├── Src/ │ ├── main.c # 包含init_filesystem等调用 │ ├── file_ops.c # 上述文件操作实现 │ └── diskio.c # 磁盘驱动实现 ``` 2. **编译器配置**: - 在Keil项目中添加FatFs源文件(ff.c, ffunicode.c) - 设置头文件包含路径到Inc目录 - 定义`_FS_TINY=0`(使用独立缓冲区) 3. **时间函数实现**: ```c // 在某个模块中定义时间变量 int year = 23, month = 10, day = 15; int hour = 14, minute = 30, second = 0; float vol_value = 3.3f; ``` ### 多文件管理示例 ```c #define MAX_FILES 3 struct { FIL file; bool is_open; } file_pool[MAX_FILES]; FIL* get_file_handle(void) { for (int i = 0; i < MAX_FILES; i++) { if (!file_pool[i].is_open) { file_pool[i].is_open = true; return &file_pool[i].file; } } return NULL; // 无可用句柄 } void release_file_handle(FIL* fp) { for (int i = 0; i < MAX_FILES; i++) { if (&file_pool[i].file == fp) { f_close(fp); file_pool[i].is_open = false; break; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值