//创建或扩展蔟链
//返回值:
//0表示没有空蔟
//1表示内部错误
//0xFFFFFFFF表示磁盘错误
//其他值:表示蔟链上最后新加的蔟号
/*
如果clst为0表示创建新的蔟
则从最后分配的蔟开始,往后循环扫描看有没有空蔟
如果最后分配的蔟为0,表示还没有分配过蔟,则从1号蔟开始,往后循环扫描看有没有空蔟
如果clst为1,表示在fat表中1号蔟的fat表条目下扩展蔟
1号蔟条目的值为系统使用,此时会返回磁盘错误。
如果clst大于1,表示在fat表中clst号蔟的fat表条目下扩展蔟
则先判断下clst号蔟的fat表条目中是不是已经记录了下一个蔟,记录了则直接返回,已经指向下一个蔟了
如果不是指向了下一个蔟,则从当前clst蔟开始,往后循环扫描看有没有空蔟
如果空蔟个数为0,则直接返回没有空蔟了。
查找下一个空蔟:
1、首先判断下当前蔟+1的蔟是不是空蔟,是就表明找到了,不是则再循环找
2、从当前蔟开始,递增循环找,找到空蔟则返回蔟号,每找到返回无空蔟
找到了就记录最后分配的蔟号、将空蔟计数器递减、fsi更新
*/
static DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */
FFOBJID* obj, /* Corresponding object */
DWORD clst//0表示创建新的蔟链,其他值表示扩展蔟链。/* Cluster# to stretch, 0:Create a new chain */
)
{
DWORD cs;
DWORD ncl;///下一个蔟
DWORD scl;//起始蔟
FRESULT res;
FATFS *fs = obj->fs;
if (clst == 0) {
//创建一个新的蔟链。/* Create a new chain */
scl = fs->last_clst;//从最后分配的蔟作为起始蔟。/* Suggested cluster to start to find */
if (scl == 0 || scl >= fs->n_fatent) //如果为0或者大于fat表条目数
scl = 1;//则从1号蔟开始
//last_clst为0表示还没有分配过蔟,因此开始蔟为1,则下一个蔟就为2号蔟。从2号蔟开始找
}
else {
//扩展一个蔟链。/* Stretch a chain */
//如果是扩展蔟链
//则先读取当前蔟的fat表中条目值
//如果条目值中已经指向下一个蔟了,则直接返回下一个蔟号