目录
为什么我们要学习裸机开发呢?
1、裸机开发是了解所使用的 CPU 最直接、最简单的方法,比如使用的 I.MX6U,跟STM32 一样,裸机开发是直接操作 CPU 的寄存器。Linux 驱动开发最终也是操作的寄存器,但是在操作寄存器之前要先编写一个符合 Linux 驱动的框架。同样一个点灯驱动,裸机可能只需要十几行代码,但是 Linux 下的驱动就需要几十行代码。
2、大部分 Linux 驱动初学者都是从 STM32 转过来的,Linux 驱动开发和 STM32 开发区别很大,比如 Linux 没有 MDK、IAR 这样的集成开发环境,需要我们自己在 Ubuntu 下搭建交叉编译环境。
3、裸机开发是连接 Cortex-M(如 STM32)单片机和 Cortex-A(如 I.MX6U)处理器的桥梁。
要进行裸机开发肯定要先搭建好开发环境,我们在开始学习 STM32 的时候肯定需要安装一堆的软件,比如 MDK、IAR、串口调试助手等等,这个就是 STM32 的开发环境搭建。同样的,要想在 Ubuntu 下进行 Cortex-A(I.MX6U)开发也需要安装一些软件,进行开发环境的搭建,环境搭建好以后我们就可以进行开发了。环境搭建分为 Ubuntu 和 Windows,因为我们最熟悉 Windows,所以代码编写、查找资料啥的肯定是在 Windows 下进行的。但是 Linux 开发又必须在 Ubuntu 下进行,所以还需要搭建 Ubuntu 下的开发环境,主要是交叉编译器的安装,所以接下来分为:Ubuntu 和 Windows,介绍这两种系统下环境的搭建。
在开发的过程中会频繁的在 Windows 和 Ubuntu 下进行文件传输,比如在 Windwos 下进行代码编写,然后将编写好的代码拿到 Ubuntu 下进行编译。Windows 和 Ubuntu 下的文件互传我们需要使用 FTP 服务,设置方法如下:
1.开启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
2、Windows下FTP客户端安装
Windows 下 FTP 客户端我们使用 FileZilla,这是个免费的 FTP 客户端软件,可以在 FileZilla
官网下载,下载地址如下:https://www.filezilla.cn/download,下载界面如下图所示:

打开 FileZilla 软件,界面如下图所示:

3、FileZilla 软件设置
Ubuntu 作为 FTP 服务器,FileZilla 作为 FTP 客户端,客户端肯定要连接到服务器上,打开站点管理器,点击:文件->站点管理器,打开以后如下图所示:

点击图中的“新站点(N)”按钮来创建站点,新建站点以后就会在“我的站点”下出现新建的这个站点,站点的名称可以自行修改,比如我将新的站点命名为“Ubuntu”如下图所示:

选中新创建的“Ubuntu”站点,然后对站点的“常规”进行设置,设置如下图所示:

按照上图中设置好以后,点击“连接”按钮,第一次连接可能会弹出提示是否保存密码的对话框,点击确定即可。连接成功以后如下图所示:

连接成功以后如图上图所示,其中左边就是 Windows 文件目录,右边是 Ubuntu 文件目录,默认进入用户根目录下(比如我电脑的“/home/zhangyu”)。但是注意观察在图上中Ubuntu 文件目录下的中文目录都是乱码的,这是因为编码方式没有选对,先断开连接,点击:服务器(S)->断开连接,然后打开站点管理器,选中要设置的站点“Ubuntu”,选择“字符集”,如下图所示:

按照上图设置好字符集以后重新连接到 FTP 服务器上,重新链接到 FTP 服务器以后Ubuntu 下的文件目录中文显示就正常了,如下图所示 :

如果要将 Windows 下的文件或文件夹拷贝到 Ubuntu 中,只需要在上图中左侧的Windows 区域选中要拷贝的文件或者文件夹,然后直接拖到右侧的 Ubuntu 中指定的目录即可。将 Ubuntu 中的文件或者文件夹拷贝到 Windows 中也是直接拖放。
1.NFS 服务开启
后面进行 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

