嵌入式多线程应用程序设计实验
实验四 嵌入式多任务编程

实验四嵌入式多任务编程【实验目的】掌握多进程程序.....的编写方法掌握守护进程程序......的编写方法【实验学时】建议2学时【实验内容】编写多进程程序,掌握fork(), exec(), wait() 和waitpid()函数的使用编写守护进程程序,掌握守护进程的创建步骤。
【实验原理】见书第三章【实验要求】调试验证程序,并提交实验报告。
【实验步骤】一、编写多进程程序,创建进程并执行进程程序。
(1)打开目录3-2-1-fork,将其中的两个c文件编译运行。
观察运行结果,指出父进程和子进程的调用顺序。
将程序交叉编译后下载至开发板中,运行并观察结果。
(2)打开目录:3-2-1-process_execlp,3-2-2-process_execl,3-2-3-process_execle,3-2-4-process_execve编译并运行目录中的程序,观察运行结果,验证exec函数族中不同函数的异同。
将程序交叉编译后下载至开发板中,运行并观察结果。
(3)打开目录3-2-5-process_exit,编译并运行目录中的程序,观察运行结果,观察函数exit()和_exit()的异同。
将程序交叉编译后下载至开发板中,运行并观察结果。
(4)打开目录3-2-6-process_wait,编译并运行目录中的程序,观察运行结果。
将程序交叉编译后下载至开发板中,运行并观察结果。
(5)打开目录3-3-1-process,按书中3.3.1小节实验要求完成实验,并将程序交叉编译后下载至开发板中,运行并观察结果。
(6)打开目录3-3-3,编译并运行其中的.c程序,体会waitpid函数作为进程终止函数时的编写方法。
如果参数status不是空指针,则在wait函数中会对此参数赋值,子进程的终止信息,如果只是为了同步而不关心子进程的终止信息,可以将status参数指定为NULL。
二、了解守护进程的编写和执行。
(1)打开目录3-2-7-process_daemon,编译并运行目录中的程序,观察运行结果。
嵌入式多线程实验报告

多线程实验日志
实验题目:多线程
实验目的:
⏹了解多线程程序设计的基本原理。
⏹学习pthread库函数的使用。
实验步骤及结果:
1、阅读源代及编译应用程序
进入/root/share/exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码。
运行make产生pthread可执行文件。
2、下载和调试
切换到minicom终端窗口,先像实验一一样,把串口、网线、电源线接好,配置好实验箱的IP地址,然后使用NFS mount宿主机(虚拟linux)的/root/share 到目标板(实验箱)/host 目录。
具体命令见图片中的命令,注意IP地址根据自己的情况进行相应的修改:
图2.4配置实验箱IP地址并mount 宿主机linux的/root/share到目标板(实验箱)/host目录
⏹进入/host/exp/basic/pthread目录,运行pthread,观察运行结果的正确性。
运行
程序最后一部分结果如下:
⏹
图2.5进入/host/exp/basic/pthread目录运行pthread
⏹
图2.6运行结果画面。
嵌入式技术实验及设计

实验三 uC/OS-II进程的同步和通信
n 二 、实验内容及要求
n 编程实现哲学家就餐问题。问题的描述: 有5个哲学家,其生活方式 是交替的进行思考和吃进餐。他们共用一张圆桌,分别坐在周围的5 张椅子上,在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考, 饥饿时便试图取其左、右靠近他的筷子,只有在他拿到两支筷子时才 能进餐。进餐毕,放下筷子继续思考
n 要求:
n (1)键盘上的1-5数字键分别代表5个哲学家申请吃饭
n (2)要求大家列出所有可能出现的状况,而且屏幕上必须将最新的状态
显示出来,如:
n
(1)哲学家X正在进餐 (2)哲学家X申请进餐未果
n
(3)哲学家X正在思考……..
n
注:申请进餐未果维持显示5s后改为显示正在思考
n (3)每位哲学家的进餐时间为1分钟,进餐次数不做限定
n 要求: n (1)资源必须被互斥使用 n (2)程序的运行结果必须跟优先级反转的理论分析结果一致 n (3)出现反转效果后,修改程序,避免出现优先级反转,并
给出理论和实验结果的对比分析。
实验三 uC/OS-II进程的同步和通信
n 一、实验目的 n 掌握uC/OS-II的进程的同步和通信的机制和方法。
实验一 任务的创建与多任务设计
一、实验目的 1、理解任务管理的基本原理 2、掌握uC/OS-II中多任务设计和调度的基本方法
实验一 任务的创建与多任务设计
二 、实验内容及要求 1、编写一个有3个任务的应用程序,每个任务均会在显示器上显 示一个字符,并让3个任务具有不同的等待时间,观察应用程序运 行中任务被调度的情况。 2、编写一个有2个任务的应用程序,每个任务均会在显示器上显 示一个字符,当调度器进行5次调度之后,这些显示的字符会在显 示器上构成一个字符串“Hello World”。 3、设计Task1, Task2两个任务,Task1不断地挂起自己,再被任 务Task2解挂,解挂时,输出Task1被Task2解挂的信息,两个任务 不断地切换执行。观察两个任务的调度情况,并给出解释和说明。
嵌入式多线程 实习总结(有感想)

