一.Qemu镜像下载
准备环境 vmware ubuntu18.04 git工具
下载镜像文件
root@ubuntu:/home/mf/Desktop# git clone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git
成功后可以得到一个名为“ubuntu-18.04_imx6ul_qemu_system”的目录,里面有以下内容:


二.运行QEMU系统
1.首次运行需要安装SDL环境
root@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system# ./install_sdl.sh // 提示输入用户密码,等待安装完成
2.运行带GUI的imx6ul模拟器–模拟百问网imx6ul-qemu开发板
root@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system# ./qemu-imx6ull-gui.sh // 启动后,登录名是root,无需密码
输入以上命令启动开发板,进入如下界面,在login处输入用户名:root

成功进入到qemu模拟的imx6ul开发板的界面,如下:

三.获取源码
1.先用git clone下载repo工具,再用repo工具下载源码(repo工具管理代码)
(1)下载repo工具
root@ubuntu:~# git clone https://e.coding.net/codebug8/repo.git
(2)repo命令克隆由 -u 参数提供的 manifest Git 库 -b的linux-sdk分支 -m的imx6ull/100ask-imx6ull_qemu_release_v1.0.xml这个文件
root@ubuntu:~# ../repo/repo init -u https://e.coding.net/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify
(3)下载最新本地工作文件,更新成功,这本地文件和repository 中的代码是一样的。这里指定更新-j4这个project
root@ubuntu:~#../repo/repo sync -j4
如果一切正常,你在/root目录下创建了一个100ask_imx6ull-qemu目录,里有如下内容:

2.配置交叉编译环境
设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量
如需永久修改,请修改用户配置文件。在Ubuntu系统下,修改如下:
root@ubuntu:~# vi ~/.bashrc
在行尾添加或修改:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/root/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
使环境变量生效
root@ubuntu:~#source ~/.bashrc
四.编译内核和设备树
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make mrproper
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make 100ask_imx6ull_qemu_defconfig
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make zImage //编译zImage内核镜像
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make 100ask_imx6ull_qemu.dtb //编译设备树
编译内核如果出现如下报错

解决方法如下,然后在重新编译内核
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#sudo apt-get install lzop
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#apt --fix-broken install
查看生成的内核和设备树的位置
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# find -name zImage
./arch/arm/boot/zImage
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# find -name 100ask_imx6ull_qemu.dtb
./arch/arm/boot/dts/100ask_imx6ull_qemu.dtb
四.修改源码,添加新的驱动
准备环境vscode通过ssh服务连接虚拟机,方便代码的修改
举例:添加新的gpio的驱动,操作如下:
(1)在/root/100ask_imx6ull-qemu/linux-4.9.88/drivers/char路径下面添加驱动文件user_gpio.c和驱动头文件user_gpio.h
user_gpio文件是驱动操控gpio的所有的接口函数的实现
(2)修改/root/100ask_imx6ull-qemu/linux-4.9.88/drivers/char路径下的Makefile文件
在Makefile文件的结尾添加
obj-$(CONFIG_USER_GPIO) += user_gpio.o

