yaffs2 图表详解

yaffs2源代码分析(最新版) 曾经,有位叫斑点的大牛,写了一篇yaffs2源代码分析,全网都在转载,但是我研读这片好文的时候,真心不爽,因为这篇所使用的yaffs2源代码太老了,现在看很多都对不上啊,那就本人自告奋勇的把里面的源码更新一遍,整体重新学习一遍,奉献给大家! 阅读详情
YAFFS(2)
2008-12-16 20:07

Spare所儲存的資料如下所示:

Image:yaffs_10.jpg


圖十

  • Tags:
  • chunkID:指相對於此yaffs_Object的第幾個Chunk。當Chunk ID為0時,則表此Chunk所儲存的是yaffs_ObjectHeader。
  • serialNumber:用以辨別哪個Chunk為最新的Chunk。當更新此Chunk時,其serialNumber會加1並寫入 至其他Block的Chunk中,並將原Chunk的設為Invalid(表此Data Chunk已無效),但若在將該Chunk設為Invalid之前則發生了斷電(Power Lost)的突發事件,當電源回復並再重新掃描Flash Memory時,會檢查某一yaffs_Object到有兩個一樣的Chunk(其ChunkID相同),但其serialNumber不同,則會比較此 二Chunk的serialNumber,以辨別出哪個Chunk為較新的Data,並將較舊Data的Chunk設為Invalid。如下表所示:

Image:yaffs_11.jpg

Image:yaffs_12.jpg

說明:
當系統發現有兩個相同chunkID的chunk,則檢查兩個chunk的serialNumber。此圖可確定serialNumber為2的必定比 serialNumber為1的還新,則將serialNumber為1的chunk設為Invalid。
說明:
若兩chunk的serialNumber如上,則比較方法為將其中一個chunk的serialNumber值取出,並做 (serialNumber+1) mod 4,運算後的值x。若x等於另一個chunk的serialNumber,表示此chunk為較新的,則把另一個chunk設為Invalid。此圖即可 確定serialNumber為0的較serialNumber為3的更新。

 

* byteCount:表示該yaffs_Object佔此Chunk多少個Byte。
  • objectID:此Chunk屬於哪個Object的Objecct ID。
  • ECC:Tags的Error Correction Code。
  • unusedStaff:保留未使用的欄位。
  • ECC Data:Data Chunk的Error Correction Code。
  • Page Status:當值為0時,表示此值為Invalid。
  • Block Status:保留未使用的欄位。

3.2 Tree Node Structure(Tnode Structure)

  系統欲存取裝置上的Data時是以Logical Address(相對於該File所產生出來的偏移位址)的方式到所指定的位址進行存取,若欲到實體儲存裝置上取得Data,則須再經過一個機制的轉換, 將Logical Address轉換為Physical Address(實際儲存裝置的位址),才可從儲存裝置上讀出Data至RAM中。這個機制最簡單的方法就是在RAM上建立一個Logical Address到Physical Address的對映表格(Mapping Table)。直接將Logical Address對映至Physical Address。如圖十一所示: Image:yaffs_13.jpg


圖十一-在RAM中建立Logical Address對應至Physical Address的對映表格

在YAFFS中也使用了Logical Address到Physical Address 的對映機制。所使用的機制稱之為Tree Node Structure或Tnode Structure。

  Flash Memory掛載時,YAFFS會為每個File在RAM中建立一個Tree,當有一個要求要存取某個Chunk(或Logical Address)時,則會經由Tree Node Structure的轉換方式,找到Chunk的Physical Address。

