ESP32应用教程— SD NAND(记录飞控LOG)
文章目录
前言
1 SD NAND概述
2 代码说明
3 记录Log
前言
本文基于 ESP32 芯片作为主控制器,测试 SD NAND 记录飞控 Log 功能。
关于 MCU 的存储方面,以前基本上用内置的 E2PROM,或者是外置的 NOR Flash 就可以。随着物联网的兴起,MCU 的应用越来越广泛,逐渐的 MCU 会涉及到大容量的存储需求,用来存储音频,图片(GUI)、视频缓存、协议栈等等。传统的 E2PROM 和 NOR Flash 就不够用了。这个时候 MCU 可能就需要用到 NAND Flash。
针对 MCU 需要使用大容量的存储需求,推荐一款简单易用、稳定可靠的 NAND Flash —— SD NAND 。
1 SD NAND概述
SD NAND 的架构,内部采用使用寿命最长、性能最稳定的 NAND Flash(SLC NAND Flash)晶圆,它的擦写寿命可以达到 5~10 万次。内置了 Flash 控制器和针对 NAND Flash 管理的 Firmware。对外采用通用性最强的 SD 接口(几乎所有 MCU 都带有 SD 接口)。
本文选择的是 CSNP32GCR01-AOW 芯片。
不用编写驱动程序,自带坏块管理的 NAND Flash(贴片式 TF 卡),尺寸小巧,简单易用,兼容性强,稳定可靠,固件可定制,LGA-8 封装,标准 SDIO 接口,兼容 SPI,兼容拔插式 TF卡/SD卡,可替代普通 TF卡/SD卡,尺寸 6.2x8mm。
内置平均读写算法,通过 1 万次随机掉电测试耐高低温,机贴手贴都非常方便,速度级别 Class10(读取速度 23.5MB/s,写入速度 12.3MB/s)。标准的 SD 2.0 协议使得用户可以直接移植标准驱动代码,省去了驱动代码编程环节。支持 TF 卡启动的 SOC 都可以用 SD NAND,提供 STM32 参考例程及原厂技术支持,容量:4GB,比 TF 卡稳定,比 eMMC 便宜。
2 代码说明
1. 宏定义使能 SD 卡功能
#define HAL_ESP32_SDCARD
2. 挂载 SD 卡
bool sdcard_retry(void){if(!card)return mount_sdcard();return true;} bool mount_sdcard(){printf("............Try mount.\n");sdmmc_host_t host = SDMMC_HOST_DEFAULT();host.max_freq_khz = SDMMC_FREQ_HIGHSPEED;sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();slot_config.flags = SDMMC_SLOT_FLAG_INTERNAL_PULLUP;esp_vfs_fat_sdmmc_mount_config_t mount_config = {.format_if_mount_failed = false,.max_files = 5,.allocation_unit_size = 4 * 1024};esp_err_t ret = esp_vfs_fat_sdmmc_mount("/SDCARD", &host, &slot_config, &mount_config, &card);if (ret == ESP_OK) {mkdir("/SDCARD/APM", 0777);printf("sdcard is mounted\n");update_fw();return true;} else {printf("sdcard is not mounted.\n");return false;}}3. 卸载 SD 卡
void sdcard_stop(void){unmount_sdcard();} void unmount_sdcard(){if (card != nullptr) {esp_vfs_fat_sdmmc_unmount();}}3 记录Log
1. LOG目录建立
可以看到飞控已经在 SD NAND 中成功建立 LOG 目录。
2. LOG分析
飞机通电,翻滚机身,记录飞机的姿态角。
下载日志,加载到 Mission Planner 软件。选中 ATT 字段中的 Roll 和 Pitch。可以看到曲线跟随飞机姿态变化。
至此,使用 SD NAND 替代 SD 卡,测试飞控 LOG 记录功能完成。
嵌入式基础知识归纳、笔面试预备
由于字数有限,可关注公众号获取完整原文:xfxuezhang
堆和栈的区别
数据结构中的堆和栈
栈 :是一种可以实现“先进后出 ”的存储结构。操作仅限于栈的顶部。常应用于实现递归功能方面的场景
堆 :是一种经过排序的完全二叉树 。其中,节点是从左到右 填满的,并且最后一层的树叶都在最左边;每个节点的值都小于(或者都大于)其子节点的值。因为堆有序的特点,一般用来做数组中的排序,称为堆排序。
内存分配中的堆和栈
分配方式
栈 :由编译器自动分配和释放的,处于相对较高的地址,其栈地址是向下增长的。
堆 :由程序员手动完成申请和释放,地址是向上增长的。
存储内容
栈 :主要用于存放函数的参数与局部变量等
堆 :具体存储内容由程序员根据需要决定存储数据
生存周期
栈 :其生存周期也只在函数的运行过程中,在运行后就释放,并不可以再次访问
堆 :动态内存的整个生存期是由程序员自己决定的,使用非常灵活。但必须及时释放它,否则将会导致运行的程序出现内存泄漏等错误。
分配效率
栈 :栈内存分配运算内置于处理器的指令集中,它的效率一般很高
堆 :由函数库提供,机制复杂(由链表记录空闲内存区域),分配效率比栈要低得多
内存碎片
栈 :不会存在这个问题
堆 :频繁分配和释放不同大小的堆空间会造成内存空间的不连续,从而造成大量碎片,导致程序效率降低
数据结构
满二叉树 :二叉树中除了叶子结点,每个结点的度都为 2。完全二叉树 :二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布。一颗完全二叉树上有个结点,求叶子节点个数: 除以2向上取整 二叉树性质因为所以由于该等式右边为奇数,左边的只能是偶数又因为完全二叉树中度为结点个数要么是要么是,所以只能是因此所以二叉树的性质
二叉树中,第 层最多 有 个结点。如果二叉树的深度为 ,那么此二叉树最多 有 个结点。二叉树中,终端结点数(叶子结点数)为 ,度(子树数量)为 的结点为 ,度为 的结点数为 ,则 。总结点。包含个结点的二叉树 的高度至少 为。个结点的完全二叉树 的深度为 。 表示取小于 的最大 整数。当 时,父亲结点为结点 。( 时,表示的是根结点,无父亲结点)如果 (总结点的个数) ,则结点 肯定没有左孩子(为叶子结点);否则其左孩子是结点 。如果 ,则结点肯定没有右孩子;否则右孩子是结点 。判断合法的出栈序列
按顺序入栈的序列,任意元素 e ,比 e 先入栈的元素,并且比 e 后出栈的元素,一定是逆序的。
例: 设栈的入栈序列是 1 2 3 4,则下列不可能是其出栈序列的是( )。A. 1 2 4 3B. 2 1 3 4C. 1 4 3 2D. 4 3 1 2E. 3 1 2 4
解法: 以E选项讲解
选择任意元素e ,这里选择3比3后出栈的有三个元素 1 2 4其中比3先入栈的有两个元素 1 2但是1 2是正序的,而不是逆序的所以这个序列不是合法出栈序列算法相关
排序算法的时间复杂度和空间复杂度
this指针
this指针指向被调用的成员函数所属的对象 。本质是一个指针常量 ,储存了调用他的对象的地址 。
用途:
当形参和成员变量同名时,可用this指针来区分在类的非静态成员函数中返回对象本身 ,可使用return *this特点:
只能在成员函数 中使用,在全局函数、静态成员函数中都不能使用 this 。this始终指向当前对象,静态成员函数属于类。this 指针是在成员函数的开始前构造 ,并在成员函数的结束后清除 。和函数的其他参数生命周期一样。this 指针会因编译器不同而有不同的存储位置,可能是栈、寄存器或全局变量 。编译器在生成程序时加入了获取对象首地址的相关代码并把获取的首地址存放在了寄存器中。大多数编译器是在创建对象 的时候,向ecx寄存器传递this指针。计算机网络
计算机网络笔记
TCP/IP五层模型
5、会话层 管理主机之间的会话进程,即负责建立、管理、终止 进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步 。 数据传输基本单位为:报文 。6、表示层 对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换 等。 数据传输基本单位为:报文 。7、应用层 为操作系统或网络应用程序提供访问网络服务的接口。直接为用户的应用进程提供服务(HTTP、FTP等)。 数据传输基本单位为:报文 。网络互连的中间设备 物理层 使用的中间设备称为 转发器 数据链路层 使用的中间设备称为 网桥/桥接器 网络层 使用的中间设备称为 路由器 网络层以上 使用的中间设备称为 网关 IP地址及分类 {<网络号>,<主机号>}第一个字段第二个字段网络号,标志主机或路由器所连接到的网络。主机号,标志该主机或路由器
类别网络号主机号范围A类(0)8位24位1.0.0.1 - 126.255.255.254B类(10)16位16位128.1.0.1 - 191.254.255.254C类(110)24位8位192.0.1.1 - 223.255.254.254
类别最大网络数第一个网络号最后一个网络号最大主机数A类126(2^7 - 2)1.0.0.0126.0.0.02^24 - 2B类16383(2^14 - 1)128.1.0.0191.255.0.02^16 - 2C类2097151(2^21 - 1192.0.1.0223.255.255.02^8 - 2
注:
A类网络号减2:1、IP全0表示 本网络; 2、IP 127(01111111)表示 环回 测试地址 A类主机号减2:1、全0表示所连接到的单个网络地址; 2、全1表示所有主机 B类网络号减1:1、前面两位(1 0)已经固定,不会出现全0或全1; 2、128.0.0.0不指派 B类主机号减2:扣除全0和全1的情况 C类网络号减1:1、前面两位(1 1 0)已经固定,不会出现全0或全1; 2、192.0.0.0不指派 C类主机号减2:扣除全0和全1的情况 其他 控制消息 是指网络通不通、主机是否可达、路由是否可用 等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递 起着重要的作用。IP地址放在IP数据报的首部,而硬件地址放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是硬件地址使用抽象的IP地址,而不直接使用硬件地址通信的原因:全世界存在不同的网络使用不同的硬件地址,要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,但IP编址把这个复杂问题解决了 IP首部的固定长度是 20字节 IP数据报的数据部分在 4字节的整数倍 时开始数据报能在互联网中经过的路由器的最大数值是 255 , 若把TTL初始值设置为“1”,表示 这个数据报只在本局域网中传送 划分子网的方法:从网络的主机号借用若干位作为子网号 IP地址 = {<网络号>,<子网号>,<主机号>}子网掩码:将三级IP地址的子网掩码与收到的数据报的目的IP地址逐位相与,得出所要找的子网的网络地址 无分类编制CIDR的特点:1、消除了传统的A、B、C类地址以及划分子网的概念;2、把网络前缀相同的连续的IP地址组成一个“CIDR地址块” IP = {<网络前缀>,<主机号>}CIDR斜线记法:IP地址后面加上斜线“/”,然后写上网络前缀所占的位数 网络号 的位数直接决定了可以分配的网络数 ;主机号 的位数则决定了网络中最大的主机数 。Linux相关
文件权限符号
第一个字符表示文件类型 :普通文件:-目录文件:d字符设备文件:c块设备文件:b符号链接文件:l命名管道文件:psocket文件:sr:读权限。w:写权限。x:可执行权限。-:没有权限。s:SET位可执行权限。SUID:只对二进制文件有效SGID:对普通文件和目录有效t:粘滞位权限。Sticky。在该目录创建的文件或目录只有创建者才有权限删除。-rwxr-xr-x:文件类型(普通文件-),所有者权限(r读/w写/x可执行),所属组的权限(r读/x可执行),其它用户权限(x可执行)权限属性后面有点 (.),表示该文件带有"SELinux的安全上下文";权限属性后面标记为加号 (+),表示使用了ACL(Access Control List)权限。如果文件权限后面附加一个空格 ,则表示系统没有可替换的访问控制措施。修改文件权限
chgrp(change group):改变文件所属用户组chown(change owner):改变文件所有者chmod(change mod):修改文件的权限 # 设置一个可执行文件,不让其他人修改 chmod 755 filename # -rwxr-xr-x # 让文件拥有执行权限,但不知道原权限 chmod a+x filename命令身份操作文件参数chmodu g o a+(加入) -(除去) =(设置)r w x文件或目录u = user, g = group,o = other, a = all目录结构
/ :根目录只有root用户具有该目录下的写权限/bin :用户二进制文件包含二进制可执行文件,包含常见的Linux命令。/sbin :系统二进制文件包含二进制可执行文件,但该目录下的Linux命令通常由系统管理员使用,对系统进行维护/etc :配置文件包含所有程序所需的配置文件,也包含了用于启动/停止单个程序的启动/关闭shell脚本/dev :设备文件包括终端设备、USB或连接到系统的任何设备/proc :进程信息这是一个虚拟的文件系统,包含正在运行的进程的信息。/var :变量文件可以找到内容可能增长的文件。包括:/var/log:系统日志文件/var/lib:包和数据库文件/var/mail:电子邮件/var/spool:打印队列/var/lock:锁文件/tmp :临时文件包含系统和用户创建的临时文件,系统重启后,文件都将删除/usr :用户程序包含二进制文件、库文件、文档和二级程序的源代码。包括:/usr/bin:包含用户程序的二进制文件/usr/sbin:包含系统管理员的二进制文件/usr/lib:包含/usr/bin和/usr/sbin用到的库/usr/local:包含从源安装的用户程序/home :HOME目录所有用户用home目录来存储他们的个人档案/lib :系统库包含支持位于/bin和/sbin下的二进制文件的库文件/boot :引导加载程序文件把汗引导加载程序相关的文件/opt :可选的附加应用程序包含从个别厂商的附加应用程序。附加应用程序应该安装在/opt或/opt的子目录下/mnt :挂载目录临时安装目录,系统管理员可以挂载文件系统/media :可移动媒体设备用于挂载可移动设备的临时目录常用命令
新手必须掌握的Linux命令
常见执行Linux命令的格式:命令名称 [命令参数] [命令对象]
arch:显示机器的处理器架构
uname -a:完整地查看当前系统的内核名称、主机名、内核发行版本、处理器类型等信息
uname -r:显示内核版本
文件系统
文件系统是针对于存储器分区 而言的,而非存储芯片。
基于FLASH的文件系统 (基于MTD驱动层)jffs2(Journalling Flash FileSystem v2)日志闪存文件系统主要用于NOR 型闪存,不适合容量较大的NAND。特点 :可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点 :当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。存储设备
Flash
结合ROM和RAM的长处,具备可擦除可编程的性能,不会断电丢失数据,可以快速读取数据。
NOR Flash
接口时序同SRAM,易使用读取速度较快擦除速度慢写入速度慢(需要先擦除)随机存取速度较快,支持XIP,适用于代码存储。常用于存放引导程序、根文件系统等单片容量较小NAND Flash
地址/数据线复用,数据位较窄读取速度较慢擦除速度快写入速度快顺序读取较快,随机存取速度慢,适用于数据存储。常用于存放用户文件系统等。单片容量较大嵌入式平台启动流程
系统从装有启动代码的Nor Flash启动后,初始化对应的硬件,包括SDRAM等,然后将Nand Flash上的Linux 内核读取到内存中,做好该做的事情后,就跳转到SDRAM中去执行内核了,然后内核解压(如果是压缩内核的话,否则就直接运行了)后,开始运行,在Linux内核启动最后,去Nand Flash上,挂载根文件,比如jffs2,yaffs2等,挂载完成,运行初始化脚本,启动consle交互,才允许你通过console和内核交互。至此完成整个系统启动过程。
RAM(Random Access Memory)
随机访问存储器,直接与CPU交换数据,也叫内存。可以随机读写,速度很快。断电后数据丢失。
SRAM (Static RAM)
静态RAM,速度非常快,不需要刷新电路即可保存数据。集成度较低,非常昂贵,多用于CPU的一二级缓存L1/L2 Cache。DRAM (Dynamic RAM)
动态RAM,速度比SRAM慢,需要定时刷新充电才能保存数据。比SRAM便宜很多,多用于计算机内存。DDR RAM (Double-Data-Rate RAM)
可以在一个时钟读写两次数据,使得数据传输速度加倍了相关问答
为什么nfs一直 挂载 失败-ZOL问答用NFS方式挂载根文件系统由于原来的内核是用ATBOOT的方式下载的,不知道怎么传递参数(好像不能,网上查的nfs方式都是用U-boot的方式挂载的),因此决定用u-boot重...
flash烧录和ic烧录?,IC烧录设备该怎么选,都来说说?[回答](烧uboot和内核)比如直接nanderase全擦除。然后再把文件写到内存tftp内存地址文件名然后再nandwrite进去的。根文件系统是把板子分区挂载起来后再烧...
帮个忙诸位老司机!有人知道吗 定西水培牧草设备原理及参数...[回答]这个才1W字难度太大。。。而且说得明白都可以出书了。。。大体上就是挂载到操作系统的抽象接口。驱动是以模块化加载到操作系统中,首先init()函数启...