(3)修改/root/100ask_imx6ull-qemu/linux-4.9.88/drivers/char目录下的Kconfig文件
添加如下内容
config USER_GPIO
tristate "Support users to use GPIO"
default y
help
Users can set up or get GPIO by character device
(4)修改设备树文件,本项目使用到的设备树100ask_imx6ull_qemu.dtb和其中引用到的imx6ull.dtsi
在100ask_imx6ull_qemu.dtb中添加如下代码
user_gpio {
compatible = "user_gpio";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio>;
input {
trigger {
label = "Trigger Button";
gpios = <&gpio1 0 GPIO_ACTIVE_LOW>;
wakeup-source;
linux,code = <1>;
};
in1 {
label = "in 1";
gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
wakeup-source;
linux,code = <2>;
};
in2 {
label = "in 2";
gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
wakeup-source;
linux,code = <3>;
};
};
output {
5v {
label = "5v";
gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
};
24v {
label = "24v";
gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
};
output1 {
label = "output1";
gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;
};
output2 {
label = "output2";
gpios = <&gpio1 8 GPIO_ACTIVE_LOW>;
};
output3 {
label = "output3";
gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
};
output4 {
label = "output4";
gpios = <&gpio5 10 GPIO_ACTIVE_LOW>;
};
};
};
pinctrl_gpio: gpios_grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 0x80000000
MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0x80000000
MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0x80000000
MX6UL_PAD_GPIO1_IO05__GPIO1_IO05 0x80000000
MX6UL_PAD_GPIO1_IO06__GPIO1_IO06 0x80000000
MX6UL_PAD_GPIO1_IO07__GPIO1_IO07 0x80000000
MX6UL_PAD_GPIO1_IO08__GPIO1_IO08 0x80000000
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x80000000
MX6UL_PAD_BOOT_MODE0__GPIO5_IO10 0x80000000
>;
};
关于gpio口管脚的说明,由于没有有效的硬件原理图,所有的gpio是在头文件/root/100ask_imx6ull-qemu/linux-4.9.88/arch/arm/boot/dts/imx6ul-pinfunc.h中选取没有用到的gpio口和引脚
根据排除status = "disabled"找出其余的所有已经占用的gpio口(status = "okay"和没有赋值的默认的,都是已经占用的gpio)
(5)将user_gpio.c编译到模块user_gpio.ko修改/root/100ask_imx6ull-qemu/linux-4.9.88目录下的.config文件
CONFIG_USER_GPIO=m
(6)编译
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make zImage //编译zImage内核镜像
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make 100ask_imx6ull_qemu.dtb //编译设备树
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make modules //编译模块
查看生成的模块的目录,内核和设备树的目录如上
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# find -name user_gpio.ko
./drivers/char/user_gpio.ko
(7)将新编译出来的新内核和设备树拷贝到模拟开发板的镜像目录/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image下
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# cp ./arch/arm/boot/zImage /home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# cp ./arch/arm/boot/dts/100ask_imx6ull_qemu.dtb /home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image
五.模拟开发板加载新内核和设备树
(1)搭建ubuntu的nfs环境
ubuntu主机启动nfs
sudo apt-get install nfs-kernel-server
修改/etc/exports,添加类似以下的内容—允许开发板通过NFS访问Ubuntu的/home/mf/pemu_fv100目录
/home/mf/pemu_fv100 *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
ubuntu主机 重启nfs
sudo /etc/init.d/nfs-kernel-server restart
ubuntu主机 测试nfs
可以在Ubuntu上通过NFS挂载自己,验证一下NFS可用:
在/home/mf/pemu_fv100目录下新建一个test.c文件在 /mnt下可以看到,挂在成功
sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/home/mf/pemu_fv100 /mnt
ls /mnt
(2)模拟开发板配置网络
QEMU运行时,Ubuntu是Host即宿主机,QEMU给它分配的IP是10.0.2.2。
QEMU模拟的imx6ull板子是Guest即客户机,它会自动获取IP,也可以自己设置。
Guest可以通过10.0.2.2访问Host,Host不能访问Guest。
Guest中可以使用ifconfig命令查看IP,如果没有IP,可以如下设置:
[root@qemu_imx6ul:~]#ifconfig eth0 10.0.2.15
[root@qemu_imx6ul:~]#mount -t nfs -o nolock,vers=3 10.0.2.2:/home/mf/pemu_fv100 /mnt
如果一切正常,在开发板上就可以通过/mnt目录访问Ubuntu的/home/mf/pemu_fv100目录了
(3)将测试脚本可执行文件user_gpio_test放在ubuntu的/home/mf/pemu_fv100目录下,在模拟开发板的/mnt目录下就可以访问啦
六.模拟开发板加载新的文件系统
因为我们将新添加的驱动编译成了user_gpio.ko模块,我们现在需要将这个文件添加到模拟开发板的镜像目录下/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image的rootfs.img这个根文件系统中
(1)挂在rootfs.img到设备的/mnt目录下,ubuntu下执行下面的命令:
root@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image#sudo mount -o loop rootfs.img /mnt
root@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image# cd /mnt
root@ubuntu:/mnt# ls
bin dev fat lib linuxrc mnt proc run sbin tmp var
boot etc home lib32 media opt root samba sys usr
这时候可以在模拟开发板的/mnt目录下操作根文件系统

(2)将新编译出来的驱动模块user_gpio.ko拷贝到/mnt下面去
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# cp ./drivers/char/user_gpio.ko /mnt/mnt
操作完毕一定要取消挂载,不然启动内核会因为根文件系统挂死
root@ubuntu:/# sudo umount /mnt
(3)进入模拟开发板的/mnt目录加载新驱动
[root@qemu_imx6ul:/mnt]# ls
user_gpio.ko
[root@qemu_imx6ul:/mnt]# insmod user_gpio.ko
[root@qemu_imx6ul:/mnt]#lsmod //查看加载情况
一切正常

七.测试新驱动模块–user_gpio.ko
(1)测试脚本编译
root@ubuntu:/home/mf/pemu_fv100#arm-linux-gnueabihf-gcc user_gpio_test.c -o user_gpio_test
(2)在模拟开发板的/mnt目录下执行user_gpio_test
[root@qemu_imx6ul:/mnt]#./user_gpio_test
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit