【嵌入式Linux】开发环境搭建

2023-11-16

一、概述

在进行某一个芯片平台开发前,一般都需要在电脑上安装一系列软件,然后在这些软件上阅读、编写、编译和调试在该平台上运行的代码,最后将编写好的代码通过某种方式烧录到该芯片的对应地址运行。在电脑上安装的这一系列软件的过程,就是开发环境的搭建的过程。

按照现在开发的实际情况,嵌入式Linux的开发一般都是在win的环境下搭建一个Linux的虚拟机,代码的编译调试和运行都需要依赖这个环境。一般操作都是在win下编写好代码,然后将代码放到Linux编译,最后将编译后生成的文件复制到win下,再讲这个文件烧录的芯片中运行,当然,也有直接可以在Linux下烧录代码的。是不是看着挺复杂,其实只要你熟练后,一切都挺简单。

我手上的这块开发板是某原子的,芯片平台是NXP的IMX6ULL,其内核为ARM的Cortex-A7。接下来的学习都将围绕他来进行。每款开发板或者芯片开发环境肯定都是有所差别的。

为什么选择IMX6ULL,有几个原因:
①他是ARM架构,是目前世界上应用最多的架构之一,学习他很有必要;
②他是单核32位芯片,对于熟悉stm32的人来说,非常合适,对于刚入嵌入式Linux开发的新手来说比多核更容易入手学习;
③某原子在开发板耕耘十几年,售后没得说,有技术支持,有人领路和没人领路完全是两码事,这点很重要(这不是打广告!)。

二、必备工具

1. Linux环境搭建

Linux系统是一个大的统称,Linux系统有很多发行版,常用的有Ubuntu、Red Hat、Debian、CentOS等,他们都属于Linux操作系统,都大同小异,使用方法几乎一样。这里我比较熟悉Ubuntu。在之前的博文中已经有安装教程了,这里不再赘述。
Ubuntu虚拟机搭建

2. VScode安装

VScode是一款功能十分强大的代码编辑器,它有着十分丰富的插件,几乎可以涵盖到当前所有流行的高级语言。

VScode有win下的,也有Linux下的,如果你熟悉在win下编写代码,就可以在win下安装它,你熟悉Linux,就可以在Linux下安装它。他的安装简单,网上一大把,傻瓜式安装的,完全免费(可能某些插件需要付费)。下面是我电脑VScode安装的插件,有需要的朋友可根据实际情况自己安装。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里建议大家安装的主要包括以下插件:

1) C/C++,这个肯定是必须的。
2) C/C++ Snippets,即 C/C++重用代码块。
3) C/C++ Advanced Lint,即 C/C++静态检测 。
4) Code Runner,即代码运行。
5) Include AutoComplete,即自动头文件包含。
6) Rainbow Brackets,彩虹花括号,有助于阅读代码。
7) One Dark Pro, VSCode 的主题。
8) GBKtoUTF8,将 GBK 转换为 UTF8。
9) ARM,即支持 ARM 汇编语法高亮显示。
10) Chinese(Simplified),即中文环境。
11) vscode-icons, VSCode 图标插件,主要是资源管理器下各个文件夹的图标。
12) compareit,比较插件,可以用于比较两个文件的差异。
13) DeviceTree,设备树语法插件。
14) TabNine,一款 AI 自动补全插件

3. ssh服务

ssh是一个登录远程服务器的软件,Linux安装指令:

sudo apt-get install openssh-server

也可以在VScode插件里面直接安装。

4. Linux下与win下文件互传

Linux与win之间文件互传的工具有很多,有兴趣的可以直接网上查找看看。这里只称述我使用的。
Windows 和 Ubuntu 下的文件互传我们需要使用 FTP 服务,设置方法如下:

4.1 开启Ubuntu下FTP服务

sudo apt-get install vsftpd

等待软件自动安装,安装完成以后使用如下 vim命令打开/etc/vsftpd.conf(没有vim请先安装vim:sudo apt-get install vim),命令如下:

sudo vim /etc/vsftpd.conf

打开以后 vsftpd.conf 文件以后找到如下两行:

local_enable=YES
write_enable=YES

然后把前面的“#”号去掉。修改完 vsftpd.conf 以后保存退出,使用如下命令重启 FTP 服务:

sudo /etc/init.d/vsftpd restart

4.2 win下FTP服务开启

win下直接安装FTP客户端,这里使用的是 FileZilla,这是个免费的 FTP 客户端软件,可以在 FileZilla官网下载:
FileZilla

都安装好之后,就可以用这个来进行win和Linux下文件的交互了。

5. 串口驱动

串口驱动有很多种,比如常用的CH340系列、FT232、CP2102等。我们需要根据自己板子的实际情况安装对应的驱动即可,网上资源很多,不再赘述。