重启 NFS 服务,使用命令如下:
sudo /etc/init.d/nfs-kernel-server restart
SSH 服务开启
开启 Ubuntu 的 SSH 服务以后我们就可以在 Windwos 下使用终端软件登陆到 Ubuntu,比如使用 SecureCRT,Ubuntu 下使用如下命令开启 SSH 服务:
sudo apt-get install openssh-server
上述命令安装 ssh 服务,ssh 的配置文件为/etc/ssh/sshd_config,使用默认配置即可。
1.交叉编译器安装
ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,我们在前边文章Ubuntu下Linux C编程里面已经介绍了如何在 Liux 进行 C 语言开发,里面使用 GCC 编译器进行代码编译,但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在要编译的是 ARM 架构的代码,所以我们需要一个在 X86 架构的 PC 上运行,可以编译 ARM 架构代码的 GCC 编译器,这个编译器就叫做交叉编译器,总结一下交叉编译器就是:
交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。
交叉编译器有很多种,我们使用 Linaro 出品的交叉编译器,Linaro 是一间非营利性质的开放源代码软件工程公司,Linaro 开发了很多软件,最著名的就是 Linaro GCC 编译工具链(编译器),关于 Linaro 详细的介绍可以到 Linaro 官网查阅。Linaro GCC 编译器下载地址如下:
https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/
打开以后的界面如下图所示:

在上图中有很多种交叉编译器,我们只需要关注这两种: gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf.tar.tar.xz 和 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz,第一个是针对 32 位系统的,第二个是针对 64 位系统的。根据自己所使用的 Ubuntu 系统类型选择合适的版本,比如我安装的 Ubuntu 16.04 是 64 位系统,因此我要使用 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz。
我们要先将交叉编译工具拷贝到 Ubuntu 中,在上边我们在当前用户根目录下创建了一个名为“linux”的文件夹,在这个 linux 文件夹里面再创建一个名为“tool”的文件夹,用来存放一些开发工具。使用前面已经安装好的 FileZilla 将交叉编译器拷贝到 Ubuntu 中刚刚新建的“tool”文件夹中,操作如下图所示,且成功完成的话FileZilla会有提示。

在 Ubuntu 中创建目录:/usr/local/arm,命令如下:
sudo mkdir /usr/local/arm
创建完成以后将刚刚拷贝的交叉编译器复制到/usr/local/arm 这个目录中,在终端使用命令“ cd” 进入 到 存放 有交 叉编 译 器的 目录 ,比如我前面将交叉编译器拷贝到了目录“/home/zuozhongkai/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”的文件夹,这个文件夹里面就是我们的交叉编译工具链。
修改环境变量,使用 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
添加完以后的/etc/profile如下图所示:

修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。
2.安装相关的库
在使用交叉编译器之前还需要安装一下其它的库,命令如下:
sudo apt-get install lsb-core lib32stdc++6
等待这些库安装完成
3.交叉编译器验证
首先查看一下交叉编译工具的版本号,输入如下命令:
arm-linux-gnueabihf-gcc -v
如果交叉编译器安装正确的话就会显示版本号,如下图所示:

从上图中可以看出当前交叉编译器的版本号为 4.9.4,说明交叉编译工具链安装成功。在前边的介绍中我们使用 Ubuntu 自带的 GCC 编译器,我们用的是命令“gcc”。要使用刚刚安装的交叉编译器的时候使用的命令是“arm-linux-gnueabihf-gcc”,“arm-linux-gnueabihfgcc”的含义如下:
最好的验证方法就是直接编译一个例程,我们就编译第一个裸机例程“1_leds”试试,在前面创建的 linux 文件夹下创建 driver/board_driver 文件夹,用来存放裸机例程,如图下图所示:

将第一个裸机例程“1_leds”拷贝到 board_driver 中,然后执行 make 命令进行编译,如下图所示:

从上图中可以看到例程“1_leds”编译成功了,编译生成了 led.o 和 led.bin 这两个文件,使用如下命令查看 led.o 文件信息:
file led.o
结果如下图所示:

从上图中可以看到 led.o 是 32 位 LSB 的 ELF 格式文件,目标机架构为 ARM,说明我们的交叉编译器工作正常。
由于这个软件是付费的,所以我不太喜欢用这个软件开发,先介绍一下下,我在开发过程中还是喜欢用Visual Studio Code.
1. Source Insight 安装
Source Inisght 是一款功能强大的代码编辑、阅读工具,工作在 Windows 下,我们可以Source Insight来进行代码编写和阅读,编写完成以后将代码拷贝到 Ubuntu中去编译即可。SourceInsight 下载地址为:https://www.sourceinsight.com/download/,如下图所示:

双击“sourceinsight4086-setup.exe”即可开始安装,首先是如下图所示欢迎界面 :

点击上图所示的“Next”按钮进入下一步,如下图所示:

选择上图中的“I accept the terms in the license adreement”,然后点击“Next”按钮,进入安装目录选择界面,根据自己的实际情况选择合适的安装目录,如下图所示:

选择好安装目录以后点击“Next”按钮,进入图 4.4.1.5 所示的准备安装界面:

点击上图中的“Install”按钮开始安装,等待安装完成,安装完成以后如下图所示:

点击上图中的“Finish”按钮退出安装,安装成功以后会在桌面上出现 Source Insight4.0 的图标,如下图所示:

双击图标打开 Source Inisght 4.0,第一次打开的话会有 Licese 提示,因为 Source Insight 4.0 是个收费软件,所以是需要购买 License 的,如果没有购买的话可以免费体验 30 天,如下图所示:

在上图中,如果你已经购买了 licese 那么就选择第一个,如果没有购买 licese 的话就选择第二个免费体验 30 天,选择好以后点击“Next”按钮,进入下图所示界面

填写完上图中的信息,然后点击“Next”,填写好以后一路“Next”下去就可以了,打开以后的默认界面如下图所示

至此 Source Insight 安装完成。
2. Source Insight 新建工程
跟 MDK、IAR 一样,Source Insight 是需要创建工程的,但是远没有 MDK 和 IAR 那么复杂,先新建一个工程文件夹, 比如 test,test 用来存放工程所有文件,包括 Source Insight 工程文件和 C 语言源码文件。
注意!Source Insight 的工程不能有中文路径!!!!!!
1.Visual Studio Code 的安装
Visual Stuio Code 和 Source Insight 一样,都是编辑器,Visual Studio Sode 本教程以后就简称为 VSCode,VSCode 是微软出的一款编辑器,但是免费的。VSCode 有 Windows、Linux 和macOS 三个版本的,是一个跨平台的编辑器。VSCode 下载地是:https://code.visualstudio.com/,下载界面如下图所示:

在上图中下载自己想要的版本,本教程需要 Windows 和 Linux 这两个版本,所以下载这两个即可。
Windows 版本安装(傻瓜式安装)
Windows 版本的安装和容易,和其他 Windows 一样,双击.exe 安装包,然后一路“下一步”即
可,安装完成以后在桌面上就会有 VSCode 的图标,如下图所示:

双击图上图打开 VSCode,默认界面如下图所示:

Linux 版本安装
我们有时候也需要在 Ubuntu 下阅读代码,所以还需要在 Ubuntu 下安装 VSCode。然后我们使用如下命令进行安装:
sudo dpkg -i code_1.32.3-1552606978_amd64.deb
等待安装完成,如下图所示:

2. Visual Studio Code 插件的安装
VSCode 支持多种语言,比如 C/C++、Python、C#等等,本教程我们主要用来编写 C/C++称序的,所以需要安装 C/C++的扩展包,扩展包安装很简单,如下图所示:

我们需要按照的插件有下面几个:
如果想要查看已经安装好的插件,可以按照下图的方法进行查看:

安装好插件以后就可以进行代码编辑了,截至目前,VSCode 界面都是英文环境,我们已经安装了中文插件了,最后将 VSCode 改为中文环境,按下“Ctrl+Shift+P”打开搜索框,在搜索框里面输入“config”,然后选择“Configure Display Language”。如下图所示:

