arm开发板有哪些 arm开发板


arm开发板有哪些 arm开发板

文章插图
Arm开发板(什么是arm开发板)
打开盒子,里面有一张全家福照片 。

箱内物品包括开发板(背板+核心板)、12V2A电源适配器、micro usb安卓数据线、type-c安装数据线、显示线 。

再给我一张开发板的特写 。

该开发板有两个版本,一个是内存容量为512MB+512MB的NAND版本,另一个是内存为512MB+8GB的eMMC版本 。我手里有NAND版 。NAND和eMMC开发的程序除了U-boot之外都是一样的,很容易切换 。Wildfire i.MX6ULL处理器的主频为800MHz,包含两个网络端口,因此很容易对网络进行编程 。

开发板的配置如上图 。板载一个HDMI高清视频接口,在没有屏幕的情况下可以直接连接电脑屏幕 。关于开箱的内容,就这些 。
NFS的环境建设本文将ubuntu18.04安装在win10的虚拟机中进行开发,所有的坑和解决方案都是基于这个系统 。在ubuntu的终端输入
sudo apt-get updatesudo apt install net-toolssudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop将ubuntu和开发板连接到同一个路由器上,确保它们的ip在同一个网段上 。进入Ubuntu
sudo apt install nfs-kernel-server在home/user下设置nfs文件夹,通过下面的命令给予权限(我的用户目录是hasee)
sudo chmod -R 777 nfs使用vim命令打开/etc/exports以更改以下内容

保存后重新启动虚拟机 。使用ifconfig查询ubuntu下的原生ip

我的IP: 192.168.2.217通过串口终端连接win10电脑和开发板,分享了一个我经常用的工具mobxterm _ personal _ 20.6,很强大,谁都知道 。打开MobaXterm,操作如下图 。

这样就可以操作开发板的终端了 。首先,在根目录下的mnt目录中设置nfs文件夹,输入pwd并返回到以下路径

进入开发板
sudo mount -t nfs 192.168.2.217:/home/user/nfs /mnt/nfs解释:192.168.2.217此IP是计算机虚拟机的IP/home/user/nfs Ubuntu是虚拟机的nfs文件夹路径ubuntu /mnt/nfs是开发板中NFS的路径,只要不出现以下提示就表示成功:

编写第一个测试程序用ubuntu编写一个简单的测试程序,文件名为helloworld.c,源代码如下
#include "stdio.h"int main(int argc,char **argv){printf("hello world!\n");return 0;}执行以下命令进行编译 。这里必须使用交叉编译工具,否则无法在开发板上运行:
gcc-arm-linux-gnueabihf-gcc helloworld.c -o helloworldhelloworld文件将在相同的路径中生成,如下所示

通过cp命令将新生成的helloworld文件复制到ubuntu的home/user/nfs路径 。在win10上用MobaXterm工具操作开发板终端,进入/mnt/nfs路径,找到里面的helloworld文件,执行命令 。
./helloworld
这意味着程序成功执行,构建的环境可用 。前面已经实现了最简单的驱动模板,这次继续探讨驱动的编写 。驱动代码核心的两句话是注册模块加载函数module_init()和注册模块卸载函数module_exit() 。这次要提的是设备号的申请,角色设备的注册,节点的创建 。
应用设备号申请设备号通常有两种方式:静态申请和动态申请 。
静态应用设备号静态应用设备号的功能原型
int register_chrdev_region(dev_t from, unsigned count, const char *name)//参数dev_t from: dev_t类型的变量,用于指定字符设备的起始设备号,如果要注册的设备号已经被其他的设备注册了,那么就会导致注册失败 。//参数unsigned count:指定要申请的设备号个数,count的值不可以太大,否则会与下一个主设备号重叠 。//参数const char *name:表示设备名称,我们可以在/proc/devices中看到该设备 。//返回值0表示申请成功,返回其它表示失败,并且失败的原因可以通过错误码获取 。当使用静态应用程序设备号时,您需要检查内核中使用了哪些设备号 。一旦出现重复,设备号的申请就会失败,相应的设备注册也会不成功,使用起来非常不方便 。
动态应用设备号动态申请设备号的功能原型
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)//参数dev_t *dev:指向dev_t类型数据的指针变量,用于存放分配到的设备编号的起始值;//参数unsigned baseminor:次设备号的起始值,通常情况下,设置为0;//参数unsigned count:同register_chrdev_region类型,用于指定需要分配的设备编号的个数以及设备的名称 。//返回值0表示申请成功,返回其它表示失败,并且失败的原因可以通过错误码获取 。这个函数,内核会自动给我们分配一个未使用的主设备号 。不要以为操作使用比静态方便很多 。在驱动程序开发中很常见,尤其是在3的内核中 。X.


推荐阅读