6. 交叉编译工具链

一般做嵌入式Linux开发,特别是驱动开发的,大概率都要安装交叉编译器,什么是交叉编译器呢?
这里直接给出结论:
交叉编译器就是在一种架构上可以编译另外一种架构的代码的一组软件。
我们在电脑上安装的Ubuntu 自带的编译C语言的编译器是 gcc 编译器,是针对 X86 架构的,而我们现在要编译的代码是需要在是 Cortex-A7内核芯片上运行,Cortex-A7内核属于ARM 架构,所以我们需要一个在 X86 架构的 PC 上运行,可以编译 ARM 架构代码的编译器。
交叉编译器有很多种,我们使用 Linaro 出品的交叉编译器, Linaro 一间非营利性质的开放源代码软件工程公司, Linaro 开发了很多软件,最著名的就是 Linaro GCC 编译工具链(编译器)。有兴趣了Linaro 的朋友可以自行百度。
Linaro GCC 编译工具链
在这里插入图片描述
在X86架构64位PC机上编译ARM架构的代码,选择上图红色框起来的编译器即可。如果你的PC是32位的,那就选择这个:
在这里插入图片描述
将这个编译器下载下来后,将其拷贝到虚拟机下,把他移动到你想要存放的位置,然后需要将其配置到环境中去,以便可以在终端中可以输入命令使用。
例如:
在 Ubuntu 中创建目录: /usr/local/arm,命令如下:

sudo mkdir /usr/local/arm

创建完成以后将刚刚拷贝的交叉编译器复制到/usr/local/arm 这个目录中,在终端使用命令“ cd ” 进 入 到 存 放 有 交 叉 编 译 器 的 目 录 , 比 如我 前 面 将 交 叉 编 译 器 拷 贝 到 了 目 录“/home/lhsmd/linux/tool”中,然后使用如下命令将交叉编译器复制到/usr/local/arm 中:

sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f

拷贝完成以后在/usr/local/arm 目录中对交叉编译工具进行解压,解压命令如下:

sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

等待解压完成,解压完成以后会生成一个名为“gcc-linaro-4.9.4-2017.01-x86_64_arm-linuxgnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。
修改环境变量,使用 vim 打开/etc/profile 文件,命令如下:

sudo vim /etc/profile

打开/etc/profile 以后,在最后面输入如下所示内容:

export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

修改好以后就保存退出,重启 Ubuntu 系统,重启后,打开终端,输入:

arm-linux-gnueabihf-gcc -v

如果出现了版本号,就说明安装成功,如下:
在这里插入图片描述
arm-linux-gnueabihf-gcc的含义如下:

①arm 表示这是编译 arm 架构代码的编译器。
②linux 表示运行在 linux 环境下。
③gnueabihf 表示嵌入式二进制接口。
④gcc 表示是 gcc 工具。

7. 其他相关库安装

sudo apt-get install lsb-core lib32stdc++6

三、总结

不同的芯片可能需要安装不同的代码编译运行环境,比如交叉编译器等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式Linux】开发环境搭建 的相关文章

  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是

