当前位置: 首页 > news >正文

全志 Melis-4.0(rt-thread内核) 环境搭建与初步编译介绍

什么是Melis?

  Melis是全志科技自研的一套rtos系统。自全志科技创建以来,该系统就已经问世,并持续抗战了近十年,其主要应用其自家的F系列芯片产品上,在MP3与老人机非常流行的时代,该系统配合着其F系列的芯片,真的是能抗能打,早在2012-2013年的时候,Melis的装机量就已经过亿,但因为其属于自研系统,全志科技并没有将其开源,导致虽装机量很多,但是很少人知道。
  Melis之所以能抗战那么久,或者说全志科技之所以能在那个芯片行业并不出彩的年代坚持下来,我觉得主要归功于其F1C100s/F1C200s这个代的芯片。这款芯片差不多是十年前的产品,但是因为其具有很强的编解码能力,以及异于常人的性价比,现如今依然活跃在各个微媒体市场。
  Melis经过了多个迭代,现如今配合着其最新推出的F133(risc-V)芯片,推出了最新的Melis4.0系统,并使用了更多人熟悉的RT-thread内核,在GitHub上,部分进行了开源,引领广大开发爱好者参与进risc-V的生态建设中。最近想用F133做一点有趣的开发,因此也开始研究Melis4.0。
  个人觉得,通过学习melis系统,可以让学习者更了解系统的构成,什么是系统调用?系统是如何加载模块的?什么是BSP?等,对于学习者来说,是非常不错的入门选择。

开发环境

  • Ubuntu22.04虚拟机
  • MQ-R(F133) 芒果派开发板

代码下载

GitHub的项目地址如下:

https://github.com/Tina-Linux/d1s-melis

仓库的简介提示,如果需要编译代码,需要手动下载一下相应的工具链并将工具链放在对应目录里。
工具链地址如下:

https://github.com/Tina-Linux/d1s-melis/releases

建议直接下载这个,因为工程中默认的也是这个
在这里插入图片描述
代码下载好后,解压。并将下载好并解压好的工具链放在代码的toolchain目录下。(我这里将原项目目录更名为了source,并不影响其它)
在这里插入图片描述
一切准备就绪后,即可开始编译。如果是新的系统,建议先安装一些依赖库,后续可能会用到。

sudo apt install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

编译

环境变量

在代码编译之前,我们可能需要设置很多环境变量(lunch 、croot、pack等),因为每一次的环境变量都是比较固定的,因此,项目中,将这些初始化环境变量的操作,都整合成了两个脚本,分别是"envsetup.sh"和“melis-env.sh”。因为melis-env.sh最终会自动调用“envsetup.sh”,因此,我们只需要执行“melis-env.sh”即可

#初始化环境变量
melis-env.sh

初始化环境变量后,我们需要通过“lunch”来选择我们需要编译的项目,lunch是通过扫描projects文件夹下的文件夹,进行识别一共有多少套方案,lunch选中后,系统的编译参数、打包参数,运行参数等,就会使用对应方案文件夹中的配置文件。(具体为什么叫lunch,原因不详,或许本应该是launch?学习英语任重道远!)

对应方案

#通过lunch来选择要编译的项目
lunch

在这里插入图片描述
因为我使用的是麻雀的开发板,因此我这里选择3.

编译

以上流程走完后,原工程是可以直接make的,但是第一次编译,或者选择了不同方案后编译,建议都是要clean一下,重新lunch一次,避免环境不干净。

#先clean一下
make clean

#再把方案清一下
make distclean

#重新lunch,再选择一次方案
lunch

#执行make操作
make

注意,如果你在kconfig中,增加了某些选项,但是没有在deconfig中增加对应的配置,直接make可能会报错。需要通过make menuconfig来重新生成默认的编译配置。

#通过make menuconfig选择编译参数
make menuconfig

