由于本人前期课程看的正点原子的视频,因此,开发环境是用的正点的那一套。在 Ubuntu 下进行 Cortex-A(I.MX6U)开发,安装一些软件就是开发环境搭建。前期尽量跟随自己看的课程配置对应开发环境,学习起来比较舒服,但用的软件的功能呢大体上都是类似的,后期可以根据自己喜好尝试不同的软件。
在开发的过程中会频繁的在 Windows 和 Ubuntu 下进行文件传输,比如在 Windwos 下进行代码编写,然后将编写好的代码拿到 Ubuntu 下进行编译。 Windows 和 Ubuntu 下的文件互传我们需要使用 FTP 服务。
打开 Ubuntu 的终端窗口,然后执行如下命令来安装 FTP 服务:sudo apt-get install vsftpd。
安装完成以后使用 vi 命令打开 /etc/vsftpd.conf,命令:sudo vi /etc/vsftpd.conf。
打开 vsftpd.conf 文件以后找到下面两行:
local_enable=YES
write_enable=YES
确保上面两行前面没有“#”,有的话就取消掉,如下图:
修改完 vsftpd.conf 以后保存退出,使用如下命令重启 FTP 服务:sudo /etc/init.d/vsftpd restart。
Windows下 FTP 客户端使用 FileZilla,这是个免费的 FTP 客户端软件,可在FileZilla官网下载,下载地址: https://www.filezilla.cn/download。
Ubuntu 作为 FTP 服务器,FileZilla 作为 FTP 客户端,客户端需要连接到服务器上,打开站点管理器,点击:文件->站点管理器。如下图配置,配置完之后点击连接即可。Ubuntu中使用:ifconfig命令查询主机IP。
我在连接这一步遇到一点小问题,分享一下,希望能帮到大家。
Windows10及以上的版本,FTP服务可能是关闭的,如下图选中FTP的三个选项开启一下:
Linux使用命令关闭防火墙(以Ubuntu为例):关闭防火墙:sudo ufw disable。
其中左边就是 Windows 文件目录,右边是 Ubuntu 文件目录,默认进入用户根目录下(比如我电脑的“/home/lyp”)。上图中Ubuntu 文件目录下的中文目录都是乱码的,这是因为编码方式没有选对,先断开连接,然后打开站点管理器,选中要设置的站点“Ubuntu_lyp”,选择“字符集”,选择强制UTF-8。如下图:
到这两系统文件互传就配置完成了。如果要将 Windows 下的文件或文件夹拷贝到 Ubuntu 中,只需在左侧的Windows 区域选中要拷贝的文件或者文件夹,然后直接拖到右侧的 Ubuntu 中指定的目录即可。将 Ubuntu 中的文件或者文件夹拷贝到 Windows 中也是直接拖放。
NFS服务器:网络文件系统,类unix系统里实现文件共享来使用的。
在后面进行 Linux 驱动开发的时候需要 NFS 启动,因此在这里可以提前配置。先安装并开启 Ubuntu中的NFS服务,用如下命令安装NFS服务:
sudo apt-get install nfs-kernel-server rpcbind
安装完成以后在用户根目录下创建一个名为“linux”的文件夹,以后所有的东西都放到这个“linux”文件夹里面,在“linux”文件夹里面新建一个名为“nfs”的文件夹,如下图:
创建的 nfs 文件夹供 nfs 服务器使用,以后我们可以在开发板上通过网络文件系统来访问 nfs 文件夹,要先配置 nfs,使用如下命令打开 nfs 配置文件/etc/exports:
sudo vi /etc/exports
打开/etc/exports 以后在后面添加如下所示内容:
/home/lyp/linux/nfs *(rw,sync,no_root_squash)
rw-读写权限;
sync-不存于缓冲区,实时写入磁盘;
no_root_squash-访问nfs服务器的其它主机root用户拥有对此共享文件夹完全控制的权限
重启 NFS 服务,使用命令如下:
sudo /etc/init.d/nfs-kernel-server restart
可用showmount -e命令查看NFS共享文件/文件夹的情况。
在开发板ping通Ubuntu系统后,可用showmount -e+“NFS服务端IP”来查看NFS服务器共享目录。
挂载NFS文件系统
sudo mount -t nfs "NFS服务端Ip":/home/lyp/linux/nfs /mnt
-t nfs:指定挂载的文件系统格式为nfs。
/home/lyp/linux/nfs:指定NFS服务器的共享目录。
/mnt:开发板的本地挂载目录。
挂载之后,在PC端Ubuntu系统上就可查看开发板上的共享目录。
开启 Ubuntu 的 SSH 服务以后我们就可以在 Windwos 下使用终端软件登陆到 Ubuntu,比如
使用 MobaXterm,Ubuntu 下使用如下命令安装 ssh 服务,ssh 的配置文件为 /etc/ssh/sshd_config,使用默认配置即可。
sudo apt-get install openssh-server
ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,我们在 Linux 进行 C 语言开发时使用 GCC 编译器进行代码编译,但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在要编译的是 ARM 架构的代码,所以我们需要一个在 X86 架构的 PC 上运行,可以编译 ARM 架构代码的 GCC 编译器,这个编译器就叫做交叉编译器,总结一下交叉编译器:
1、是一个 GCC 编译器。
2、此 GCC 编译器是运行在 X86 架构的 PC 上的。
3、此 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯
片上运行的。
4、交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。
交叉编译器有很多种,我们使用 Linaro 出品的交叉编译器。官网下载即可。我下载的是正点的资料里面的版本:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz,是针对64位系统的,因为我的Ubuntu是64位的。
利用上面安装好的FileZilla软件,将:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz拷贝到Ubuntu中,在 Ubuntu 中创建目录: /usr/local/arm,命令:sudo mkdir /usr/local/arm。
创建完成以后将刚刚拷贝的交叉编译器复制到 /usr/local/arm 这个目录中。
复制完成以后在 /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”的文件夹,这个文件夹里面就是我们的交叉编译工具链。
修改环境变量,使用 VI 打开 /etc/profile 文件,命令:sudo vi /etc/profile
打开/etc/profile 以后,在最后面输入如下所示内容,千万不要输入错误。
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。
在安装交叉编译工具gcc-linaro时,对环境变量进行了编辑,在里面加一句gcc-linaro所需要用到的环境变量,如下:
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
配置完重启Ubuntu发现输入正确的密码后,它又跳回输入密码的登录界面。后来我在网上查发现是由于Ubuntu环境变量错误,才导致无法正常登录。我是因为上面加的那句环境变量输错了,补救方法如下:
首先,通过Ctrl+Alt+F1~6进入非图形化界面的终端进行操作。当通过Ctrl+Alt+F1~6进入非图形化界面的终端后第一步应该先登录到指定账户,不能直接执行命令,不然会一直Login incorrect。如下:(弹出Welcome to Ubuntu......说明登录到指定账户了。)登录账户输入的应该是该账户的密码,并且不能用键盘右边的数字键输入,应该用字母上边的数字键输入。
第二步:在非图形化界面终端下修改环境变量要编辑 /etc/profile,正常开机的情况下使用的命令是:sudo vim /etc/profile。但由于Ubuntu环境变量错误,因此系统找不到sudo命令,也找不到vim命令,所以只能人工指定各个命令的的绝对路径,然后调用对应命令。由于sudo 和 vim都是存放在 “/usr/bin” 目录下。sudo和vim命令的绝对路径分别是:/usr/bin/sudo ;/usr/bin/vim。
因此要编辑/etc/profile要使用的命令应该写:
/usr/bin/sudo /usr/bin/vim /etc/profile
输入完上述命令后,就进入vim编辑器下的/etc/profile,然后对自己所加的环境变量进行检查,把环境变量修改为正确的,然后再保存退出(如果不知道新加的那条环境变量到底哪里错误的话,直接把自己之前添加的内容删除掉然后保存就可以了)。
第三步:重启系统
正常状态下重启使用命令:sudo reboot
但是现在系统无法执行此命令,所以要使用命令应该是 :
/usr/bin/sudo /sbin/reboot
等待系统重启完之后进入到登录页面,再次输入密码就可以成功进入Ubuntu。
VSCode 有 Windows、 Linux 和macOS 三个版本的,是一个跨平台的编辑器。直接在官网下载即可,完全免费。
Windows 版本的安装和容易,和其他 Windows 软件一样,双击.exe 安装包,然后一路“下一步”即可,安装完成以后在桌面上就会有 VSCode 的图标。
我们有时候也需要在 Ubuntu 下阅读代码,所以还需要在 Ubuntu 下安装 VSCode。 下载Linux版本得到的.deb 软件包拷贝到 Ubuntu系统中,然后使用如下命令安装:
sudo dpkg -i code_1.32.3-1552606978_amd64.deb //1.32.3是版本号,根据自己的.deb文件名字来
我们可以将图标添加到 Ubuntu 桌面上,安装的所有软件图标都在目录/usr/share/applications 中,进入到此目录复制一份快捷方式到桌面即可。
我们需要按照的插件有下面几个:
1)、Chinese(Simplified),即中文环境。
2)、 C/C++ Snippets,即 C/C++重用代码块。
3)、 C/C++ Advanced Lint,即 C/C++静态检测 。
4)、 Code Runner,即代码运行。
5)、 Include AutoComplete,即自动头文件包含。
6)、 indent-rainbow,彩虹花括号等增加代码美观性的插件,有助于阅读代码。
7)、 One Dark Pro, VSCode 的主题。
8)、 GBKtoUTF8,将 GBK 转换为 UTF8。
9)、 Arm Assembly,即支持 ARM 汇编语法高亮显示。
10)、C/C++,这个肯定是必须的。
11)、 vscode-icons, VSCode 图标插件,主要是资源管理器下各个文件夹的图标。
12)、 compareit,比较插件,可以用于比较两个文件的差异。
13)、 DeviceTree,设备树语法插件。
我们一般在 Windwos 下通过串口来调试程序,或者使用串口作为终端, I.MX6U-ALPHA 开发板使用 CH340 这个芯片实现了 USB 转串口功能。
先通过 USB 线将开发板的串口和电脑连接起来起来,再安装CH340驱动。
CH340 是需要安装驱动的,驱动在开发板资料中。开发板光盘->3、软件->CH340 驱动(USB 串口驱动)_XP_WIN7 共用->SETUP.EXE,双击 SETUP.EXE,打开如下图所示安装界面:
在设备管理器中找到了有“USB-SERIAL CH340”字样的端口设备就说明 CH340 驱动配置成功, 一定要用 USB 线将开发板的串口和电脑连接起来。
MobaXterm 也是一个类似 SecureCRT 和 Putty 的终端软件,功能强大而且免费!MobaXterm 软件在其官网下载即可。有免费版和收费版,免费版即可。如下图,下载好了之后的界面:
MobaXterm 软件支持很多种协议,比如 SSH、Telnet、Rsh、Xdmcp、RDP、VNC、FTP、SFTP、Serial 等等。我们使用MobaXterm的主要目的就是作为串口终端使用。因此我们需要建立 Serial 连接,也就是串口连接。MobaXterm具体使用方法在这里就不详细介绍了,比较简单,就是学习51,32时候的串口调试助手。自己摸索配置一遍就记住了。
在安装交叉编译器时候,遇到了修改环境变量的操作,在此记录一下有关Linux环境变量的知识。
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,是操作系统为了满足不同的应用场景在系统内预先设置的一大批全局变量。
Linux下为什么要设置环境变量?
Linux执行一些命令时,它会去很多目录去搜索对应的可执行程序,如果可执行程序分散在不同的目录下,当搜索时会非常的耗费时间。所以Linux就规定好,当执行一个命令时,就到某一个指定的文件中去寻找可执行程序所在的目录,这个指定的文件就是环境变量配置文件。
按生命周期分:
按作用域分:
Linux环境变量分类介绍:
系统级环境变量:系统级环境变量对所有用户和进程都可见。它们通常在系统启动时被设置,并被所有用户和进程共享。一些常见的系统级环境变量包括PATH(用于指定可执行文件的搜索路径)、LANG(用于设置系统语言环境)等。
用户级环境变量:用户级环境变量是每个用户独立设置的,只对该用户及其相关进程可见。这些变量可以在登录时通过不同的配置文件(如.bashrc、.bash_profile、.profile等)设置。常见的用户级环境变量包括HOME(指定用户的主目录路径)、USER(当前用户名)等。
进程级环境变量:进程级环境变量是由特定进程设置的,并且仅对该进程及其子进程可见。这些变量可以通过编程语言(如C语言中的setenv函数)在程序中进行设置,或者通过终端命令行在特定的进程上下文中设置。
重新打开一个终端的话:~/.profile和/etc/profile不会被重新执行,~/.bashrc和/etc/bashrc会被重新执行。
全部用户,全部进程共享:/etc/bash.bashrc。
一个用户,全部进程共享:~/.bashrc。
系统级环境变量和用户级环境变量通常是通过配置文件进行设置和管理的。对于系统级环境变量,常见的配置文件包括 /etc/profile和 /etc/environment。对于用户级环境变量,常见的配置文件包括用户的个人配置文件(如.bashrc、.bash_profile、.profile等)。
每个环境变量都有其特定的作用和范围,我们需要设置环境变量的时候,要注意需要修改什么文件。要想对所有的用户生效,那就需要设置系统级的环境变量配置文件。反之,需要修改用户级的环境变量配置文件(最好是修改.profile文件)。
Linux系统中许多常用的环境变量可以影响系统的行为和配置。以下是一些常见的Linux环境变量:
PATH:决定系统在哪些目录中查找可执行文件。(当输入一个命令时,系统会在PATH中定义的目录中查找该命令的可执行文件。)
HOME:指定当前用户工作的主目录路径。(即用户登陆到Linux系统中时,默认的目录)
USER:当前用户的用户名。
SHELL:指定当前用户所使用的shell。
LANG/LANGUGE:指定系统的默认语言。
LD_LIBRARY_PATH:指定系统在哪些目录中查找共享库文件。
TERM:指定当前终端的类型。
MAIL:指当前用户的邮件存放目录。
PS1:定义命令行提示符的格式。对于root用户是#,对于普通用户是$。
PS2:定义多行命令的提示符的格式。
添加系统级环境变量
export [-fnp][变量名称]=[变量设置值] #Linux export 命令用于设置或显示环境变量。
例如:在上面安装Linaro交叉编译器时修改环境变量,使用vi打开 /etc/profile 文件,命令:sudo vi /etc/profile。在里面加入:export PATH="$PATH:/usr/local/arm/bin"。修改文件后要想马上生效可以运行source /etc/profile,还可重进此用户,也就是重启后生效。
SSH/串口终端临时添加环境变量
直接运行export命令定义变量,(只对当前shell有效,再重新打开一次shell就失效了)
在shell的命令行终端下直接使用[export 变量名=变量值] 定义变量,该变量只在当前shell(BASH)或其子shell(BASH)下是有效的。shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。
要永久删除环境变量,需要编辑对应的配置文件,并将环境变量从文件中删除。具体的配置文件取决于要删除的是系统环境变量还是用户环境变量。
删除系统环境变量,需要root用户权限编辑 /etc/environment文件。在该文件中,找到并删除相应的环境变量。
删除用户环境变量,不需要root,直接编辑/.bashrc、/.bash_profile或~/.profile文件(根据使用的Shell)并删除相应的环境变量。
set可以设置某个环境变量的值。可以使用unset删除指定的环境变量的值。如果未指定值,则该变量值将被设为NULL。示例如下:
export abc="123" #增加一个环境变量abc
env|grep abc #显示当前用户的所有环境变量,并在其中查找abc这个变量,有输出证明环境变量abc存在
unset abc #删除环境变量abc
env|grep TEST #此命令没有输出,证明环境变量abc已经删除
要查看PATH环境变量的值,可以使用以下命令:echo $PATH。
显示当前用户的所有环境变量:printenv或env。
查看指定环境变量:echo $PATH 或者 echo $HOME 或者 echo $USER。使用set查看所有本地定义的环境变量。
/etc/environment ->/etc/profile -> /etc/bashrc -> /etc/profile.d/*.sh->
~/.profile -> ~/.bashrc -> ~/.bash_logout
Linux加载环境变量的顺序如下:系统环境变量 -> 用户自定义环境变量
/etc/environment -> /etc/profile -> ~/.profile
打开/etc/profile
文件你会发现,该文件的代码中会加载/etc/bash.bashrc
文件。
然后检查/etc/profile.d/
目录下的.sh脚本
文件并加载。
其次再打开~/.profile文件,会发现该文件中加载了~/.bashrc
文件。
从~/.profile
文件中代码发现,~/.profile
文件只在用户登录的时候读取一次,而/.bashrc
会在每次运行Shell
脚本的时候读取一次。
子shell进程中执行:/bin/bash 和 ./
当前进程中执行:source 和 .
IMX6ULL是恩智浦旗下的一款基于Arm Cortex-A7芯片,跟Arm Cortex-M系列芯片一样,都有GPIO、UART、I2C、SPI、SD、USB、以太网等功能模块,其处理器主频可达到800M(单核),因此其像是一块增强型的单片机,因为其没有内部可供用户使用的RAM与ROM,因此需要外扩RAM与FLASH。
i.MX 6ULL采用单个Arm Cortex-A7内核,运行速度高达528 MHz,可超频运行至将近700MHz。i.MX 6ULL应用处理器包括一个集成的电源管理模块,降低外接电源的复杂性,简化了上电时序。这个系列的每个处理器提供多种存储器接口,其中包括16位LPDDR2、DDR3、DDR3L、原始和管理的NAND闪存、NOR闪存、eMMC、Quad SPI和各种其他接口,用于连接外围设备,如WLAN、Bluetooth®、GPS、显示器和摄像头传感器。
CPU复合器件
- Cortex-A7内核,运行频率900 MHz,128 KB L2缓存
显示
- 并行LCD显示,分辨率高达WXGA (1366x768)
- 8/10/16/24位并行摄像头传感器接口
- 电泳显示屏控制器支持直接驱动E-Ink EPD面板,分辨率高达2048x1536,工作频率106 Hz
存储器
- 16位LP-DDR2, DDR3/DDR3L
- 8/16位并行NOR FLASH / PSRAM
- 双通道Quad-SPI NOR FLASH
- 8位原始NAND FLASH与40位ECC
数据连接
- 2个MMC 4.5/SD 3.0/SDIO端口
- 2个USB 2.0 OTG,HS/FS,器件或主机,带PHY接口
- 音频接口包括3个I2S/SAI, S/PDIF Tx/Rx
- 2个10/100以太网,支持IEEE 1588协议
- 2个12位ADC,高达10个输入通道,以及电阻式触摸控制器(4线/5线)
处理器架构:是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前市面上的CPU指令集主要分有两大阵营,一是intel、AMD为首的复杂指令集CPU,二个是以IBM、ARM为首的精简指令集CPU。不同品牌的CPU,其产品的架构也不相同,例如,Intel、AMD的CPU是X86架构的,而IBM公司的CPU是PowerPC架构,ARM公司是ARM架构。
Cortex-A7是由ARM(先进的精简指令集机器)设计的一种处理器架构,属于ARMv7-A架构系列的一部分。Cortex-A7在ARM架构中的定位是作为性能和功耗的折中,既可以提供相对较高的处理能力,又能够保持低功耗和高效率。
对于STM32,管脚命名:PA0~15、PB0~15、PC、PD.......
对于I.MX 6ULL,管脚命名:(既是寄存器名,又是管脚名,管脚名只取后面标红的那一段)
IOMUXC_SNVS_SW_MUX_CTL_PAD_BOOT_MODE0。
I.MX6ULL查看管脚复用功能:打开I.MX6ULL参考手册第32章,IO复用章节,查找对应的管脚。
一个IO对应两个32位的寄存器,比如:PAD_BOOT_MODE0对应如下两个寄存器。
IOMUXC_SNVS_SW_MUX_CTL_PAD_BOOT_MODE0:MUX代表配置置BOOT_MODE0复用功能的。
IOMUXC_SNVS_SW_PAD_CTL_PAD_BOOT_MODE0:PAD代表配置BOOT_MODE0的电气特性的。
写在最后:希望本文可以帮助到各位读者,文章如有不足,欢迎大家指出,如果文章帮到你了,请一定帮忙点个赞哦。