随机推荐

  • vue指令中v-show和v-if以及keep-alive的区别

    v if 属于条件显示 满足条件就显示元素 不满足就删除元素 通过操作DOM元素完成 v if的首次渲染显示的开销较小 因为它只渲染满足条件的那一个元素 切换组件时 其开销较大 因为它每切换以此就要重新触发生命周期渲染显示新元素 v if值
  • JS实现轮播图(自动+手动)

    网页轮播图效果 核心原理 tips 代码在文章末尾 这个ul就是我们这四张图片的父盒子 我们通过对这个父盒子添加动画函数来实现移动 然后给父盒子来一个溢出隐藏就达到了轮播的效果 动画函数如下 function animate obj tar
  • 【python爬虫】8.温故而知新

    文章目录 前言 回顾前路 代码实现 体验代码 功能拆解 获取数据 解析提取数据 存储数据 程序实现与总结 前言 Hello又见面了 上一关我们学习了爬虫数据的存储 并成功将QQ音乐周杰伦歌曲信息的数据存储进了csv文件和excel文件 学到
  • 8.typescript-函数的类型

    今儿个甚是乏累呢 但是 lt 下面可能是正题儿 gt 1 函数声明 1 function student x string y number string 2 return 我是 x 今年 y 岁 3 4 5 console log stu
  • 商品期货怎么玩? 1手交易需要多少钱?

    期货市场中有许多大宗商品 把他们统称为商品期货 近几年我国商品期货品种不时在增加 固然期货风险比较高 但收益也十分可观 而且商品期货开户几乎没有门槛 国内商品期货免费开户 无资金限制 凭身份证和银行卡即可办理 开设期货帐户 能在网上开期货帐
  • Unity XCode iOS 实现拍照和相册选择上传头像

    显示弹窗 通过UIAlertController来创建一个弹窗 if defined cplusplus extern C endif 导出接口供unity使用 void IOS Open IOSCameraController app I
  • 剑指 Offer 25. 合并两个排序的链表(java+python)

    输入两个递增排序的链表 合并这两个链表并使新链表中的节点仍然是递增排序的 示例1 输入 1 gt 2 gt 4 1 gt 3 gt 4 输出 1 gt 1 gt 2 gt 3 gt 4 gt 4 限制 0 lt 链表长度 lt 1000 思
  • sql语句学习(b站韩顺平的demo)

    表的CRUD varchar varchar2 char的区别 时间 时间戳使用 创建表 创建一张表 表结构与已经存在的表一致 查看表的信息 表中增加一列 修改表中的列 删除表中的列 修改表名 修改表的字符集 修改表中的列名 表中数据的插入
  • 关于算法,我们都应知道的

    定义 算法是指对特定问题求解步骤的一种描述 特性 1 有穷性 算法是由若干条指令组成的有穷序列 总是在执行若干次后结束 不可能永不停止 2 确定性 每条语句有确定的含义 无歧义 3 可行性 算法在当前环境条件下可以通过有限次运算实现 4 输
  • JavaEE学习记录day09集合03 Map集合、Stream流

    JavaEE学习记录day09集合03 Map集合 Stream流 1 Map集合 1 1Map集合概述和特点 理解 Map集合概述 interface Map
  • 看书标记【R语言数据分析与挖掘实战】5

    第五章 挖掘模型 5 1 分类预测 回归分析 回归分析是确定预测属性 数值型 与其他变量间相互依赖的定量 关系的最常用的统计学方法 包括线性回归 非线性回归 Logistic回归 因变量有0 1两种取值 岭回归 自变量间有多重共线性 主成分
  • JavaScript引擎,V8引擎的原理

    为什么需要JavaScript引擎 高级的编程语言都是需要转成最终的机器指令来执行 我们所编写的js无论h是交给浏览器或者node执行 最后都是需要被CPU执行的 CPU只认识自己的指令集 机器语言 才能被CPU所执行 所以我们需要js引擎
  • 关于ngx_rtmp_hls_append_sps_pps造成的hls: error appenging SPS/PPS NALs错误

    关于ngx rtmp hls append sps pps造成的hls error appenging SPS PPS NALs错误 一giao我哩giao 今天在调试同rtmp配合nginx推流的时候 发现推live可以推成功 结果在推h
  • 多因素认证与身份验证:分析不同类型的多因素认证方法,介绍如何在访问控制中使用身份验证以增强安全性

    随着数字化时代的到来 信息安全问题变得愈发重要 在网络世界中 用户的身份往往是保护敏感数据和系统免受未经授权访问的第一道防线 单一的密码已经不再足够 多因素认证 MFA 应运而生 成为提升身份验证安全性的重要工具之一 本文将深入探讨不同类型
  • rpm常用命令记录

    文章目录 1 常用rpm命令 2 rpm参数 1 常用rpm命令 rpm ivh xxx rpm 安装rpm rpm Uvh xxx rpm 升级rpm rpm e xxx rpm 删除rpm rpm qi xxx rpm 查看安装包的信息
  • node.js 数据实现分页问题(后端)

    最近在写项目时 碰到的问题 let arr let rows for let e 0 e
  • TCP 和 UDP 的 Socket 调用

    在网络层 Socket 函数需要指定到底是 IPv4 还是 IPv6 分别对应设置为 AF INET 和 AF INET6 另外 还要指定到底是 TCP 还是 UDP TCP 协议是基于数据流的 所以设置为 SOCK STREAM 而 UD
  • live555学习之一整体说明

    live555 是一套采用rtsp协议作为其核心 可以用来传输接收多媒体包括H264 H265 音频等多媒体数据的开源架构代码集 通过扩展一些类的方式 实现rtsp server 和client端的功能 并且提供源码 其源码 可以是从官网
  • python程序封装成exe_手把手教你给Python程序写图形界面,并且打包成exe文件

    环境配置 官网下载Python3 LZ的配置环境是Python3 6 PyCharm 2017 2 1 pip3 install PyQt5 下载PyQt5pip install PyQt5 tools i http pypi douban
  • 【嵌入式Linux】开发环境搭建

    一 概述 在进行某一个芯片平台开发前 一般都需要在电脑上安装一系列软件 然后在这些软件上阅读 编写 编译和调试在该平台上运行的代码 最后将编写好的代码通过某种方式烧录到该芯片的对应地址运行 在电脑上安装的这一系列软件的过程 就是开发环境的搭