解压应用程序以及多线程应用程序设计实习过程首先完成上次实习没有完成的解压应用程序的部分。
设置好宿主机和目标机的IP地址后,运行FTP软件。
将压缩包从右侧的宿主机本地目录“拖到”左侧的目标机目录中。
最后在超级终端上完成解压。
其次完成多线程的部分,运行虚拟机后,步骤如下:1、挂载NFS服务。
系统设置部分需要完成关闭防火墙,设置宿主机和目标机IP(需在一个网段内),配置NFS服务器。
之后:service nfs start。
启动。
挂载NFS时候出现了问题。
当设置宿主机IP为192.168.1.155之后,在虚拟机的LINUX终端里mount了192.168.1.155(也就是自己挂载自己),然后总感觉不对,鼓捣了半天,又在超级终端里ifconfig之后出现了三个IP地址,第一个是inet addr,第二个是broadcast,第三个是子网掩码,但是我当时没看懂第二个地址,于是又把宿主机的IP设置为了192.168.1.255。
老师一说才想起来计算机网络课上讲的,C类的网络地址,后8位若为全1,应该是广播地址才对。
反正这块乱了。
分析后,觉得主要原因还是因为对挂载的深层含义不懂,没明白其实是目标机想要宿主机里的东西,所以要从超级终端里挂载host下的目录。
最终完成挂载。
Mount –t nfs 192.168.0.2:/arm2410cl/ /mnt/nfs (老师说这里直接写/mnt不好,会覆盖掉mnt目录,如果以后要挂载其他的应用,就不好弄了。
)2、第一步成功后,在超级终端上cd arm2410cl/exp/basic/02_pthread。
成功进入,make语句后,用命令:./pthread成功运行。
3、在虚拟机的LINUX终端上,也进入了arm2410cl/exp/basic/01_hello,但是不能运行hello,用gcc hello.c –o hello之后,./hello就能运行了。
用这个方法,完成02_pthread,发现gcc提示几个相似错误,都跟main函数里的一个函数有关。
嵌入式程序设计实验报告

实验一开发环境的搭建与配置【实验目的】1)熟悉嵌入式Linux开发平台。
2)掌握嵌入式Linux开发平台的开发环境搭建与配置。
3)了解minicom配置串口通信参数的过程。
4)了解嵌入式Linux的启动过程。
5)掌握程序交叉编译运行及调试的一般方法。
【实验内容】1)连接实验开发板与宿主机。
2)在虚拟机中的CentOS(宿主机)搭建开发环境。
3)在宿主机中配置minicom。
4)分析嵌入式Linux的启动过程。
5)在宿主机上编写简单的C语言程序并用交叉编译工具进行编译,然后传输到目标机上运行。
6)在宿主机上编写简单的C语言程序并用交叉编译工具进行编译,用gdbserver进行远程调试。
【实验步骤】连接实验开发板,对虚拟机进行设置1)首先把实验开发板打开,用网线和串口线连接宿主机,并连接电源(注意这时不要拨动实验开发板的开关按钮)。
2)在桌面上点击打开vmware 软件,选择“编辑虚拟机设置”,如下图所示:图13)进入虚拟机配置界面后把网络连接方式设置为“桥接方式”,如图2所示:图24)添加串口,如下图所示:图35)完成串口的添加后,选择“OK”,完成对虚拟机的设置。
如下图所示:图46)选择虚拟机的“Edit”、“Virtual Network Editor...”,如下图所示:图57)进入虚拟机网络参数设置界面后对VMnet0进行设置(注意这里桥接的网卡应选择与实验开发板相连接的那块儿网卡),然后点击“Apply”、“OK”如下图所示:图68)上述设置完成后启动CentOS(CentOS的用户名为“root”,密码为“xidianembed”)。
工具链的配置1)在CentOS的根目录下创建一个名为“EELiod”的目录,把实验中要用到的文件(主要是一些rpm包)拷贝到该目录下。
(可以用U盘、WinSCP等工具进行,此处不再做详细说明)。
2)交叉编译工具链位于/opt/buildroot-2011.02/output/host/usr目录下,进入工具链的bin目录下,可以看到一些编译工具,这些工具将会在之后的交叉编译过程中使用到。
嵌入式实训课实验报告