在打开的 local.json 文件中将 locale 修改为 zh-cn,如图下图所示:
修改完成以后保存 local.json,然后重新打开 VSCode,测试 VSCode 就变成了中文的了,如下图所示:

3.Visual Studio Code 新建工程
新建一个文件夹用于存放工程,比如我新建的文件夹目录为 E:\VScode_Program\1_test,路径尽量不要有中文和空格。打开 VSCode,然后在 VSCode 上点击文件->打开文件夹…,选刚刚
创建的“test”文件夹,打开以后如下图所示:

从上图可以看出此时的文件夹“TEST”是空的,点击文件->将工作区另存为…,打开工作区命名对话框,输入要保存的工作区路径和工作区名字,如下图所示:

工作区保存成功以后,点击图上图中的“新建文件”按钮创建 main.c 和 main.h 这两个文件,创建成功以后 VSCode 如下图所示:

从下图可以看出,此时“实验 TEST”中有main.c 和 main.h,这三个文件和文件夹同样会出现在“实验TEST文件夹中,如下图所示:

在main.h中输入如下所示内容:
# include<stdio.h>
int add(int a, int b)
在main.c中输入如下所示内容:
# include <main.h>
int add(int a, int b)
{
return (a+b);
}
int main(void)
{
int value = 0;
value = add(5,6);
printf("5 + 6 = %d", value);
return 0;
}
代码编辑完成以后VSCode 界面如图所示:

从上图可以看出,VSCode 的编辑的代码高亮很漂亮,阅读起来很舒服。但是此时提示找不到“stdio.h”这个头文件,如下图所示错误提示:

在上图中提示找不到“main.h”,同样的在 main.h 文件中会提示找不到“stdio.h”。这是因为我们没有添加头文件路径。按下“Ctrl+Shift+P”打开搜索框,然后输入“Edit configurations”,选择“C/C++:Edit configurations…”,
C/C++的配置文件是个 json 文件,名为:c_cpp_properties.json,此文件默认内容如下图所示:

c_cpp_properties.json 中的变量“includePath”用于指定工程中的头文件路径,但是“stdio.h”是 C 语言库文件,而 VSCode 只是个编辑器,没有编译器,所以肯定是没有 stdio.h 的,除非我们自行安装一个编译器,比如 CygWin,然后在 includePath 中添加编译器的头文件。这里我们就不添加了,因为我们不会使用 VSCode 来编译程序,这里主要知道如何指定头文件路径就可以了。
我们在 VScode 上打开一个新文件的话会覆盖掉以前的文件,这是因为 VSCode 默认开启了预览模式,预览模式下单击左侧的文件就会覆盖掉当前的打开的文件。如果不想覆盖的话采用双击打开即可,或者设置 VSCode 关闭预览模式,设置如下图所示:

我们在编写代码的时候有时候会在右下角有如下图所示的警告提示:

这是因为插件 C/C++ Lint 打开了几个功能,我们将其关闭就可以了,顺便也可以学习一下VSCode 插件配置方法, 如下图所示:

在 C/C++ Lint 配置界面上找到 CLang:Enable、Cppcheck:Enable、Flexlint:Enable 这个三个,然后取消掉勾选即可,下图所示:

按照上图所示取消这三个有关 C/C++ Lint 的配置以后就不会有图所示的错误提示了。但是关闭 Cppcheck:Enable 以后 VSCode 就不能实时检查错误了,大家根据实际情况选择即可。
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.
谈到现状,国内的软件测试行情目前呈现了两极分化的极端情况。一个是早期的手工测试人员吐槽工作不好做,即使有工作也是外包,而且薪资太低;一方面是很多互联网企业感叹自动化测试人才难找,有技术的自动化测试工程师,高薪难聘。这两者其实并不矛盾。手工测试工作难找也确实是目前真实的行情早期从事功能测试的手工测试人员,在测试方面大多采用手动、人工执行的方式查找软件缺陷和BUG,用行业术语来描述就是“点点点”。这种测试方式耗费大量人力和资源,工作效率却十分低下。在早期软件复杂和迭代程度不高的情况下,有资本的企业会“供养”一批这样的手工测试人员。但对测试员本身来讲,毫无技术难度的工作,和几乎没有保障的薪资水平,直
其实现在基础的资料和视频到处都是,就是看你有没有认真的去找学习资源了,去哪里学习都是要看你个人靠谱不靠谱,再好的教程和老师,你自己学习不进去也是白搭在正式选择之前,大可以在各种学习网站里面找找学习资源先自己学习一下为什么选择学软件测试?同学们理由众多!大概分这几类:①不受开发语言、行业产品变化限制;②入门更简单,对零基础、女生都友好;③软件项目都需要测试人员,职业生涯稳;④学习周期短,但薪资并不低。要想“肩扛”一条线?需掌握三大技能:技能1:掌握测试流程,熟悉系统框架能提前与开发人员一起制定测试计划,通过测试左移,推动代码评审,代码审计,单元测试,自动化冒烟测试,来保证研发阶段的质量。技能2:
我有这个可以为我生成一个超链接:我希望它显示在td标签中,所以我想使用这个content_tag来帮助我:"example")%>我想要我的td中的超链接,所以我有这样的东西:,:class=>"example")%>但是我收到语法错误,我该怎么办? 最佳答案 内联:'example')%>或block形式:'example')do%> 关于ruby-on-rails-如何在RoR中使用content_tag嵌入标签?,我们在StackOverflow上找到一个类似的问题:
2022年伊始,默安科技联合数世咨询举办以“软件供应链安全的时与势”为主题的访谈活动,由数世咨询创始人李少鹏主持,邀请贝壳安全研发负责人李文鹏、北京邮电大学副教授张文博、默安科技副总裁沈锡镛三位行业大咖做客网安小酒馆,从产业、企业、学术的不同维度,共同探讨软件供应链安全建设的新思路,为业界呈现了一场开年网安盛宴。随着全球软件供应链安全事件频发,软件供应链安全逐渐成为业界关注焦点,也成为影响国家重要信息系统安全与关键信息基础设施安全的重要因素,以及网络安全保障体系和能力建设的重要环节。嘉宾们围绕软件供应链安全发展的主要驱动力、关基行业中的实施现状和落地难点、产学研成果转化、软件供应链安全的重要性
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。 因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不
我需要快速可靠的Ruby键值存储。有没有类似的东西?要求它完全在Ruby进程内运行,不需要任何外部进程。它可能在显式磁盘刷新的内存中。它需要具有最小的键值检索时间,写入时间可能不太好。存储的数据量不会很糟糕,大约几十万个键,每个键都有~1kb的文本值。 最佳答案 事实证明,对我来说最好的选择是使用纯Hash和Marshal将其序列化到磁盘。对于那么多的对象,YAML肯定太慢了。感谢@ian-armit加强了我对核心Ruby库的信任。 关于ruby-Ruby是否有任何可嵌入的键值存储?,我
给定一个任意的mongoid文档,我如何将其转换为JSON并包含任何嵌入式结构,而不是在我的to_json语句中特别包含这些结构。例如:#!/usr/bin/envrubyrequire'mongoid'require'json'require'pp'classDocincludeMongoid::DocumentincludeMongoid::Timestampsfield:doc_specific_info,type:Stringembeds_many:personsendclassPersonincludeMongoid::Documentfield:role,type:Stri
我需要将嵌入式文档转换成它自己的集合,以便它可以从另一个集合中引用。假设我有一个Parent嵌入了许多Child。我在想一些事情:Parent.all.eachdo|p|p.childs.all.eachdo|c|c.raw_attributes['parent_id']=p.idendp.save!#willsaveparentandcascadepersistallchildsontotheirowncollend这是一个选项吗?理想情况下,我会在控制台中运行它,我只会将mongoid映射从embed_*更改为has_*,因此我不需要更改其余代码或使用另一个集合作为暂存。