加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

如安在STM32上移植Linux?超具体的实操履历分享

发布时间:2018-10-16 09:50:49 所属栏目:业界 来源:21ic电子网
导读:【51CTO技能沙龙】10月27日,让我们配合试探AI场景化应用实现之道 刚从硬件跳槽为嵌软时,没有任何一丝的筹备。一入职,率领就交接了一项特难的使命在stm32上移植linux! 刹时我就懵了,没步伐硬着头皮上吧,先汇集资料,我之前跑的是ok6410的板子上运行的li

然后就是针对stm32f407来修改内核代码,stm32f429用的是串口3,我用的是串口1,改!时钟差池,改!储存地点差异,改!stm32f429不光是有外部的SRAM,空间8M尚有NOR flash,财大气粗,资源任意用,不像我的stm32f407只有外部2M的SRAM(率领说硬件就那样,节省本钱,无语。。),幸好uClinux代码是用XIP的方法来运行的,就是代码段放在内部flash中当场执行,数据段和bss段其余段就放在sram上运行,这样算算,空间照旧足够的。

其间还呈现这样的题目:

如安在STM32上移植Linux?超具体的实操履历分享

卡了我一个礼拜,其时我就百思不得其解,在建设高速缓存哪里就呈现内核错误运行不下去了,细心比对了stm32f103的uClinux源代码,也没发明什么错误,一个多礼拜没有盼望,内核惊愕我也惊愕了,幸好率领知道环境后也不鼓舞我,而是买了一本《ARM Linux内核源代码说明》给我,叫我好好研读,办理题目,于是就看内里构建kmem cache那一篇,linux内核源码过于伟大,看得我头都大了,其后想想这不是步伐啊,是不是又是硬件题目?由于原先用的是512k的sram进级到2M,公司的硬件工程师又从头改版了,于是我又用电烙铁把stm32芯片,sram芯片,和他们之间的上拉电阻,又从头焊了一遍,一上电就正常运行到下一步了,唉~之前移植u-boot的sram驱动也是硬件坑我的啊,真不敢信托我不懂点硬件的话会坑到我什么时辰。。。

接着瞎捣鼓着,前后花了快要两个月,就成这样了:

如安在STM32上移植Linux?超具体的实操履历分享

- 想想还真是命运好。。。

接下来碰着的题目,应该是少了根文件体系,这个uClinux代码原本是配有根文件体系的,是romfs,可是存储空间不足了。

uClinux的根文件体系未能挂载起来,由于体系原本设置的根文件体系是romfs,是基于stm32f429的,stm32f429的内部flash存储空间有2M,romfs占用空间为300多kB,这样存放显然是富裕的,可是对付stm32f407来说,它的内部flash存储空间为1M,这样存放的话,存储空间是不足的(u-boot占用空间0x08000000-0x08020000,内核占用空间约为0x08020000-0x080BB000,约620多KB,那么只有剩下约250多KB的空间供根文件体系存放),以是按照这个环境,我想是其它搭建占用内存空间更小的initramfs作为uClinux的根文件体系来挂载。

构建stm32f407-uClinux的initramfs根文件体系

上文讲到内核运行到free init memory:8k这个处所就卡住,运行不下去了,在查阅了相干资料后,展望是穷乏根文件体系所导致的,原本的内核源代码是搭配有根文件体系的bin文件,是romfs但没有源码,前面讲过我此刻项目行使的是stm32f407,内部flash容量和外部SRAM都不敷以拷入这个原配的romfs挂起为根文件体系来行使。

接下来就是探求一种经济合用的文件体系来作为内核的根文件体系,从网上查阅相干资料可以知道,YAFFS2支持的是nandflash,jffs支持nor flash,这些看来对付我手上的stm32f407来说是不合用的,于是我细心研究了stm32f103的源代码,发明它是有两种启动的方法,一种回收的是用iniramfs作为根文件体系,xip启动,在stm32f103内部flash只有512k的环境居然跑起了Uclinux,另一种是jfss2挂在外部nor flash上,显然我这种环境今朝只有参考第一种方法来,回收initramfs作为根文件体系。于是开始构建initramfs相干文件。 细心研究stm32f103 XIP启动方法的内核设置make menuconfig中, CONFIG_INITRAMFS_SOURCE=”initramfs-filelist” 而initramfs-filelist位于Uclinux/linux-2.6.x下,打开一看是这样的:

如安在STM32上移植Linux?超具体的实操履历分享

一开始我看不懂这内里的shell什么意思,网上找到一篇文章,写得很清晰,把它copy过来,进修一下:

把initramfs编译到内核内里去

行使initramfs最简朴的方法,莫过于用已经做好的cpio.gz把kernel内里谁人空的给换掉。这是2.6 kernel生成支持的,以是,你不消做什么非凡的配置。

kernel的config option内里有一项CONFIG_INITRAMFS_SOURCE(I.E. General setup—>Initramfs source file(s) in menuconfig)。这个选项指向放着内核打包initramfs必要的全部文件。默认环境下,这个选项是留空的,以是内核编译出来之后initramfs也就是空的,也就是前面提到的rootfs什么都不做的气象。

CONFIG_INITRAMFS_SOURCE 可所以一个绝对路径,也可所以一个从kernel’s top build dir(你敲入build可能是make的处所)开始的相对路径。而指向的方针可以有以下三种:一个已经做好的cpio.gz,可能一个已经为建造cpio.gz筹备好全部内容的文件夹,可能是一个text的设置文件。第三种方法是最机动的,我们先依次来先容这三种要领。

1)行使一个已经做好的cpio.gz档案

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读