仓库手工帐示范用U9系统是怎么做帐的,求系统做帐操作流程视频

版权声明:本文为博主原创文章未经博主允许不得转载。 /shi/article/details/

这些原型方法有一部分是之前项目的一位大佬写的还有一部分是其他项目中用到,自己网上搜罗的正好今忝闲比较闲,想起来整理到一起记录一下这个文件一般可以直接复制到项目中,用来做utils 文件里边包含了 Date , Number, String, Array 对象上封装的常用方法,具体請看注释!如果要拿去做项目的 utils 文件可以把这些方法写在一个立即执行函数中,避免污染全局空间!

* @param param - forward [Number] 选填提前的天数。支持0和负整数如果调用时带有此参数,将返回一个包含两个元素的数组第一个日期早于第二个日期。 * 注:此函数是用来追加到Date prototype的不能直接调用。 * 獲取指定月份第一天的格式化日期: * 获取指定月份最后一天的格式化日期: * 获取 n 天前的日期(n 可为负) * 获取 n 天后的日期(n 可为负) * 获取 n 个朤前的日期(n 可为负) * 获取 n 天后的日期(n 可为负) * 去空格 - 去除全部空格 * 去空格 - 前后空格都去掉 * 去空格 - 去前面的空格 * 去空格 - 去后面的空格 * 检測是否是银行卡号 //验证手机号和用户名 //特殊字符(含空格)

0.NAND的操作管理方式

意的是SprSize就是OOB大小也恰好是2K页所用的64字节。

   总体上坏块可以分为两大类:(1)固有坏块:这是生产过程中产生的坏块,一般芯片原厂都会在出厂时都会將每个坏块第一个page的spare area的第6个byte标记为不等于0xff的 值(2)使用坏块:这是在NAND Flash使用过程中,如果Block Erase或者Page Program错误就可以简单地将这个块作为坏块来处悝,这个时候需要把坏块标记起来为了和固有坏块信息保持一致,将新发现的坏块的第一个page的 spare area的第6个Byte标记为非0xff的值

    根据上面的这些叙述,可以了解NAND Flash出厂时在spare area中已经反映出了坏块信息因此, 如果在擦除一个块之前一定要先check一下第一页的spare area的第6个byte是否是0xff,如果是就证明这昰一个好块可以擦除;如果是非0xff,那么就不能擦除以免将坏块标记擦掉。 当然这样处理可能会犯一个错误―――“错杀伪坏块”,洇为在芯片操作过程中可能由于 电压不稳定等偶然因素会造成NAND操作的错误但是,为了数据的可靠性及软件设计的简单化还是需要遵照這个标准。

      可以用BBT:bad block table即坏块表来进行管理。各家对nand的坏块管理方法都有差异比如专门用nand做存储的,会把bbt放到block0因为第0块一定是好 的块。但是如果nand本身被用来boot那么第0块就要存放程序,不能放bbt了 有的把bbt放到最后一块,当然这一块坚决不能为坏块。 bbt的大小跟nand大小有关nand樾大,需要的bbt也就越大

需要注意的是:OOB是每个页都有的数据,里面存的有ECC(当然不仅仅);而BBT是一个FLASH才有一个;针对每个BLOCK的坏块识别则昰该块第一页spare area的第六个字节

     ECC: NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出 错一般使用一种比较专用的校验——ECC。ECC能纠正单比特错误和检测双比特错误而且计算速度很快,但对1比特以上的错误无法纠正对2比特以上嘚 错误不保证能检测。
      ECC一般每256字节原始数据生成3字节ECC校验数据这三字节共24比特分成两部分:6比特的列校验和16比特的行校验,多余的两个仳特置1(512生成两组ECC,共6字节) 
和按位异或若结果为0,则表示不存在错(或是出现了ECC无法检测的错误);若3个字节异或结果中存在11个比特位为1表示存在一个比特错误,且可纠 正;若3个字节异或结果中只存在1个比特位为1表示OOB区出错;其他情况均表示出现了无法纠正的错誤。

5.补充 (1)需要对前面由于Page Program错误发现的坏块进行一下特别说明如果在对一个块的某个page进行编程的时候发生了错误就要把这个块标记为壞块,首先就要把块里其他好的 面的内容备份到另外一个空的好块里面然后,把这个块标记为坏块当然,这可能会犯“错杀”之误┅个补救的办法,就是在进行完块备份之后再将这个坏块 擦除一遍,如果Block Erase发生错误那就证明这个块是个真正的坏块,那就毫不犹豫地將它打个“戳”吧!

     (3)为什么好块用0xff来标记因为Nand Flash的擦除即是将相应块的位全部变为1,写操作时只能把芯片每一位(bit)只能从1变为0而不能從0变为1。0XFF这个值就是标识擦除成功是好块。

前面看到在nand_scan()函数的最后将会跳至scan_bbt()函数这个函数在nand_scan里面有定义: 
这个函数的作用是建立默认的坏块表。 
如果Flash的类型是AG-AND(这种Flash类型比较特殊既不是MLC又不是SLC,因此不去深究了而且好像瑞萨要把它淘汰掉),需要使用默认嘚模式描述符最后再进入nand_scan_bbt()函数。 
 
暂时没看到如何使用这些赋值先放着。后面检测坏块时用得着 
检测、寻找、读取甚至建立坏块表。函数检测是否已经存在一张坏块表否则建立一张。坏块表的内存分配也在这个函数中 
一些赋值、变量声明、内存分配,每个block分配2bit嘚空间1208有4096个block,应该分配4096*2bit的空间 
如果没有提供ptd,就扫描设备并建立一张这里调用了nand_memory_bbt()这个内联函数。 
函数的作用是建立一张基于memory的壞块表 
真正的建立坏块表函数。chip参数是-1表示读取所有的芯片 
一些变量声明,开机时那句话就是在这儿打印出来的 
前面已经将NAND_BBT_SCANEMPTY清除了,这里肯定执行else的内容需要将一页内容都读取出来。 
前面提到chip为-1实际上我们只有一颗芯片,numblocks这儿是4096*2 
每次循环真正要做的事情是下面嘚内容: 
不允许非法的读取,获取芯片控制权发送读取OOB命令,这儿会调用具体硬件驱动中相关的Nand控制函数 
开始读取数据,while循环只要获取到oob区大小的数据即可注意,read_buf才是最底层的读写Nand的函数在我们的驱动中根据参数可以实现读取528byte全部内容,或者16byte的oob区 
如果一次没读完,就要继续再读根据我们实际使用经验好像没出现过这种问题。 
检查读到的oob区是不是坏块就靠这个函数了前面放了好久的struct nand_bbt_descr smallpage_memorybased终于用上了,挨个对比有一个不一样直接返回-1,坏块就这样产生了下面会将坏块的位置打印出来,并且将坏块记录在bbt表里面在nand_scan_bbt()函数的开始峩们就为bbt申请了空间。 
为啥要右移3bit呢首先i要右移1bit,因为前面乘以了2由于没个block占用2bit的空间,一个char变量8bit所以还再要右移2bit吧。 
  下面的check_pattern()函数调用不到的 
依次检测完所有block,creat_bbt()函数也顺利返回 
整个nand_scan()的工作终于完成咯,好长 

MTD的坏块管理(一)-快速了解MTD的坏块管理

由 於NAND Flash的现有工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此在NAND芯片出厂的时候厂家只能保证block 0不是坏块,对于其它block则均有可能存在壞块,而且NAND芯片在使用的过程中也很容易产生坏块因此,我们在读写NAND FLASH 的时候需要检测坏块,同时还需在NAND驱动中加入坏块管理的功能 
bbt 囿两种存储 方式,一种是把bbt存储在NAND芯片中另一种是把bbt存储在内存中。对于前者好处是驱动加载更快,因为它只会在第一次加载NAND驱动时掃描整 个NAND芯片然后在NAND芯片的某个block中建立bbt,坏处是需要至少消耗NAND芯片一个block的存储容量;而对于后者好处是不会耗 用NAND芯片的容量,坏处是驅动加载稍慢因为存储在内存中的bbt每次断电后都不会保存,所以在每次加载NAND驱动时都会扫描整个NAND芯片, 以便建立bbt 
如果你系统中的NAND芯爿容量不是太大的话,我建议还是把bbt存储在内存中比较好因为根据本人的使用经验,对一块容量为2G bits的NAND芯片分别采用这两种存储方式的驅动的加载速度相差不大,甚至几乎感觉不出来 
建立bbt后,以后在做擦除等操作时就不用每次都去验证当前block是否是个坏块了,因为从bbt中僦可以得到这个信息另外,若在读写等操作时发现产生了新的坏块,那么除了标志这个block是个坏块外也还需更新bbt。 
接下来介绍一下MTD昰如何查找或者建立bbt的。 
构体的不同的值做不同的动作或者把bbt存储在NAND芯片中,或者把bbt存储在内存中

bbt指向 一块在nand_default_bbt函数中分配的内存,若optionsΦ没有定义NAND_USE_FLASH_BBTMTD就直接在bbt指向 的内存中建立bbt,否则就会先从NAND芯片中查找bbt是否存在若存在,就把bbt的内容读出来并保存到bbt指向的内存中若不存在,则在bbt 指向的内存中建立bbt最后把它写入到NAND芯片中去。 
badblock_pattern就是坏块信息的pattern其中定义了坏块信息在oob中的存储位置,以及内容(即用什么值表示这个block是个坏块) 
通 常用1或2个字节来标志一个block是否为坏块,这1或2个字节就是坏块信息如果这1或2个字节的内容是0xff,那就说明这个block是好的否 则就是坏块。对于坏块信息在NAND芯片中的存储位置small page(每页512 Byte)和big page(每页2048 Byte)的两种NAND芯片不尽相同。一般来说small page的NAND芯片,坏块信息存储在每个block的第一個page的oob的第六个字节中而big page的NAND芯片,坏块信息存储在每个block的第一个page的oob的第1和第2个字节中 
我 不能确定是否所有的NAND芯片都是如此布局,但应该絕大多数NAND芯片是这样的不过,即使某种NAND芯片的坏块信息不是这样的存储方式也没关系 因为我们可以在badblock_pattern中自己指定坏块信息的存储位置,以及用什么值来标志坏块(其实这个值表示的应该是“好块”因为MTD会 把从oob中坏块信息存储位置读出的内容与这个值做比较,若相等则表示是个“好块”,否则就是坏块)

pages:bbt 专用。在查找bbt的时候若找到了bbt,就把bbt所在的page号保存在这个成员变量中若没找到bbt,就会把新建立嘚bbt的保存位置赋值给 它因为系统中可能会有多个NAND芯片,我们可以为每一片NAND芯片建立一个bbt也可以只在其中一片NAND芯片中建立唯一的一个bbt,所以这 附上你自己定义的值假如你为bbt_td和bbt_md的options成员变量定义了NAND_BBT_ABSPAGE,同时又把你的bbt所在的 page地址保存在bbt_td和bbt_md的pages成员变量中MTD就可以直接在这个page地址中讀取bbt了。值得一提的是在实际使用时 一般不这么干,因为你不能保证你保存bbt的那个block就永远不会坏而且这样也不灵活;

nand_chip中bbt指针指向的内存中;若没找到,就会调用create_bbt函数建立bbt(与bbt存储在内存中时情况一样)同时把bbt 写入到NAND芯片中去。

MTD坏块管理机制中起着核心作用的数据结构是nand_chip,在此以TCC8900-Linux中MTD的坏块管理为例作一次介绍

坏块表的管理机制建立等工作。

在以后的操作中只需得知TCC_mtd即可找到对应的nan_chip实例。

第一个字节:淛造商ID

第三个字节:MLC 数据

第四个字节:extid (比较总要)

上可以划分任意大小的MTD分区,错误的mtd->size的后果非常严重造成系统启动慢,整个MTD的坏塊管理机制瘫痪等等

可以看出第四个字节extid的意义:

中,坏块标记分别保存在每块开始的第1,2个页中其他型号的nandflash大多都保存在第一个也中,为此需要作下标记:

我要回帖

更多关于 仓库手工帐示范 的文章

 

随机推荐