使用Tree Node Structure的優點為位址轉換時間較迅速。Tree Node Structure的轉換Time Complexity為O(log N),若是直接使用Logical Address to Physical Address的Mapping Table,則位址轉換為線性搜尋(Linear Search),此種搜尋方式的Time Complexity為O(N)。YAFFS採用此種方式來做為位址轉換的機制可提升整體的存取速度。

  Tree Node Structure是由多個Tree Node(或Tnode)所組成。依據Level的不同而分成兩個部份:

  • Internal Tnode:每個Internal Tnode由8個Pointers所組成。
  • Lowest-Level Tnode(Level 0 Tnode):每個Lowest-Level Tnode由16個Entries所組成。

Image:yaffs_14.jpg


圖十二

在Tree建立好後,當系統發出要存取該File的某個Chunk時,例如:Chunk 0x235,就要在Tree上做Traverse的動作,以找尋到要求的Chunk。Traverse的步驟如下:

1. 將十六進制轉化為二進制:0x235  0000001000110101

2. 將二進制切割成000.000.100.011.0101,每一個切割區代表一個Level,由於Lowest-Level包含有16個Entries, 因此切割出4個Bit(Bit 3 to 0)。Internal Level的Tnode皆包含8個Pointer,因此其餘皆切割為3個Bit。

3. 根據所切割出來的Bit整理成下表:

LevelBitsSelected Value
3 or more if they exist>=10Zero
29 to 7100 binary = 4
16 to 4011 binary = 3
03 to 00101 binary = 5

4. 根據表格中各Level的值進行Traverse。

Step1:Level 2100=4Step2:Level 1011=3

Image:yaffs_15.jpg

Image:yaffs_16.jpg

Step3:Level 00101=5

Image:yaffs_17.jpg

當Tree Node Structure剛開始建立時,僅會建立Lowest-Level Tnode,當File所配置的Chunk數超過16個時,則此Tree會建立一個internal Tnode,並將其第0個Pointer指向原本的Lowest-Level Tnode。當讀取到的Chunk數愈來愈多時,會一直新增Tnode,且Tree亦會愈來愈高,其Max-Level最大為6。

Step1Step2

Image:yaffs_18.jpg


Image:yaffs_19.jpg

Step3Step4

Image:yaffs_20.jpg

Image:yaffs_21.jpg

  在File已在RAM建立好Tree Node Structure後,若此File的Size變大時,則會再多配置Chunk給此File,在將Data寫入至Page後,則會去更新File的 Tree Node Structure,將新配置到的Chunk加入至Tree Node Structure中,更改步驟如下:

1. 搜尋新配置到的Chunk ID。

2. 若在Internal-Level搜尋的過程中,發現沒有Tnode,則建立一個Internal-Level的Tnode。

3. 當搜尋到Lowest-Level時,若也無Tnode存在,則建立一個Lowest-Level的Tnode。

4. 根據Chunk ID中Level 0所代表的值x,到Lowest-Level Tnode中的第x個Entry中檢查有無該Chunk的實體位址存在,若沒有則將實體位址填入該Entry,若已存在則將比較兩Chunk在Spare 中的serialNumber,將較新的Chunk的實體位址寫入該Entry中,並將舊的Chunk設為Invalid。

1. 搜尋新配置到的Chunk ID2. 在Internal-Level搜尋過程中,發現無Tnode存在,建立一Tnode

Image:yaffs_22.jpg

Image:yaffs_23.jpg

3. 在搜尋過程中,發現無Lowest-Level Tnode存在,則建立一Lowest-Level Tnode,並將該Chunk ID寫入對應的Entry中

Image:yaffs_24.jpg

3.3 YAFFS Garbage Collection

Garbage Collection主要是用於將已不必要存在且浪費空間的Block做回收的動作,以增加可用的Block數。而Garbage Collection只有某些事件發生時才會執行。

在YAFFS中只有在下列事件發生時會執行Garbage Collection:

  • 將Data寫入Flash Memory
  • 更新yaffs_ObjectHeader

而YAFFS的Garbage Collection又分成兩種Mode:Aggressive Mode及Passive Mode,其相異點如下表所示:

