📄 flash.txt
字号:
/*************************************************************************************************/
// flash的分配
//
// 编程日志 第 0 - 9 扇区(10)
// 报警日志 第 10 - 19 扇区(10)
// 操作日志 第 20 - 29 扇区(10)
// 任务 第 30 - 7069 扇区(64 *110 = 7040)
// 其它数据 第 7070 - 7679 扇区(用来存放别的数据)
// 备份区 第 7680 - 8126 扇区(要是以上的扇区坏了就从这个备份区中找一个好的扇区映射过去)
// 文件索引区 第 8128 - 8191 扇区(64个扇区, 主文件索引表8128 - 8159(32个扇区), 从文件索引表达式8160 - 8191(32个扇区), 只要文件索引区中有一个扇区是坏的就认为这个flash不可用)
//
// 每个文件索引项是两个字节的长度.
//
// 文件索引表分为主文件索引表和从文件索引表,
// 如果主文件索引坏了,则用从文件索引表
//
// flash一共有8192个扇区, 每个扇区对应一个文件索引项, 每个文件索引项占用两个字节, 而每个扇区最大的容量是512个字节,
// 则文件索引表所在占用的扇区的个数为:
// 8192 * 2 / 512 = 32 个扇区
//
//
// 文件索引项描述符
// --------------------------------------------------
// | 15 | 14 | 13 - 0 |
// |----------|-------------|-----------------------|
// | 0 | 0 | 对应扇区的编号 |
// |----------|-------------|-----------------------|
//
//
// 备份区对应的文件索引项描述符
// --------------------------------------------------
// | 15 | 14 | 13 - 0 |
// |----------|-------------|-----------------------|
// |使用标志 | 好坏标志 | 对应扇区的编号 |
// |----------|-------------|-----------------------|
// | 0:未用 |0 : 好 | |
// | 1:已用 |1 : 坏 | |
// --------------------------------------------------
//
//
/*************************************************************************************************/
1: unsigned int mk_fs_flash(void)
//建立文件系统
//刚开始时认为每个扇区都是好的.
//因此将文件索引表中的每一项都指向每一个扇区(第i项指向第i个扇区,如: 第0项的值为0x0, 第1项的值为0x1, 第2项的值为0x2)
//建立主从文件索引表, 主文件索引表从第8128 - 8159扇区(32个扇区), 从文件索引表从8160 - 8191个扇区(32个扇区),
//只要文件索引区(8128 - 8191)中有一个扇区是坏的就认为这个flash不可用
//变量: file_index_startblock 表示文件系统的所在位置的起始扇区
//返回值如果为DATAFLASH_OK(0x1)就认为是成功
//否则返回DATAFLASH_BUSY(0x0) 或 DATAFLASH_ERROR(0x2)
2: unsigned int check_mk_fs(void)
//这个函数是为了测试用的,为了测试mk_fs_flash()建立的文件索引表是不是真的写对了.
//
//检验建立的文件系统是否是正确的
//返回值如果不为DATAFLASH_OK就认为是错的
3: unsigned int read_fs_index(unsigned char *fs_buf, unsigned int block_number)
//功能:
// 读文件索引表中指定的扃区
//参数:
// fs_buf: 将要读出来的内容存放在这个缓冲区中
// block_number: 是指要读的文件索引表的扇区号, block_number = 0 ,表示读文件索引表的第0个扇区,也就是读第8128个扇区.
// block_number = i ,表示读文件索引表的第i个扇区,也就是读flash的第 8128 + i 个扇区
// 先从主文件索引表读出当前的扇区
// 如果读出成功(能正常的读出来,并且算出的cs和它原来的cs相等),则返回 1
// 否则续继读从文件索引表相应的扃区
// 如果读出成功(能正常的读出来,并且算出的cs和它原来的cs相等),则返回 1
// 否则返回0
4: unsigned int write_fs_index(unsigned char *fs_buf,unsigned int block_number)
//功能:
// 写文件索引表中的扇区
// block_number: 是指要写的文件索引表的扇区号, block_number = 0 ,表示写文件索引表的第0个扇区,也就是写第8128个扇区.
// block_number = i ,表示写文件索引表的第i个扇区,也就是写flash的第 8128 + i 个扇区
// 先写主文件索引表相应的扇区
// 再写从文件索引表相应的扇区
// 如果有一个以上能写成功则返回 1
// 否则返回0
5: unsigned int read_flash_block(unsigned char *buf, unsigned int block_number)
//读flash的一个扇区
//buf: 将读出来的内容存放在这个缓冲区中
//block_number: 要读的扇区号
//成功则返回DATAFLASH_OK (0x1)
//否则返回0x0 或 0x2
6: unsigned int write_flash_block(unsigned char *buf, unsigned int block_number)
//写flash的一个扇区
//buf: 要写的内容
//block_number: 要写到哪一个扇区中去
//成功则返回 DATAFLASH_OK (0x1)
//否则返回 DATAFLASH_BUSY(0x0) 或 DATAFLASH_ERROR(0x2) 或 0x3(写时校验出错)
//具体流程:
// 等待就绪,如果在一段的时间内没有就绪则错误返回
// 写flash.如果写不成功,则返回
// 等待就绪,如果在一段的时间内没有就绪则错误返回
// 发一个校验命令,如果不成功如果不一样, 不成功则错误返回
// 比较要写的内容和已写的内容是不是一样, 不一样则错误返回
7: unsigned int find_empty_block(void)
/功能:
// 从备份区(7680 - 7679)中找出一块好的未用的扇区
// 它对应于文件索引表中的第30块扇区所有的数据项(0 - 255)
// 和第31块扇区中的第0 - 191项(192 - 255 这64项对应于文件表所占用的扇区)
//返回值:
// 如果能找到则将这个扇区置为已用,返回这个块扇区的编号
// 否则返回0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -