【无标题】

一,源代码

线程的创建与中止

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

 2.线程的连接与分离

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

3.线程互斥量/互斥锁watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

 4.线程条件变量

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

5.进程获取测试环境变量代码

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

 6.创建进程程序代码watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

 二,运行

线程的创建与中止

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

 注意:因为线程的竞争每次输出结果的次序都不一样 

 2.线程的连接与分离

#include <pthread.h>

    int pthread_join(pthread_t thread, void **retval);

新创建的线程和进程一样,也要被连接以监听其退出状态,否则也会变成僵尸线程。背后原因与进程一样,其退出之后,内核会为它保留退出状态数据,直到有人取走为止。 输入图片说明watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

3.线程互斥量/互斥锁

** 互斥:指在某一时刻指允许一个进程运行其中的程序片,具有排他性和唯一性。对于线程A和线程B来讲,在同一时刻,只允许一个线程对临界资源进行操作,即当A进入临界区对资源操作时,B就必须等待;当A执行完,退出临界区后,B才能对临界资源进行操作。 临界资源:能够被多个线程共享的数据/资源。 临界区:对临界资源进行操作的那一段代码 **watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

 4.线程条件变量

条件变量是线程的另外一种同步机制,这些同步对象为线程提供了会合的场所,理解起来就是两个(或者多个)线程需要碰头(或者说进行交互-一个线程给另外的一个或者多个线程发送消息),我们指定在条件变量这个地方发生,一个线程用于修改这个变量使其满足其它线程继续往下执行的条件,其它线程则接收条件已经发生改变的信号。 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_19,color_FFFFFF,t_70,g_se,x_16

 5.进程获取测试环境变量代码

通过main()函数的第三个参数env循环获取 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

6.创建进程程序代码

fork()函数从运行着的进程中分裂出一个子进程,它通过拷贝父进程的方式创建子进程。子进程与父进程有相同的代码空间、文件描述符等资源。 用法:#include <sys/types.h>

#include <unistd.h>

    pid_t fork(void);

进程创建后,子进程与父进程开始并发执行,执行顺序由内核调度算法来决定。fork()函数如果成功创建了进程,就会对父子进程各返回一次,其中对父进程返回子进程的PID,对子进程返回0;失败则返回小于0的错误码。

编译执行

gcc -o fork.out fork.c

./fork.out

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYml1Yml1OTgx,size_20,color_FFFFFF,t_70,g_se,x_16

 7.QEMU的下载

参考文档:https://www.csdn.net/tags/OtTaYgwsODIwOTAtYmxvZwO0O0OO0O0O.html 下载成功后,进入ubuntu-18.04_imx6ul_qemu_system目录,执行install_sdl.sh,如下所示: 在Ubuntu 18.04系统中,执行如下命令,可以得到一个目录ubuntu-18.04_imx6ul_qemu_system:$ git clone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git

(1).安装SDL

下载成功后,进入ubuntu-18.04_imx6ul_qemu_system目录,执行install_sdl.sh如下所示:

 

$ ls

imx6ull-system-image qemu-imx6ull-gui_test.sh source

install_sdl.sh qemu-imx6ull-nogui.sh ubuntu-18.04_sdl-package

qemu README.md

qemu-imx6ull-gui.sh rootfs_test

(2).运行

在Ubunut的桌面环境下启动终端,执行./qemu-imx6ull-gui.sh

$ ls

imx6ull-system-image qemu-imx6ull-gui_test.sh source

install_sdl.sh qemu-imx6ull-nogui.sh ubuntu-18.04_sdl-package

qemu README.md

qemu-imx6ull-gui.sh rootfs_test

$ ./qemu-imx6ull-gui.sh

1.BUG

x6ull-gui.sh 

qemu-system-arm: warning: nic imx.enet.0 has no peer

qemu-system-arm: warning: nic imx.enet.1 has no peer

libGL error: MESA-LOADER: failed to open vmwgfx (search paths /usr/lib/x86_64-linux-gnu/dri:\$$&#123;ORIGIN&#125;/dri:/usr/lib/dri)

libGL error: failed to load driver: vmwgfx

libGL error: MESA-LOADER: failed to open vmwgfx (search paths /usr/lib/x86_64-linux-gnu/dri:\$$&#123;ORIGIN&#125;/dri:/usr/lib/dri)

libGL error: failed to load driver: vmwgfx

libGL error: MESA-LOADER: failed to open swrast (search paths /usr/lib/x86_64-linux-gnu/dri:\$$&#123;ORIGIN&#125;/dri:/usr/lib/dri)

libGL error: failed to load driver: swrast

X Error of failed request: GLXBadContext

  Major opcode of failed request: 153 (GLX)

  Minor opcode of failed request: 6 (X_GLXIsDirect)

  Serial number of failed request: 114

  Current serial number in output stream: 113

2.解决方案 以sudo apt --fix-broken install安装驱动

3.重新执行即可解决问题

8.下载编译内核

参考:http://wiki.100ask.org/Qemu

## 安装 lzop 工具,下载源码
// 先强制安装一遍依赖
$ sudo apt-get install lzop         //安装软件           
// 下载源码
$ git clone https://e.coding.net/codebug8/repo.git
$ mkdir -p 100ask_imx6ull-qemu && cd 100ask_imx6ull-qemu
$ ../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
$ cd 100ask_imx6ull-qemu/
$ ls 
buildroot2019.02  linux-4.9.88  qemu  ToolChain

9.设置工具链

命令如下

$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin

10.配置、编译内核

安装交叉编译器

$ sudo apt install gcc-arm-linux-gnueabihf        // 安装编译器。

执行如下命令

$ cd linux-4.9.88
$ make mrproper
$ make 100ask_imx6ull_qemu_defconfig
$ make zImage     //这一步需要等待一段时间(10mins)

把编译出来的zImage复制到QEMU目录ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image

11.替换LCD驱动程序

把lcd_drv.c放到内核目录linux-4.9.88/drivers/video/fbdev,修改linux-4.9.88/drivers/video/fbdev/Makefile为obj-y += lcd_drv.o。接下来,即可重新执行make zImage编译内核,内核里就含有新的驱动程序了

12.测试

使用新内核启动QEMU后,执行fb-test及可测试

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值