Aggressive ModePassive Mode
執行條件ErasedBlocks <= (PreservedBlocks + 1)
ErasedBlocks:空Block數
PreservedBlocks:保留Block數
ErasedBlocks > (PreservedBlocks + 1)
檢查回合數Iterations = (EndBlock-StartBlock) + 11. Iterations=(EndBlock-StartBlock) + 1
2. Iterations = Iterations / 16
3. Iterations = 200 if Iterations >200

 

  YAFFS的Garbage Collection執行步驟如下:

1. 從currentDirtyChecker到End Block之間尋找Dirtiest Block(包含最多Invalid Chunk的Block)

Image:yaffs_25.jpg

圖十三

2. 將currentDirtyChecker重置至所發現的Dirtiest Block的位置

Image:yaffs_26.jpg

圖十四

3. 將Dirtiest Block中的Valid Page複製至其他的Empty Chunk中。

Image:yaffs_27.jpg

圖十五

4. 再將Dirtiest Block清除成Empty Block。

Image:yaffs_28.jpg

圖十六

3.4 Wear-Leveling

  當Flash Memory在使用時,常常會對Flash Memory內的某個檔案做修改的動作,若此時檔案的大小更動而需要更多Page時,且在Flash Memory內仍有空的Block,則會配置空的Block給該檔案,若Flash Memory內已無空的Block,則會執行Garbage Collection的動作,清出空的Block以供使用。而在挑選空Block或使用Garbage Collection時挑選Dirtiest Block時,可能會造成部份的Block常常被挑選,而其他Block則很少被挑選配置。

Image:yaffs_29.jpg

圖十七

由於Flash Memory的特性,那些常常被挑選的Block可能會因為過度的使用而造成損毀,為了避免這種負擔不均的情形發生,因此在大部份的Flash- Specific File System上都會設計一種方法以避免此種情形發生,此方法即稱為Wear-Leveling。

使用Wear-Leveling時,在挑選Block時不會常常固定在某幾個Block上,而可使大部份Block的存取次數能夠平均,不會造成部份Block過度存度而造成毀損。 Image:yaffs_30.jpg

圖十八

工业级嵌入式Android系统移植与优化实战:从MPC8536平台到性能调优 嵌入式系统开发中,操作系统移植是连接硬件平台与应用生态的核心技术。其原理在于通过板级支持包(BSP)和硬件抽象层(HAL)适配特定处理器架构与外设,使上层软件栈能在目标硬件上稳定运行。这项技术的价值在于能复用成熟的操作系统生态,大幅缩短复杂功能(如现代图形界面、网络协议栈)的开发周期。在工业控制、网络设备和媒体处理等场景,它让设备在保持高可靠性与高性能的同时,获得了智能手机般的交互体验与快速应用开发能力。本文以飞思卡尔MPC8536-ADK评估套件为具体案例,深入探讨了将Android系统移植到PowerP 阅读详情

相关推荐

嵌入式存储实战:GPMC控制器与NAND Flash接口配置及硬件ECC详解

在嵌入式系统设计中,外部存储器控制器是连接处理器与存储芯片的关键桥梁,负责管理复杂的时序协议与数据流。其核心原理在于通过可配置的时序参数,精确控制地址、数据和控制信号的建立与保持时间,以适配不同存储器的访问特性。这项技术的核心价值在于,它能以统一的硬件接口抽象底层差异,显著提升系统访问外部存储的可靠性与性能,是构建稳定嵌入式存储子系统的基础。在数据存储领域,NAND Flash因其高密度、低成本而广泛应用,但其固有的位错误率要求必须引入纠错码(ECC)机制来保障数据完整性。硬件ECC引擎通过在数据读写路径上

weixin_30786657的博客 394

【转载】 YAFFS 自学書面報告

转自http://esslab.tw/wiki/index.php/YAFFSYAFFSFrom ESSLabWikiJump to: navigation, searchIndependent Study 書面報告指導教授:張立平 教授學生:黃千庭目錄一、摘要二、動機三、YAFFS基本架構及運作3