一、实验背景嵌入式系统在现代工业、消费电子、智能家居等领域扮演着越来越重要的角色。
为了让学生深入了解嵌入式系统的设计原理和开发过程,提高学生的实践能力和创新精神,我们开设了嵌入式实训课程。
本次实验报告将针对实训课程中的部分实验进行总结和分析。
二、实验目的1. 掌握嵌入式系统的基本原理和开发流程。
2. 熟悉嵌入式开发工具和环境。
3. 熟练使用C语言进行嵌入式编程。
4. 学会调试和优化嵌入式程序。
三、实验内容本次实训课程共安排了五个实验,以下是每个实验的具体内容和实验步骤:实验一:使用NeoPixel库控制RGB LED灯带1. 实验目的:学习使用NeoPixel库控制RGB LED灯带,实现循环显示不同颜色。
2. 实验步骤:(1)搭建实验平台,连接NeoPixel LED灯带。
(2)编写程序,初始化NeoPixel库,设置LED灯带模式。
(3)通过循环,控制LED灯带显示不同的颜色。
实验二:使用tm1637库控制数码管显示器1. 实验目的:学习使用tm1637库控制数码管显示器,显示数字、十六进制数、温度值以及字符串,并实现字符串滚动显示和倒计时功能。
2. 实验步骤:(1)搭建实验平台,连接tm1637数码管显示器。
(2)编写程序,初始化tm1637库,设置显示模式。
(3)编写函数,实现数字、十六进制数、温度值的显示。
(4)编写函数,实现字符串滚动显示和倒计时功能。
实验三:使用ds18x20库和onewire库读取DS18B20温度传感器的数据1. 实验目的:学习使用ds18x20库和onewire库读取DS18B20温度传感器的数据,并输出温度值。
2. 实验步骤:(1)搭建实验平台,连接DS18B20温度传感器。
(2)编写程序,初始化ds18x20库和onewire库。
(3)编写函数,读取温度传感器的数据,并输出温度值。
实验四:使用ESP32开发板连接手机热点,并实现LED1作为连接指示灯1. 实验目的:学习使用ESP32开发板连接手机热点,并通过LED1指示灯显示连接状态。
实验四 嵌入式多任务编程

实验四嵌入式多任务编程【实验目的】掌握多进程程序.....的编写方法掌握守护进程程序......的编写方法【实验学时】建议2学时【实验内容】编写多进程程序,掌握fork(), exec(), wait() 和waitpid()函数的使用编写守护进程程序,掌握守护进程的创建步骤。
【实验原理】见书第三章【实验要求】调试验证程序,并提交实验报告。
【实验步骤】一、编写多进程程序,创建进程并执行进程程序。
(1)打开目录3-2-1-fork,将其中的两个c文件编译运行。
观察运行结果,指出父进程和子进程的调用顺序。
将程序交叉编译后下载至开发板中,运行并观察结果。
(2)打开目录:3-2-1-process_execlp,3-2-2-process_execl,3-2-3-process_execle,3-2-4-process_execve编译并运行目录中的程序,观察运行结果,验证exec函数族中不同函数的异同。
将程序交叉编译后下载至开发板中,运行并观察结果。
(3)打开目录3-2-5-process_exit,编译并运行目录中的程序,观察运行结果,观察函数exit()和_exit()的异同。
将程序交叉编译后下载至开发板中,运行并观察结果。
(4)打开目录3-2-6-process_wait,编译并运行目录中的程序,观察运行结果。
将程序交叉编译后下载至开发板中,运行并观察结果。
(5)打开目录3-3-1-process,按书中3.3.1小节实验要求完成实验,并将程序交叉编译后下载至开发板中,运行并观察结果。
(6)打开目录3-3-3,编译并运行其中的.c程序,体会waitpid函数作为进程终止函数时的编写方法。
如果参数status不是空指针,则在wait函数中会对此参数赋值,子进程的终止信息,如果只是为了同步而不关心子进程的终止信息,可以将status参数指定为NULL。
二、了解守护进程的编写和执行。
(1)打开目录3-2-7-process_daemon,编译并运行目录中的程序,观察运行结果。
北京科技大学嵌入式系统实验6---嵌入式Linux 多线程编程实验

北京科技大学实验报告学院:自动化学院专业:班级:姓名:学号:实验日期:2018年5月7日实验名称:实验六嵌入式Linux多线程编程实验实验目的:1.掌握线程的运行机制、创建方法及特点。
2.掌握线程退出、线程等待、线程清除等函数的使用方法。
3.学会线程的数据处理方法。
实验仪器:linux操作系统64位实验内容与步骤:编写程序,完成如下五个功能,要求写出编程思路、实验步骤,显示程序运行结果,并进行必要的分析。
1)有一个int型全局变量g_Flag初始值为0;2)在主线程中起动线程1,打印“this is thread1”,并将g_Flag设置为1;3)在主线程中启动线程2,打印“this is thread2”,并将g_Flag设置为2;4)线程1需要在线程2退出后才能退出;5)主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出。
实验数据:编程思路:本实验我是主要是用到进程与线程相关的概念,有关线程操作的函数,线程之间的互斥以及线程之间的同步这些内容,在编写程序代码时,首先定义一个int型全局标志g_Flag,设置其初始值大小为0,初始化进程锁pthread_mutex_t mutex,然后初始化条件变量pthread_cond_t cond,声明两个线程函数,分别为thread1和thread2,定义两个线程id分别为tid1和tid2,创建线程,如果线程创建成功的话就返回0,否则的话就返回一个正数,如果rc2不等于0的话,说明创建错误,在线程1程序入口,启动进程thread1,输出enter thread,执行进程1打印出this is thread1,g_Flag的值也同时输出,输出结果为1,得到当前线程id,接下来如启动进程互斥锁,如果g_Flag的值为2则说明线程thread2已经执行了,这时候进程2打印出this is thread2,g_Flag的值为2,首先退出进程2,然后再退出进程1,通过调用pthread_exit()函数实现进程的退出,当g_Flag的值发生变化,当其从1变为2或者从2变为1时,主线程能够检测到g_Flag发生的变化,调用pthread_exit()函数退出主线程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五、实验原理及代码分析
1.多线程程序的优缺点
多线程程序作为一种多任务、并发的工作方式,有以下的优点: 1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系 统 都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术, 将 耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。 2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行 于 不同的CPU上。 3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立 的运行部分,这样的程序会利于理解和修改。 LIBC中的pthread库提供了大量的API函数,为用户编写应用程序提供支持。
¾ 测试两个线程号是否相同:
int pthread_equal (pthread_t
¾ 线程退出:
thread1, pthread_t
thread2)
void pthread_exit (void * retval)
¾ 等待指定的线程结束:
int pthread_join (pthread_t
struct prodcons { int buffer[BUFFER_SIZE]; pthread_mutex_t lock; int readpos, writepos;
/* 缓冲区数组 */ /* 互斥锁 */ /* 读写的位置*/
pthread_cond_t notempty; pthread_cond_t notfull;
while (1) {
d = get(&buffer);
if (d == OVER ) break;
printf("
%d-->get\n", d);
} printf("consumer stopped!\n"); return NULL; } /*--------------------------------------------------------*/ int main(void) {
pthread_mutex_unlock(&b->lock); return data; } /*--------------------------------------------------------*/ #define OVER (-1) struct prodcons buffer; /*--------------------------------------------------------*/ void * producer(void * data) { int n;
2.实验源代码与结构流程图 本实验为著名的生产者-消费者问题模型的实现,
主程序中分别启动生产者线程和消费者 线程。生产者线程不断顺序地将0到1000的数字写入 共享的循环缓冲区,同时消费者线程 不断地从共享的循环缓冲区读取数据。流程图如图 2.2.1所示:
图2.2.1 生产者-消费者实验源代码结构流程图
三、预备知识
¾ 有C 语言基础 ¾ 掌握在Linux 下常用编辑器的使用 ¾ 掌握Makefile 的编写和使用 ¾ 掌握Linux 下的程序编译与交叉编译过程
四、实验设备及工具
硬件:UP-TECH S2410/P270 DVP嵌入式实验平台,PC机Pentium 500以上, 硬盘40G以上, 内存 大于128M。 软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX开发环境
s 图2.2.2 生产消费流程图
¾ 生产者写入共享的循环缓冲区函数PUT
void put(struct prodcons * b, int data)
{ pthread_mutex_lock(&b->lock);
//获取互斥锁
while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { //如果读写位置相同
¾ 线程创建函数:
int pthread_create (pthread_t * thread_id, const pthread_attr_t * attr, void *(* start_routine) (void *),void * restrict arg)
¾ 获得父进程ID:
pthread_t pthread_self (void)
pthread_cond_signal(&b->notempty);
//设置状态变量
pthread_mutex_unlock(&b->lock);
//释放互斥锁
}
¾ 消费者读取共享的循环缓冲区函数GET
int get(struct prodcons * b) {
int data; pthread_mutex_lock(&b->lock);
2.2 多线程应用程序设计
一、实验目的
¾ 了解多线程程序设计的基本原理。 ¾ 学习pthread 库函数的使用。
二、实验内容
读懂pthread.c的源代码,熟悉几个重要的PTHREAD库函数的使用。掌握共享锁和信号量 的 使用方法。 进入/arm2410cl/exp/basic/02_pthread目录,运行make 产生pthread程序,使用NFS 方 式连接开发主机进行运行实验。
pthread_cond_wait(&b->notfull, &b->lock);
//等待状态变量b->notfull,不满则跳出阻塞
}
b->buffer[b->writepos] = data;
//写入数据
b->writepos++;
if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
/*等待缓冲区非满*/ while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { printf("wait for not full\n"); pthread_cond_wait(&b->notfull, &b->lock); } /*写数据并且指针前移*/ b->buffer[b->writepos] = data; b->writepos++; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; /*设置缓冲区非空信号*/ pthread_cond_signal(&b->notempty);
}
4.主要的多线程API 在本程序的代码中大量的使用了线程函数,如
pthread_cond_signal、 pthread_mutex_init、pthread_mutex_lock等等,这些函数的作用是 什么,在哪里定义的, 我们将在下面的内容中为大家做一个简单的介绍,并且为其中比较重 要的函数做一些详细 的说明。
* 2003-12-22
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "pthread.h"
#define BUFFER_SIZE 16 /* 设置一个整数的圆形缓冲区 */
while (b->writepos == b->readpos) {
//获取互斥锁 //如果读写位置相同
pthread_cond_wait(&b->notempty, &b->lock); //等待状态变量b->notempty,不空则跳出阻塞。否则无数据可读。
} data = b->buffer[b->readpos];
本实验具体代码如下:
/************************************************
* The classic producer-consumer example.
* Illustrates mutexes and conditions.
* by Zou jian guo <ah_zou@>
//读取数据
b->readpos++;
if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
pthread_cond_signal(&b->notfull);
//设置状态变量
pthread_mutex_unlock(&b->lock);
//释放互斥锁
return data;
/* 等待缓冲区非空*/ while (b->writepos == b->readpos) { printf("wait for not empty\n"); pthread_cond_wait(&b->notempty, &b->lock); } /* 读数据并且指针前移 */ data = b->buffer[b->readpos]; b->readpos++; if (b->readpos >= BUFFER_SIZE) b->readpos = 0; /* 设置缓冲区非满信号*/ pthread_cond_signal(&b->notfull);