现在只想到这些问题,百思不得其解,希望大神给解决下,谢谢!
一、在FLASH模拟EEPROM试验中提到“该函数的实现基本类似第 25 章的 SPI_Flash_Write 函数,不过该函数对写入地址是有要求的,必须保证以下两点:1, 该地址必须是用户代码区以外的地址。2, 该地址必须是 2 的倍数。”
1、那么我写入数据时如何知道代码区以外的地址是多少呢?
二、我们在 STM32 FLASH 写入的时候,需要一个 1024 字节的 16 位数组,实际上占用了 2K 字节,而这个数组几乎只能给 STMFLASH_Write 一个函数使用,其实这是非常浪费内存的一种做法,好的办法是:我需要的时候,申请 2K 字节,用完了我释放掉。
1、FLASH模拟EEPROM是为了掉电保存还是为了申请堆?
2、如果是为了申请堆,那么为什么自己写mymalloc而不直接用malloc呢?
三、从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n
块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。
const u32 memtblsize=MEM_ALLOC_TABLE_SIZE; //内存表大小
const u32 memblksize=MEM_BLOCK_SIZE; //内存分块大小
const u32 memsize=MEM_MAX_SIZE; //内存总大小
1、内存表、内存块在随着动态分配时不是需要改变吗?那么为什么他是固定的?
//内存参数设定.
#define MEM_BLOCK_SIZE 32 //内存块大小为32字节
#define MEM_MAX_SIZE 42*1024 //最大管理内存 42K
#define MEM_ALLOC_TABLE_SIZE MEM_MAX_SIZE/MEM_BLOCK_SIZE //内存表大小
2、这个内存管理的数据都是在堆中吗?还是在什么地方?
四、文件系统中DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void *buff )接口:
1、在文件系统中,GET_SECTOR_SIZE、GET_BLOCK_SIZE、GET_SECTOR_COUNT这三者我在网上看见几种不同的答案,看完了不知道我理解的对不对,第一个代表扇区大小,如果SD卡的话,那么就把buff装512返回就行了码?第二个代表簇大小,也就比如现在一个簇中有4个扇区,那么把buff返回4吗?第三个是SD卡总容量,也就比如现在1G的SD卡,那么buff返回1024 *1024吗?
五、在exfuns工程中,为什么需要申请这几个内存?我看有个例子没有加这个也可以用。
u8 exfuns_init(void)
{
fs[0]=(FATFS*)mymalloc(sizeof(FATFS)); //为磁盘0工作区申请内存
fs[1]=(FATFS*)mymalloc(sizeof(FATFS)); //为磁盘1工作区申请内存
file=(FIL*)mymalloc(sizeof(FIL)); //为file申请内存
ftemp=(FIL*)mymalloc(sizeof(FIL)); //为ftemp申请内存
fatbuf=(u8*)mymalloc(512); //为fatbuf申请内存
if(fs[0]&&fs[1]&&file&&ftemp&&fatbuf)return 0; //申请有一个失败,即失败.
else return 1;
}
|