basin9901的专栏 1284

yaffs2文件系统实现原理分析-带书签

很详细的介绍yaffs2的数据结构,初始化,挂载,内存分布等。新手必看,老手回顾。

Yaffs文件系统

yaffs文件系统

wangxiandou的博客 910

yaffs2文件系统制作详解

s3c2440下 yaffs2文件系统制作详解,本人实践成功

yaffs2文件系统实现原理分析

YAFFS(Yet Another Flash File System)是由Aleph One公司所发展出来的NAND flash 嵌入式文件系统。 在YAFFS中,最小存储单位为一个Page,文件内的数据是存储在固定512 bytes的Page中,每一个Page亦会有一个对应的16 bytes的Spare(OOB,Out-Of-Band)。YAFFS采用Tree Node Structure,由多个Tree Node(Tnode)所组成,Tnode又分成Internal Tnode与Lowest-Level Tnode,其中Internal Tnode由8个Pointers所组成,Lowest-Level Tnode由16个Entries所组成,其时间复杂度(Time Complexity)相当于O(log N),故地址转换时间较迅速。一旦Flash Memory挂载(mount)之时,YAFFS会为每个文件在RAM中创建一个Tree, 并随时提供Chunk(即Page, 由yaffs_Object所配置),可是 YAFFS并未完全实现耗损平均技术(wear-leveling)算法,因此还是会造成部份的Block过度访问。

Linux内核---26.yaffs2的tnode分配与释放

Linux内核---26.yaffs2的tnode分配与释放

wangcong02345的专栏 1351

yaffs2文件系统.pdf

yaffs2 linux bsp YAFFS意义为‘yet another flash file system’,是一个开源的文件系统。是专门为NAND闪存设计的,它的出现使得价格低廉的NAND闪存芯片具有了高效性和健壮性。  YAFFS文件系统性能优越且易于移植,已经成功应用于linux、uClinux和Windows CE等嵌入式操作系统上。 YAFFS是目前为止唯一一个专门为NAND flash设计的文件系统,目前有YAFFS 和YAFFS2 两个版本,两个版本的主要区别之一在于YAFFS2 能够更好的支持大容量的NAND FLASH芯片。

linux 文件系统构建之初步了解yaffs

http://blog.sina.com.cn/s/blog_a20257d80101ku70.html 第一,yaffs简介     yaffs也是一个flash文件系统,它于2001年由CharlesManning命名,当时CharlesManning创建的。现存的的flash文件系统杂乱还不能丢弃,但可以提出另一种flash文件系统,这个系统就是yaffs文件系统,yaffs文件系统

leonan的专栏 1415

Yaffs文件系统原理详解

本文详细介绍了Yaffs文件系统的原理,是很好的学习Yaffs文件系统的资料!

保姆级教程:手把手教你为STM32F407和W25Q128制作Keil MDK的SPI Flash下载算法(FLM文件)

本文提供了一份详细的教程,指导开发者如何为STM32F407和W25Q128制作Keil MDK的SPI Flash下载算法(FLM文件)。从理解下载算法的核心机制到实现FlashPrg.c的核心操作,再到链接脚本与地址映射实战,手把手教你完成定制化SPI Flash下载算法的开发与优化。

weixin_28716769的博客 408

Yaffs2图表详解

Spare所儲存的資料如下所示: 圖十 Tags:chunkID:指相對於此yaffs_Object的第幾個Chunk。當Chunk ID為0時,則表此Chunk所儲存的是yaffs_ObjectHeader。serialNumber:用以辨別哪個Chunk為最新的Chunk。當更新此Chunk時,其serialNumber會加1並寫入 至其他Block的Chunk中,並將原C

abc94的专栏 859

如何使用windows搭建一个公网ftp/sftp服务器

在有公网ip的情况下,使用windows系统搭建一个ftp/sftp服务器会带来很多的方便,可以实现远程移动端的一键式访问,对于文件的备份、多设备的共享都十分的方便。然而网上许多的教程都是基于windows自带的iis搭建一个局域网ftp服务器,然而在搭建好后,我想要通过端口映射的方式实现在外网访问时,却发现连接不上的问题,感觉可能是因为windows家庭版的原因导致的。因此在查阅很多资料之后终于找到了一个公网ftp/sftp服务器的搭建方式,实测可用。这里把流程记录一下,做一个备忘录,也方便大家搭建。

weixin_43354138的博客 1万+

yaffs2图表详解

http://blog.youkuaiyun.com/yinxusen/article/details/6431258

611

RK3588 EVB开发板原理图讲解【六】

该原理图展示了eMMC Flash与主控芯片之间的连接关系,以及相关的电源、信号线路和去耦电容等。

weixin_48721556的博客 1171

深入理解HanLP1.x,填平可能遇到的坑

提取指定数量的摘要。自定义词典为什么要单独领出来讲呢?因为在我们的业务开发中,可能分词的效果并不理想,需要定制自己的词库,索引更加常用。例如:小米su7特斯拉modelY比亚042025款6575767670908我们需要分出小米su72025款等词。我们分别看看用字典和不用字典的效果。

static_coder的博客 977

AI工具优化毕业论文任务书的7大技巧与平台评测

学术写作中的任务书撰写是研究工作的基础框架,其质量直接影响后续研究进程。现代AI写作辅助工具通过自然语言处理技术,能够智能识别学术文本的结构缺陷、语法错误和术语不规范等问题。从技术实现看,这类工具通常结合规则引擎与深度学习模型,在保持学术严谨性的同时提升写作效率。对于需要处理大量专业术语的论文写作,AI工具内置的学科特定模板和术语库尤为实用。测试显示,组合使用aibye的结构诊断、Paperpal的术语校验以及Grammarly的语法修正等功能,可使任务书修改工作量减少40%。特别是在量化研究、实证分析等需

weixin_33816821的博客 439

HLM(多层线性模型)在stata中语句

在阅读CEPS中发现有些研究采用的是HLM模型,HLM简单来说用一个方程跑两个回归。举例,对学习成绩影响因素,不同层有不同的影响,如在个体层面上个体特征会对成绩产生影响,在学校层面学校排名等因素会对成绩产生影响,两种因素不在一个层面,每层造成的差异都不相同。 在找相关语句时候发现操作这个语句的软件大多是SPSS和HLM,对于stata操作者并不友好。因此,在有限资料中总结了HLM在stata中的语句,后面会附上学习视频和链接。 先放语句,后面对方程式一个大致解析。由于针对HLM有一本书的介绍,可能一篇文章无

weixin_44652251的博客 1万+

不只是安装:用 Binwalk 分析路由器固件前,你必须搞定的这10个依赖项(附国内源加速)

本文详细介绍了使用Binwalk分析路由器固件前必须安装的10个关键依赖项,包括Python环境、加密处理库、可视化工具、反汇编引擎等,并提供了国内镜像源加速方案,帮助用户快速搭建完整的工具链环境。

weixin_30664051的博客 379

STM32步进电机控制三大方案:GPIO/定时器/PWM深度对比

步进电机控制是嵌入式运动控制的基础技术,其核心在于精确生成脉冲(PUL)、方向(DIR)和使能(EN)三路数字信号。原理上,脉冲频率决定转速,脉冲数量决定位置,方向电平决定转向,而使能时序保障驱动器可靠启停。该技术具有高定位精度、开环稳定性与低成本优势,广泛应用于3D打印机、CNC设备、自动化产线等场景。在STM32平台实现时,需兼顾硬件隔离设计(如6N137光耦)、HAL库抽象封装及实时性约束。本文围绕GPIO模拟、定时器中断与PWM比较输出三种主流方法,系统剖析其时序机制、CPU开销、抗干扰能力与工业适