注意:curses.h: No such file or directory ,那是因为环境没弄好,“sudo apt install libncurses5-dev” 即可
在这里插入图片描述
第一次编译,直接保存即可。配置默认是保存在当前目录下的 “.config”文件中,最好不要改文件名。如果不想每次编译都make menuconfig,那么就将当前的“.config”的内容,更新到对应方案目录下的deconfig文件中。比如我要改的话,那我就需要将“.config”文件中的内容,全部替换到“projects/d1s-mq/configs/deconfig”文件中,这样每次lunch之后,系统默认来这里来拿编译参数。

以上完成后,就可以直接make了,如果没改过任何东西的话,是可以直接编译通过的。如果不通过,可能要检查一下自己的环境是否安装完善,勤加百度,即可解决问题。

打包

编译成功后,可以通过pack,将编译好的文件,全部打包成一个.img的固件。
因为固件可能是用于卡烧录的,用于nor烧录的,用于nand烧录的,根据烧录方式的不同,需要搭配不同的参数,默认是打包生成nor烧录的固件。

#通过pack指令,打包生成固件(默认生成nor固件)
pack

#生成nand烧录固件
pack -a nand

#生成卡烧录的固件
pack -a card

最终的固件将会生成在“out/对应方案/”目录下。

注意:如果出现如下错误:
在这里插入图片描述
这个时候,打包是没有成功的,cd到对应目录下,查看文件夹下,又是存在这个dragon文件,有点神奇。其实是因为dragon这个程序是在32位机器上编译出来的,这是32位的程序,在64位的Ubuntu中运行需要提前安装32位的库。

请执行操作:

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 -y
sudo apt install lib32z1 -y

重新pack后,没有提示,打包成功。

注意事项:

  1. source melis-env.sh 的操作仅在当前终端有效,新开终端,或者关闭了终端后,需要重新source一下,才能进行下面的操作。
  2. lunch操作与source操作一样,都是只对当前终端有效,每次打开新终端,都需要进行一次source、lunch。

小贴士:

source了之后,可以使用各种快捷调整指令,方便开发

croot   回到项目根目录
ckernel   跳转至kernel文件夹
cmodoule  跳转至模块文件夹
。。。(更多操作,可以看环境脚本“envsetup.sh”中的function有哪些)

相关文章:

  • JUC 中的线程池入门(其实没有那么难)
  • 派福利!通过 Azure 零成本进入 CUDA 编程
  • 10.6日作业
  • Mybatis,动态代理方式的CRUD
  • Linux 进程管理类
  • 魔法方阵(CSP-J模拟赛)
  • 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
  • 【axios】二次封装——避免重复发送请求
  • 没有那么难,基于 Echarts + Python Flask 动态实时大屏轻松可以实现
  • 【每日一算法】高精度算法 | 加法 | 减法_模板应用
  • 2022华为杯A题第一问详细思路
  • Qt5.14.2开发Mqtt应用程序
  • 【U3D小游戏】愤怒的小鸟(三)猪的相关
  • 【UEFI实战】LinuxBoot
  • Linux: kernel: 调试:DYNAMIC_DEBUG
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • CentOS7 安装JDK
  • Java 多线程编程之:notify 和 wait 用法
  • java取消线程实例
  • python 装饰器(一)
  • React 快速上手 - 07 前端路由 react-router
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Vue2.0 实现互斥
  • vue-cli3搭建项目
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 关于Java中分层中遇到的一些问题
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 新书推荐|Windows黑客编程技术详解
  • 用quicker-worker.js轻松跑一个大数据遍历
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $(function(){})与(function($){....})(jQuery)的区别
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (第一天)包装对象、作用域、创建对象
  • (二)丶RabbitMQ的六大核心
  • (六)vue-router+UI组件库
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)汇编语言——简单程序
  • (转)ABI是什么
  • (转)大道至简,职场上做人做事做管理
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .htaccess配置重写url引擎
  • .net FrameWork简介,数组,枚举
  • .net wcf memory gates checking failed
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net下简单快捷的数值高低位切换
  • .NET值类型变量“活”在哪?
  • /var/lib/dpkg/lock 锁定问题