嵌入式多线程应用程序设计实验
实验四 嵌入式多任务编程
实验四嵌入式多任务编程【实验目的】掌握多进程程序.....的编写方法掌握守护进程程序......的编写方法【实验学时】建议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()函数退出主线程。
嵌入式实验设计实训报告
一、实验背景随着信息技术的飞速发展,嵌入式系统在各个领域得到了广泛的应用。
为了让学生更好地掌握嵌入式系统设计的相关知识,提高学生的动手能力和实际操作能力,我们开展了嵌入式实验设计实训。
本次实训以ARM处理器为平台,通过实际操作,让学生了解嵌入式系统的基本原理和设计方法。
二、实验目的1. 熟悉ARM处理器的基本架构和编程环境。
2. 掌握嵌入式系统设计的基本流程和方法。
3. 培养学生的动手能力和实际操作能力。
4. 提高学生对嵌入式系统的认知和应用能力。
三、实验内容1. 实验环境(1)硬件平台:ARM处理器开发板(2)软件平台:Keil uVision5、GNU ARM Embedded Toolchain2. 实验步骤(1)搭建实验环境首先,将开发板连接到计算机,并安装Keil uVision5和GNU ARM Embedded Toolchain软件。
接着,配置开发板,使其能够正常运行。
(2)编写程序根据实验要求,编写嵌入式系统程序。
程序主要包括以下几个方面:1)初始化:设置时钟、GPIO、中断等。
2)主循环:实现程序的主要功能。
3)中断处理:处理外部中断。
4)延时函数:实现延时功能。
(3)编译程序将编写好的程序编译成可执行文件。
(4)下载程序将编译好的程序下载到开发板上。
(5)调试程序在开发板上运行程序,通过串口调试软件观察程序运行情况,并对程序进行调试。
(6)实验报告根据实验内容,撰写实验报告。
3. 实验项目(1)点亮LED灯通过控制GPIO端口,实现LED灯的点亮和熄灭。
(2)按键控制LED灯通过检测按键状态,控制LED灯的点亮和熄灭。
(3)定时器实现定时功能使用定时器实现定时功能,例如定时关闭LED灯。
(4)串口通信实现串口通信,发送和接收数据。
四、实验结果与分析1. 点亮LED灯实验成功实现了通过控制GPIO端口点亮LED灯的功能。
2. 按键控制LED灯实验成功实现了通过检测按键状态控制LED灯的功能。
实验二 多线程应用程序设计
成绩信息与通信工程学院实验报告课程名称:嵌入式系统原理与应用实验题目:多线程应用程序设计指导教师:班级:学号:学生:一、实验目的和任务1.掌握VI编译环境。
2.掌握GCC编译命令。
3.掌握多个文件共同编译方法。
4.掌握GDB调试命令。
5.了解多线程程序设计的基本原理。
6.学习pthread 库函数的使用。
二、实验设备7.硬件:PC机8.软件:LINUX操作系统、虚拟机三、实验容及原理1.在VI编辑器里编写两个文件(其中一个为主程序,实现显示“hello,linux world,Iam 1405014XXX XXX”,,一个为子程序,实现1~n的乘法),为其书写头文件,共同编译为可执行文件,执行,观察运行结果。
学习书写MAKEFILE文件,编译,执行,观察结果。
利用GCC 编译(加参数-g)为可执行文件,利用GDB调试,学习GDB 调试命令。
2.编写多线程程序设计。
编译并运行,观察结果。
(可参照课件或实验指导书)四、实验步骤或程序流程1.Gcc编译实验1)编写实验代码:图3.1实验主程序图3.2实验子程序2)编写Makefile文件:图3.3 Makefile文件3)Make执行Makefile文件,生成可执行程序并运行:图3.4 执行4)Gdb调试运行:图3.5 gdb调试显示代码图3.6 gdb调试断点运行图3.7 gdb调试逐步运行2.多线程程序设计:1)对实验代码进行gcc编译:图3.7gcc编译生成可执行文件2)运行结果:图3.8程序运行结果五、实验数据及程序代码1.Gcc编译实验:1)主程序:#include "stdio.h"#include "my2.h"int main(){printf("hello.Linux world.I am 1405014232 zzm\n");my2();}2)实验子程序:#include "my2.h"#include "stdio.h"void my2(){int i=1;float s=1int N;printf("Please input n:\n");scanf("%d",&N);for(i,i<=n,i++)s*=i;printf("result:");printf("%f",s);}3).h头文件:#ifndef _MY2_H#define _MY2_Hint main();void my2();#endif4)makefile执行文件:zzmgo: my2.o my1.ogcc -o zzmgo my2.o my1.o my1.o: my1.c my2.hgcc -c my1.cmy2.o:my2.c my2.hgcc -c my2.cclean:rm -rf my1.o my2.o zzmgo1.多线程程序设计:#include <stdio.h>#include <stdlib.h>#include <time.h>#include "pthread.h"#define BUFFER_SIZE 16/* Circular buffer of integers. */struct prodcons {int buffer[BUFFER_SIZE];/* the actual data */pthread_mutex_t lock;/* mutex ensuring exclusive access to buffer */int readpos, writepos;/* positions for reading and writing */pthread_cond_t notempty;/* signaled when buffer is not empty */pthread_cond_t notfull;/* signaled when buffer is not full */};/*--------------------------------------------------------*//* Initialize a buffer */void init(struct prodcons * b){pthread_mutex_init(&b->lock, NULL);pthread_cond_init(&b->notempty, NULL);pthread_cond_init(&b->notfull, NULL);b->readpos = 0;b->writepos = 0;}/*--------------------------------------------------------*//* Store an integer in the buffer */void put(struct prodcons * b, int data){pthread_mutex_lock(&b->lock);/* Wait until buffer is not full */while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {printf("wait for not full\n");pthread_cond_wait(&b->notfull,&b->lock);}/* Write the data and advance write pointer */b->buffer[b->writepos] = data;b->writepos++;if (b->writepos >= BUFFER_SIZE) b->writepos = 0;/* Signal that the buffer is now not empty */pthread_cond_signal(&b->notempty);pthread_mutex_unlock(&b->lock);}/*--------------------------------------------------------*//* Read and remove an integer fromthe buffer */int get(struct prodcons * b){int data;pthread_mutex_lock(&b->lock);/* Wait until buffer is not empty */while (b->writepos == b->readpos) {printf("wait for not empty\n");pthread_cond_wait(&b->notempty,&b->lock);}/* Read the data and advance read pointer */data = b->buffer[b->readpos];b->readpos++;if (b->readpos >= BUFFER_SIZE) b->readpos = 0;/* Signal that the buffer is now not full */pthread_cond_signal(&b->notfull);pthread_mutex_unlock(&b->lock);return data;}/*--------------------------------------------------------*/#define OVER (-1)struct prodcons buffer;/*--------------------------------------------------------*/void * producer(void * data){int n;for (n = 0; n < 1000; n++) {printf(" put-->%d\n", n);put(&buffer, n);}put(&buffer, OVER);printf("producer stopped!\n");return NULL;}/*--------------------------------------------------------*/void * consumer(void * data){int d;while (1) {d = get(&buffer);if (d == OVER ) break;printf(" %d-->get\n", d);}printf("consumer stopped!\n");return NULL;}/*--------------------------------------------------------*/int main(void){pthread_t th_a, th_b;void * retval;init(&buffer);pthread_create(&th_a, NULL, producer, 0);pthread_create(&th_b, NULL, consumer, 0);/* Wait until producer and consumer finish.*/pthread_join(th_a, &retval);pthread_join(th_b, &retval);return 0;}六、实验数据分析及处理1.实验结构流程图:本实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。
嵌入式Linux多线程编程实验
实验二、嵌入式Linux多线程编程实验一、实验目的1. 熟悉线程的定义、创建及应用方法,掌握编译源代码时引入线程库的方法。
2. 掌握如何利用信号量完成线程间的同步与互斥。
3. 熟悉Makefile工作原理,掌握编写Makefile的编写方法。
二、实验基本要求1. 掌握熟悉线程的定义及操作方法。
2. 利用信号量的PV操作完成完成以下单个生产者和单个消费者模型的代码。
3. 编写在Ubuntu中编译执行的makefile文件,然后在Ubuntu中执行。
4. 编写在实验箱中编译执行的makefile文件,然后在实验箱中执行。
注意Makefile编写规范缩进应使用制表键即Tab键。
三、实验原理1.Linux线程的定义线程(thread)是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。
在两个普通进程(非线程)间进行切换时,内核准备从一个进程的上下文切换到另一个进程的上下文要花费很大的开销。
这里上下文切换的主要任务是保存老进程CPU状态并加载新进程的保存状态,用新进程的内存映像替换进程的内存映像。
线程允许你的进程在几个正在运行的任务之间进行切换,而不必执行前面提到的完整的上下文。
另外本文介绍的线程是针对POSIX线程,也就是pthread。
也因为Linux对它的支持最好。
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。
也可以将线程和轻量级进程(LWP)视为等同的,但其实在不同的系统/实现中有不同的解释,LWP更恰当的解释为一个虚拟CPU或内核的线程。
它可以帮助用户态线程实现一些特殊的功能。
Pthread是一种标准化模型,它用来把一个程序分成一组能够同时执行的任务。
2. 什么场合会使用Pthread即线程(1) 在返回前阻塞的I/O任务能够使用一个线程处理I/O,同时继续执行其他处理任务。
北邮嵌入式系统设计实验-实验报告
北邮嵌入式系统设计实验-实验报告嵌入式试验报告学院:xxx班级:xxx学号:xxx姓名:xxx成员:xxx一、基础学问部分1.多线程试验本章主要讲解线程的概念和线程间的同步方式。
试验一主要介绍线程的概念和线程的创建,试验二、试验三、试验四分离介绍了信号量、互斥锁、条件变量的作用和使用。
1.1 线程的介绍线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
线程是程序中一个单一的挨次控制流程。
进程内一个相对自立的、可调度的执行单元,是系统自立调度和分派CPU 的基本单位指运行中的程序的调度单位。
在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程是允许应用程序并发执行多个任务的一种机制,是程序运行后的任务处理单元,也是SylixOS操作系统任务调度的最小单元。
在多核CPU中,同时可以有多个线程在执行,实现真正意义上的并行处理。
线程入口函数是一个能够完成特定任务的函数,因此线程入口函数的编写上与一般函数没有太多区分。
线程的创建函数如下:●创建线程失败,函数返回非0的错误代码,胜利返回0;●*thread pthread_t类型的缓冲区,保存一个线程的线程ID;●*attr 设置线程属性,设置为NULL标识创建的新线程使用默认属性;●*(*start_routine) 线程入口函数函数名●*arg 向所创建线程传入的参数1.2 信号量的概念信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。
在进入一个关键代码段之前,线程必需猎取一个信号量;一旦该关键代码段完成了,那么该线程必需释放信号量。
其它想进入该关键代码段的线程必需等待直到第一个线程释放信号量。
信号量是一个在进程和线程中都可以使用的同步机制。
信号量类似于一个通知,某个线程发出一个通知,等待此通知的线程收到通知后,会执行预先设置的工作。
嵌入式操作系统—多线程-实验报告(11-多线程编程)
程序实验二:11-多线程编程实验专业班级实验日期姓名学号实验一(p284:11-thread.c)1、软件功能描述创建3个线程,为了更好的描述线程之间的并行执行,让3个线程重用同一个执行函数。
每个线程都有5次循环,每次循环之间会随机等待1-10s的时间。
2、程序流程设计3.部分程序代码注释(关键函数或代码)res = pthread_create(&thread[no], NULL, thrd_func, (void*)no);创建线程res = pthread_join(thread[no], &thrd_ret);等待线程结束4.编译、运行方法及结果(抓屏)5.结果分析每个线程的运行和结束在宏观上是独立与并行的。
实验二(p287: 11-thread_mutex.c)1、软件功能描述增加线程互斥锁功能,实现原本独立与无序的多个线程能够按序执行。
2、程序流程设计3.部分程序代码注释(关键函数或代码)res = pthread_mutex_lock(&mutex);互斥锁上锁pthread_create(&thread[no], NULL, thrd_func, (void*)no);创建线程pthread_mutex_unlock(&mutex);互斥锁解锁4.编译、运行方法及结果(抓屏)5.结果分析通过增加互斥锁之后,在同一时刻只能有一个线程能够对共享资源进行操作。
其他线程想要上锁已经被上锁的互斥锁,则线程就会被挂起。
因此线程将按照创建的顺序执行。
实验三(P291:11-thread_sem.c)1、软件功能描述利用信号量同步机制实现3个线程之间的有序执行,只是执行顺序跟创建线程相反。
2、程序流程设计3.部分程序代码注释(关键函数或代码)sem_wait(&sem[thrd_num]);进行P操作res = pthread_create(&thread[no], NULL, thrd_func, (void*)no);创建新线程sem_post(&sem[THREAD_NUMBER - 1]);对最后创建的线程信号量进行V操作sem_destroy(&sem[no]);4.编译、运行方法及结果(抓屏)5.结果分析代码有问题,运行之后首先执行的是Thread 2然后就死锁了,我觉得线程解锁应该放在线程执行代码里面。
08-实验八Linux多线程应用程序设计实验
08-实验八Linux多线程应用程序设计实验
实验八Linux多线程应用程序设计实验.
一、实验目的
1. 了解Linux下多线程程序设计的基本原理;
2. 学习pthread 库函数的使用。
二、实验环境
预装Fedora10(内核版本2.4.x)的pc机一台,CVT-A8嵌入式实验箱一台(已构建嵌入式Linux系统),以太网线一根,交叉编译工具链。
三、实验内容
1. 编写thread 应用程序;
2. 编写Makefile 文件;
3. 下载并调试thread 应用程序。
四、实验要求
1、编写pthread程序源代码;
2、编写Makefile 文件;
3、用makefile编译thread 程序;
4、下载thread 程序到CVT-A8 中调试。
五、实验报告要求
1、每人一份实验报告;
2、实验报告中要求对每一步操作和出现的结果详细记录并解释;
3、你认为做好本实验应该注意哪些方面?
六、思考题
为什么要用多线程设计?。
实验2_Linux开发环境搭建及多线程应用程序设计
嵌入式系统设计实验二Linux开发环境搭建与多线程应用程序设计姓名:专业:嵌入式系统设计学号:日期:目录第一章Linux开发环境搭建 (3)1.1安装配置minicom (3)1.2安装arm-linux-gcc交叉编译器 (3)1.3安装配置nfs (5)第二章多线程应用程序设计 (8)2.1 多线程应用程序设计 (8)2.2交叉编译 (11)第一章Linux开发环境搭建1.1安装配置minicom安装minicom可分为两步:(1)更新apt-get命令为:apt-get update(2)下载安装minicom命令为:apt-get install minicom安装完成页面如下图所示:配置minicom的串口参数如下图所示:串口设备名改为ttyS0串口波特率为115200,8位数据位,1位停止位。
硬件控制流位关闭。
1.2安装arm-linux-gcc交叉编译器安装arm-linux-gcc。
在实验过程中,使用arm-linux-gcc 3.4.1版本的编译器。
安装可分为三步:(1)解压并安装解压并安装命令:tar –xjvf arm-linux-gcc-3.4.1.tar.bz2 –C /armtools(2)配置编译器路径在文件/etc/profile末尾添加export PATH=$PATH:/armtools/usr/local/arm/ 3.4.1/bin修改保存后输入命令:source /etc/profile 应用路径(3)查询是否安装成功可以输入arm-linux-gcc –v查询版本号如下图所示:1.3安装配置nfs安装配置nfs的目的是与开发板通过网线进行通信,并烧写程序。
安装配置可分为四步:(1)安装nfs服务下载安装nfs服务命令为:apt-get install nfs-kernel-server,成功后如下图所示:(2)配置网段在宿主机修改共享文件夹配置文件:(3)重启nfs服务重启命令为:/etc/init.d/portmap restart/etc/init.d/nfs-kernel-server restart(4)挂载设备第一步打开minicom,启动开发板,观察串口输出。
嵌入式系统技术实验报告
南京理工大学嵌入式系统技术实验报告作者: 学号:学院(系):班级:指导老师:孙瑜实验日期: 2014年11月实验一:熟悉Linux 开发环境一、实验目的熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。
使用Linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。
二、实验仪器硬件:UP-NETARM2410-S嵌入式实验平台、PC机。
软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境三、实验内容本次实验使用Redhat Linux 9.0操作系统环境,安装ARM-Linux的开发库及编译器。
创建一个新目录,并在其中编写hello文件。
学习在Linux下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。
下载已经编译好的文件到目标开发板上运行。
四、实验步骤1、建立工作目录[root@zxt smile]# mkdir hello[root@zxt smile]# cd hello2、编写程序源代码实际的hello.c源代码较简单,如下:#include <stdio.h>void main(void){printf(“hello world \n”);}用下面的命令来编写“hello.c”的源代码,进入hello目录使用vi命令来编辑代码:[root@zxt hello]# vi hello.c按“i”或者“a”进入编辑模式,录入上面的代码,完成后按Esc键进入命令状态,再用命令“:wq ”,保存并退出。
这样在当前目录下建立了一个名为“hello.c”的文件。
3、编译链接要使上面的“hello.c”程序能够运行,将其经过编译和连接,生成可执行文件。
输入 gcc hello.c -o hello 进行编译,再输入 ./hello 运行程序,观察结果1。
实验六 嵌入式Linux多线程编程
实验六嵌入式Linux多线程编程【实验目的】了解 Linux下多线程程序设计的基本原理学习 pthread 库函数的使用学习多线程间通讯的方法【实验学时】建议2学时【实验内容】♦读懂 pthread.c 的源代码,熟悉几个重要的 PTHREAD 库函数的使用,掌握互斥锁和条件变量在多线程间通讯的使用方法♦进入 5-6-thread 目录,运行 make 产生 pthread 程序,在ARM 设备端使用♦ NFS 方式连接宿主机端试验目录,运行实验测试。
【实验原理】见教材第五章【实验要求】调试验证程序,并提交实验报告。
【实验步骤】1、验证书中例子程序将目录5-1-thread、5-2-thread-sem、5-3-thread-mutex、5-4-thread-attr、5-5-thread中的程序编译并运行,观察运行结果2、编写pthread程序♦实验目录:5-6-thread♦编译源程序1)进入实验目录:[root@PCForARM 5-6-thread]# lsMakefile pthread pthread.c pthread.o2)清除中间代码,重新编译[root@PCForARM 5-6-thread]# make cleanrm -f ../bin/pthread ./pthread *.elf *.gdb *.o[root@PCForARM 5-6-thread]# makearm-linux-gcc -c -o pthread.o pthread.carm-linux-gcc -static -o ../bin/pthread pthread.o -lpthreadarm-linux-gcc -static -o pthread pthread.o -lpthread[root@PCForARM 5-6-thread]# lsMakefile pthread pthread.c pthread.o[root@PCForARM 5-6-thread]#当前目录下生成可执行程序 pthread。
嵌入式多线程应用程序设计实验
下面我们来看一下,生产者写入缓冲区和消费者从缓冲区读数的具体流程,生产者首先要 获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件 变 量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后 释 放互斥锁。消费者线程与生产者线程类似,这里就不再过多介绍了。流程图如下:
}
4.主要的多线程API 在本程序的代码中大量的使用了线程函数,如
pthread_cond_signal、 pthread_mutex_init、pthread_mutex_lock等等,这些函数的作用是 什么,在哪里定义的, 我们将在下面的内容中为大家做一个简单的介绍,并且为其中比较重 要的函数做一些详细 的说明。
/* 等待缓冲区非空*/ 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);
pthread_mutex_unlock(&b->lock); return data; } /*--------------------------------------------------------*/ #define OVER (-1) struct prodcons buffer; /*--------------------------------------------------------*/ void * producer(void * data) { int n;
嵌入式实验报告1
学生实验报告实验课程名称:嵌入式实验实验项目名称:多线程应用程序设计实验时间:2016 年12 月05 日班级:1404座号:姓名:电子信息工程学院编制2016年12月一、实验目的:¾ 了解多线程程序设计的基本原理。
¾ 学习pthread 库函数的使用。
二、所用实验仪器设备、耗材及数量硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台,PC 机Pentium 500 以上, 硬盘40G 以上,内存大于128M。
软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 发环境。
三、实验原理(实验电路图及原理说明)1.多线程程序的优缺点多线程程序作为一种多任务、并发的工作方式,有以下的优点:1) 提高应用程序响应。
这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
2) 使多CPU 系统更加有效。
操作系统会保证当线程数不大于CPU 数目时,不同的线程运行于不同的CPU 上。
3) 改善程序结构。
一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
LIBC 中的pthread 库提供了大量的API 函数,为用户编写应用程序提供支持。
2.实验源代码与结构流程图本实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。
生产者线程不断顺序地将0 到1000 的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。
四、实验步骤(详细说明实验的操作过程及注意事项)21、阅读源代及编译应用程序进入exp/basic/02_pthread目录,使用vi 编辑器或其他编辑器阅读理解源代码。
嵌入式应用程序设计课程设计
嵌入式应用程序设计课程设计项目描述嵌入式应用程序设计是计算机专业本科生必修的一门课程。
本次课程设计旨在让学生通过设计和实现一个嵌入式系统应用程序,掌握嵌入式系统的基本开发技能、了解嵌入式系统常见的开发环境和工具,培养学生的创新能力和解决实际问题的能力。
项目要求实验目标本项目要求学生设计并实现一个基于MCU的嵌入式系统应用程序。
具体要求如下:1.应用程序要有明确的功能需求,实现可行且实用的功能。
2.应用程序的开发环境和开发工具必须是开源或者免费的。
3.代码的编写和调试必须符合嵌入式系统开发的规范和要求。
4.实现的功能必须能够在实验室环境下成功运行并且可靠性高。
实验内容本次课程设计的实验内容如下:1.嵌入式系统应用程序设计和开发。
2.嵌入式系统硬件的选型和设计。
3.嵌入式系统软件的编写和调试。
4.嵌入式系统的仿真测试和实际测试。
5.实验报告的撰写和提交。
实验步骤本次课程设计的实验步骤如下:1.硬件设计。
选择合适的MCU开发板和相关外围硬件,并完成方案设计。
2.软件设计。
在选定的开发环境下编写程序,实现功能需求。
3.硬件和软件调试。
利用仿真工具对系统进行调试,确保系统运行正常。
4.实验测试。
将系统调试完成的硬件和软件测试,并对测试结果进行分析。
5.实验报告。
根据实验结果和实验过程撰写实验报告。
实验流程本次课程设计的实验流程如下:1.阅读相关资料和技术文档,确定项目的开发方案和实现思路。
2.进行硬件设计和选型,搭建好开发环境。
3.在开发环境下进行程序编写和调试,确保程序实现功能需求。
4.基于仿真工具对系统进行调试,确保系统运行正常。
5.进行实验测试和数据统计,分析测试结果并总结。
6.撰写实验报告,提交给指导老师。
项目评分本次课程设计评分主要考虑以下方面:1.系统功能实现的完整性和可靠性。
2.系统硬件和软件的选型和实现方案。
3.程序编码规范和可读性。
4.调试方法和技巧的运用。
5.实验报告的内容和撰写质量。
- 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);