weixin_35755640的博客 86

51单片机入门指南-基于STC89C52(持续更新)

一、环境介绍 编程IDE: keil5 单片机型号: STC89C51/52 开发板: 普中科技的开发板 完整PDF资源下载地址:https://download.youkuaiyun.com/download/xiaolong1126626497/19785856 二、51单片机开发手册介绍 2.1 前言 51单片机是对所有兼容Intel 8031指令系统的单片机的统称。 该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最.

8798

3分钟识破加密固件:binwalk熵分析实战指南

你是否曾面对一个未知固件文件束手无策?不知道其中是否包含加密数据?binwalk的entropy模块正是识别这类难题的利器。本文将带你掌握熵分析技术,3分钟内识别固件中的加密区域,为后续逆向工程铺平道路。 读完本文你将学会: - 理解熵值与数据的关系 - 使用binwalk熵分析模块的完整流程 - 解读熵值图表识别特征 - 结合签名验证提升检测准确率 ## 什么是熵分析? 熵(Entropy...

gitblog_00132的博客 1126

Java语音革命:用代码打造永不疲倦的AI客服,让客户支持效率飙升300%!

客户支持领域常面临“薛定谔困境”,即无法预知客户来电的意图是投诉还是表扬。通过Java技术,尤其是语音识别和自然语言处理(NLP),可以有效解决这一问题。文章展示了如何利用Java代码构建“声纹量子引擎”,实现客户支持的自动化。核心技术包括录音与预处理、语音识别和语义理解。通过百度AI API和Stanford NLP,系统能够快速、准确地识别客户语音并理解其意图。数据表明,优化后的AI处理时间从15分钟缩短至18秒,语音识别准确率提升至98.5%,并发处理能力达到单实例1000+请求。这些技术显著提升了客

墨夶的博客 1035

移动取证实战(一)

手机取证是在取证条件下从手机中检索数据的科学。这是我们成功的《实用移动取证》书籍的第四版,深入探讨了移动取证的概念及其在当今世界的重要性。本书侧重于教授您在各种移动平台上调查移动设备的最新取证技术。您将学习多个操作系统版本的取证技术,包括 iOS 12、iOS 13、Android 9、Android 10 和 Windows 10。您将深入了解最新的开源和商业移动取证工具,使您能够有效地分析和检索数据。您将学习如何检查设备,从云中检索数据,并成功记录调查报告。您将探索应用程序的逆向工程和识别恶意软件的方法

龙哥盟 980

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

2024终极指南!Binwalk支持的150+文件格式全解析,固件分析从此不再卡壳

Binwalk是一款强大的固件分析工具,能够帮助开发者和安全研究人员快速识别、提取和分析固件中的各种文件格式。无论是嵌入式设备固件、压缩文件还是系统镜像,Binwalk都能提供精准的格式识别和提取功能,是固件逆向工程领域不可或缺的利器。 ## 🚀 Binwalk核心功能展示 Binwalk的主要优势在于其强大的签名识别系统和文件提取能力。通过分析固件二进制数据,它能够自动识别其中包含的各种文

gitblog_00213的博客 452

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

FreeRTOS v11.0.1 与 RT-Thread v5.0.2 选型对比:5个维度实测与项目适配指南

本文深入对比了FreeRTOS v11.0.1与RT-Thread v5.0.2在嵌入式实时操作系统领域的五大核心维度,包括内存占用、任务调度、外设支持、开发体验和生态成熟度。通过实测数据和项目适配指南,为开发者提供基于硬件资源、团队能力和功能需求的选型建议,帮助优化嵌入式系统设计。

weixin_30463341的博客 279

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: yaffs2 源码分析
下一篇: 代码备份
yinxusen
博客等级 码龄18年 46粉丝 82原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值