嵌入式Linux系列第5篇:Nand Flash根文件系统制作
1.引言
之前系列的文章介绍了如何编译Uboot、Kernel以及使用默认的ramdisk根文件系统来构建一个完整的嵌入式Linux系统,本篇文章介绍如何从头制作一个放在NAND Flash上的根文件系统。经过我这段时间的总结,rootfs相关的编译、配置等工作还是比较麻烦的。所以你可能会看到一般做核心板的第三方厂家会建议初学者直接使用现成提供的文件系统,比如一个做NUC972核心板的厂家,其文档里这么描述:
再比如另外一个做NXP I.MX6核心板的厂家,其文档里这么描述:
他们都建议初学者直接使用他们提供好的文件系统。但是我还是强烈建议大家自己一步一步的去操作制作一次,因为一是这有助于你理解根文件系统是怎么来的,最小的能用的根文件系统包含了哪些东西,二是将来你很有可能需要对文件系统做一些定制化的裁剪和修改工作,只有自己做了一遍你对会明白这个东西到底是怎么回事,比如我原来就搞不清楚Busybox、Buildroot、Yocto这些名词在Linux中的作用,现在随着实践增多,就大概知道他们的用处了。
2.环境介绍
2.1.硬件
因为本系列博客都会以NUC972为平台来介绍。
2.2.软件
本篇新用到的软件工具一个是busybox,它用来生成文件系统里的几个最基本的文件夹,二是打包工具mkyaffs2,它用来生成能直接烧录到板子里的镜像文件。
大家有没有注意,我为什么每次都把这个官方的链接放过来,让大家自己去下载,原因是我们要知道我们用的东西的源头在哪里,最官方的资料渠道在哪里,这很重要。
我们这次要实现的目标是:自己亲手制作的文件系统能够跑起来,同时能够运行我们第二篇文章介绍的Helloworld程序。
3.使用Busybox制作根文件系统
1)进入到nuc972文件夹,新建一个tool文件夹,用来存放busybox、mkyaffs2等工具,把上面下载的NUC970_Linux_Applications-master.zip文件解压到tool文件夹里,因为解压后含有NUC970_Linux_Applications-master,我们把里面的内容移出来,然后删除掉空的NUC970_Linux_Applications-master文件夹和NUC970_Linux_Applications-master.zip源文件。然后进入到busybox目录里。同样的,在编译前要设置交叉编译的环境变量。
cd ~/nuc972
mkdir tool
unzip NUC970_Linux_Applications-master.zip
cd NUC970_Linux_Applications-master
mv ./* ../
cd ..
rm NUC970_Linux_Applications-master -fr
rm NUC970_Linux_Applications-master.zip
cd busybox-1.22.1/
source ~/nuc972//toolchain/environment.sh
2)make menuconfig 进入配置界面
make menuconfig
我们这里就设置一个地方,其他的全部使用默认配置。
修改make install生成的文件夹路径,我们把默认的./_install改成nuc972目录下的rootfs。
Busybox Settings --->
Installation Options ("make install" behavior) --->
(../../rootfs) BusyBox installation prefix
3)make 编译
make
编译成功后显示如下:
编译完成之后我们可以查看一下busybox的文件属性,可以看到如下信息,说明我们交叉编译的没问题。
4)make install 安装
make install
这样就在前面我们设置的地方生成一个rootfs的文件夹,进到里面看一下
cd ~/nuc972/rootfs
ls
bin、sbin、usr :存放一些命令
linuxrc :挂载根文件系统时,第一个执行的文件
4)再创建几个文件夹
mkdir etc lib dev
5)在 rootfs 目录的dev目录下创建设备节点
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3
6)在根文件系统rootfs/etc目录下创建一个inittab 文件,在文件里面填写:.console::askfirst:-/bin/sh
cd ../etc
vim inittab
4.文件系统打包
1)进入到tool文件夹的yaffs2utils目录里
cd yaffs2utils
2)编译,生成mkyaffs2
make clean
make
注:编译这个工具,不需要修改Makefile,用file看下属性,它是在x86-64运行的,这是没问题的,因为它就是在Ubuntu下使用的,不是在嵌入式环境下去执行使用的。
将它复制到/usr/bin下以后用起来方便了,可以直接使用这个指令了,你可一在终端敲mkya,然后TAB建看不能出来。
sudo cp mkyaffs2 /usr/bin/
4) 生成文件系统
sudo mkyaffs2 --inband-tags -p 2048 rootfs rootfs_yaffs2.img
5.内核修改
内核也要做一定的修改,具体如下:
1)make menuconfig进入到内核配置界面
make menuconfig
2)默认用的RAM filesytem 需要去掉
General setup —>
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support
3)默认的Boot option需要修改成如下:
Boot options --->
(noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 rootflags=inband-tags console=ttyS0,115200n8 rdinit=/sbin/init mem=64M)
4)NAND Flash驱动相关配置
Device Drivers --->
Generic Driver Options --->
<*> Nuvoton NUC970 FMI function selection
Select FMI device to support (Support MTD NAND Flash) --->
5)选中MTD的支持
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> Caching block device access to MTD devices
-*- NAND Device Support --->
-*- Nuvoton NUC970 MTD NAND --->
NUC970 NAND Flash pin selection (Port C) --->
6)选中yaff2文件系统的支持
File systems --->
[*] Miscellaneous filesystems --->
<*> yaffs2 file system support
7)保存配置,编译
6.结果查看
6.1.验证文件系统是否可用
1)将上述生成的kernel 970uimage、文件系统rootfs_yaffs2.img、还有之前第三讲生成的uboot.bin,uboot-spl.bin,以及env.txt 下载到板子里,env.txt做了一些改动,主要是加入了boocmd那一行,这样下载进去就能直接启动了。
baudrate=115200
bootcmd=nboot 0x7fc0 0 0x200000; bootm 0x7fc0
bootdelay=1
ethact=emac
ethaddr=00:00:00:11:66:88
stderr=serial
stdin=serial
stdout=serial
烧写前,最好对芯片进行一次Erase。几个文件的烧写类型及地址大家注意下,别搞错了。
2)上电,看看效果,调试串口打印信息如下:
这一次很顺利啊,一次就成功了,这就说明我们上述做的根文件系统是可以正常使用的了。
6.2.验证helloworld能否在板子上运行
我们还要看看我们之前编译的helloworld程序能不能运行,我们把helloworld放到板子里去,怎么把这个文件放到板子上呢?有以下几种方式:
a) 把Helloworld在Ubuntu下放到rootfs文件夹里,然后按照上述的方法打包、下载进去。
b)通过scp或者NFS服务,直接通过网口放到板子里
c) 先放到U盘里,然后U盘插入到板子上,再复制过去
方法a)自然没问题,不过有些麻烦,方法b)现阶段我们的文件系统并不支持,暂时先不弄了,下一篇文章会介绍scp的移植,我们来试试方法c)吧
1)插入U盘到电脑上,把helloworld拷贝过去
2)把U盘插入到板子上,这时调试串口会自动输出如下信息,提示我们有USB Mass Storage设备接入了,看来内核已经把USB这部门驱动已经做进去了。这不是有点像我们给PC机重装Windows系统的过程,默认鼠标键盘也是可以直接使用的。
我们进入到/dev目录里,可以看到有sda1设备,LINUX所有的存储设备都是映射成"文件"来访问的,包括U盘、光驱、硬盘等。这个sda1就对应我们刚插入的U盘。
那么该如何访问U盘的东西呢?
我们需要挂载,使用mount指令,我们执行以下命令:
mkdir mnt
cd mnt
mkdir usb
cd usb
mount -t vfat /dev/sda1 /mnt/usb
cd /
mkdir opt
cp /mnt/usb/helloworld /opt
完成的事情是把sda1挂载到了/mnt/usb目录上,这样/mt/usb目录里就有了U盘里的内容,然后再复制到了系统的/opt目录。
我们在/opt目录里执行./helloworld,提示如下错误:
-/bin/sh: ./helloworld: not found
这是怎么回事呢?原因很简单,helloworld的执行是需要依赖一些库的,不可能系统里什么都没有就执行能执行成功了。所以需要我们把交叉编译链~/nuc972/toolchain/arm-2014.05/arm-none-linux-gnueabi/libc/lib里的库文件复制到板子的lib目录里。
可以先到arm-2014.05/arm-none-linux-gnueabi/libc/lib目录中,压缩下
tar -cvf lib.bin *
然后通过U盘放到板子的/lib目录中解压
tar -xvf lib.bin
这样操作之后,再次执行helloword,结果如下:
另外可以对板子断电-再上电,看看我们之前操作的内容都还在,因为它是存到NAND Flash里的,所以断电是不丢失的。
7.结束语
如果你亲自动手实现了这篇文章介绍的所有内容,相信你对根文件系统一定有了一个非常感官的认识。包括这篇在内,我用了5篇文章一直在介绍嵌入式Linux基础环境相关的内容,你应该也能感受到这和我们以前接触的单片机开发还是有着较大的差异。从下一篇文章开始,我们就正式进入到具体的应用了。我会陆续介绍GPIO、UART使用;网络通信;WIFI使用;摄像头采集数据;EC20 4G模块使用;QT编程;Opencv使用等。
【方法学】Fier博士《JACS》芳胺的简便合成--无过渡金属C-N偶联
本文一作:Patrick S. Fier
通讯作者:Patrick S. Fier and Suhong Kim
通讯单位:Merck & Co., Inc.
文章链接:https://pubs.acs.org/doi/10.1021/jacs.4c00871
引言
今天,分享一篇方法学研究成果,该研究以Communication形式发表在美国化学会志《JACS》上
作者报告了设计使用简单和容易获得的多功能试剂,开发一个无过渡金属的苯酚和伯胺的交叉偶联反应。在净脱水的C-N偶联反应中,亲核试剂和亲电试剂的诱导接近和电子活化是反应的原理。值得注意的是,这些反应不涉及使用过渡金属来形成C−N键,不涉及苯酚亲电试剂的预活化,也不需要排除空气或水分。温和的条件允许广泛的官能团,并允许将其应用于广泛的复杂底物的后期功能化。
1
简介
过渡金属催化成为组装交叉偶联分子的重要工具,C-N偶联尤其是极为重要的偶联反应,这是因为C-N偶联的产品类型在生物活性化合物中普遍存在,例如药物和农用化学品以及有机材料。
一项对药物化学实验室中使用的反应的调查显示,C-N偶联反应占非酰胺C-N成键反应的近四分之一,占所有反应类型的6%。此外,苯胺是C-N偶联的产物,在药物化学专利的所有结构中约占40%,在2022年FDA批准的17种小分子治疗药物中占11种。
自20世纪90年代初首次具有里程碑意义的发现以来,广泛的研究以及不断开发和改进新的催化剂和反应条件以进一步扩大偶联伙伴的普遍性和范围,进一步反映了C−N偶联反应的重要性。
虽然这种反应已经上升到有机化学中最有用的反应行列,但主要的缺点是需要过渡金属催化剂,最常见的是钯,一种稀有的贵金属,并且需要单独的配体、溶剂、碱和每一类底物的温度。此外,这种反应通常对空气和湿度敏感,而且配体可能比金属更昂贵。
为了解决这些限制,我们着手设计一种新的C-N交叉耦合方法,该方法不需要过渡金属,可以耐受空气、水分和常见官能团,可以在广泛的耦合伙伴中使用,使用廉价和简单的试剂,并提供正交性和互补性。
2
研究设想
为了开发一种非过渡金属的方法来实现C-N偶联,我们设想了一种多功能试剂可以用来将两个偶联伙伴靠近,电子激活每个偶联伙伴以促进C-N键的形成,最终能够在温和的条件下生成偶联产物。考虑到这一策略和上述考虑,我们开发了用二氯吡嗪试剂与苯酚和伯胺作为偶联伙伴的反应。
所提出的反应机理和设计原则如下图所示:
二氯吡嗪首先和胺发生第一次芳香亲核加成,随后在溶剂调控下,与酚进行第二次芳香亲核加,由于加成后形成的刚性骨架、N-H键的酸性和C-O键的亲电性,可以发生Smiles重排,形成稳定的阴离子,最后在还原条件下,生成C-N偶联产物。
3
研究探索
交叉偶联反应的发展是通过单独研究每个基本步骤来进行的,并根据下游步骤的发现对反应条件进行了改进。该反应以苯胺和苯酚为模型偶联伙伴进行了探索,两者都是未活化的,对任何提出的反应都是无偏倚的。开发是专门用5,6-二氯-2,3-二氰吡嗪进行的,因为该试剂是少数广泛使用的二氯吡嗪试剂之一,并且所有步骤都是电子激活的,并且根据我们之前的工作预测最终还原效果良好。
第一个SNAr反应将胺亲核试剂添加到模板上,溶剂筛选表明,醚溶剂最有利于单取代(>95:5 单:二),而更极性的溶剂,如DMSO或DMF,形成单和双取代产物的复杂混合物以及各种水解副产物。
在第一个SNAr步骤中可以使用各种碱,最终选择了K3PO4,因为它在接下来的步骤中效果很好,并且与KHMDS或KOtBu等不同,它在空气中很常见且易于处理。最终选择1,4-二恶烷作为溶剂,因为它对复合胺具有良好的增溶性,并且沸点(101℃)高于后续步骤的温度。过量的K3PO4用于补偿序列中所有步骤中使用的质子,并用于游离任何作为质子化盐添加的胺,这是复杂胺的典型特征。
第二个SNAr步骤和重排被视为一个单独的步骤,因为我们试图确定一组可以促进这两个事件的条件。一般来说,能够使苯酚去质子化的碱基能够胜任SNAr步骤,但只有钾或铯碱基才能很好地进行重排。为了简单起见,基于前面的步骤,我们将重点放在K3PO4上,因为它比Cs2CO3密度更小,成本更低。含有Li, Na或铵反离子的碱基在重排时效果不佳,在中等温度(100°C)下导致起始物质未反应,或在进一步加热时导致不明显的分解。高极性溶剂是促进重排所必需的,DMSO提供最快的速度和最干净的反应谱。
将所有反应结合在一起,首先将胺与二氯吡嗪试剂(1)与K3PO4在二恶烷中在50 ℃下反应2 h,确保1完全消耗,然后加入苯酚,与DMSO一起,反应加热到100 ℃ 30 min,进行第二次SNAr和重排。在100 ℃时,第二个SNAr的初始产物在形成时迅速转化为重排产物;中间产物在反应过程中不会形成。如果试剂1在第一个SNAr步骤中没有完全消耗,苯酚将与1竞争性反应形成非生产性副产物并降低总收率。使用胺偶联伙伴,以微过量(1.3等量)保证1的完全消耗,并添加相对于苯酚微过量(1.2等量)的1(1.0等量,限制试剂),促进苯酚的完全消耗。在胺组分更珍贵的情况下,化学计量可以倒置使用胺作为限制试剂,对收率的影响最小。
对于切割模板的最后一步,我们建立了在我们最近报道的吡啶胺化反应的发展中发现的条件在这里,简单地用AcOH淬火反应,加入锌粉,并在80℃下加热混合物10-30分钟,结果是吡嗪环的还原和交偶产物的释放。使用替代条件,如水解或亲核裂解,是不成功的,只有还原条件证明一般和高产。总的来说,每一步几乎都是定量的,没有形成任何重要的副产物,整个序列形成了98%收率的交叉偶联产物。
4
适用范围
获得最佳反应条件后,进行反应适用性探究:
可以看到,多样性的胺底物,无论是芳胺还是烷基胺都可以兼容该反应条件,并能够提供良好至优秀的产率。此外,结构复杂的胺类也可以顺利地制备期望的芳胺。
进一步反应尝试,作者还是将该反应拓展至酚制备伯芳胺:
无论是简单的酚还是具有复杂骨架的酚,都能够高效地转化为相应的芳胺。
结论
Patrick S. Fier博士团队开发的这个芳胺制备方法,具有模块化合成的优势,并且无需过渡金属,使用便宜易得的双功能试剂,实现了酚和胺的脱水C-N偶联,制备结构复杂多样的芳胺。这个方法具有非常好的实用性,可以用于结构复杂的化合物后期官能化
相关问答
【请问, and 在美式发音里连读或者快读的时候到底发什么音?听c...[最佳回答]and在连读时发音为"ən",这是在句中弱化了的缘故.与后连读时用"n"与后连读.类似如:http://zhidao.baidu.com/question/36...
【 and 是什么意思】作业帮[最佳回答]and[强ænd,弱ənd,ən]conj.和,与;就;而且;但是;然后.其中,“conj"全称是”conjunction",是“连词”的意思.或:and[强ænd;弱...
And 完整式?"AND"是逻辑运算符,用于表示逻辑与(AND)的关系。在逻辑表达式中,"AND"用于连接两个或多个条件,只有当所有条件都为真时,整个表达式才为真。以下是一个...
ssd nand 区别?SSD指的固态硬盘,固态硬盘上存储信息的方式是采用Flash芯片,Flash芯片主要分为NANDFlash和NorFlash。简单来说,SSD硬盘是一个由若干个NANDFlash或者NorFl...
And 插线板接线板怎么装?And插线板是一种机电一体化的插线模块,使用方便,能够适应多种电流电压,以及不同的设备和应用场景。在安装时,需要按照以下步骤进行:1)首先需要准备好插线板...
sdnand有哪些品牌?SDNAND品牌有:芯存者,专业提供SDNANDFLASH为嵌入式系统存储保驾护航,容量规格有128MB,256MB,512MB,1GByte(8Gbit)2GByte(16Gbit)4GB...
ilsand是什么意思?island[英][萢jlYnd][美][萢jlYnd]n.岛,岛屿;vt.使孤立;例句:1Theisland'ssocialhubistheCafeSport....
and 函数符号的使用方法?1、输入函数:=AND(条件1,条件2,……条件N);2、其中条件1,条件2,……条件N可以是任何条件表达式,比如=A1=B1,>C1,1、输入函数:=AND(条件1,条件2,……条件N);...
英语中的经纬度怎么读63°24′ and 66°33′ N ,和13°30′ and 24...[最佳回答]N是北纬,W是西经.
Thereisa“u”andan“ n ”intheword“run... _作业帮[最佳回答]冠词a和an的区别在于修饰的词的音标里的第一个音是元音还是辅音,这并不代表原因字母就一定要anu的音标[ju:]显然第一个[j]是辅音,所以用a而n音标[en...