嵌入式程序设计实训报告.docx
嵌入式程序设计实训报告一、实训目的1 .掌握任务同步机制:信号量。2 .掌握信号量实现生产-消费问题应用实例。二、实训基本原理1 .生产消费问题是一个经典的数学问题,要求生产者一消费者在固定的 仓库空间条件下,生产者每生产一个产品将占用一个仓库空间,生产者生产 的产品库存不能越过仓库的存储量,消费者每消费一个产品将增加一个仓库 空间,消费者在仓库产品为0时不能再消费。2 .信号量主要用来实现任务间同步,标识某类资源可用个数,或者说, 对于某个特定资源,可以供多少个任务同时使用。三、实训要求1 .对于生产者来说,其需要申请的资源为仓库中的剩余空间,因此,生 产者在生产一个产品前,申请sem_produce信号量,当此信号量的值大于0, 即有可用空间,将生产产品,并将sem_produce的值减去1 (因为占用了一 个空间);同时,当其生产一个产品后,当前仓库的产品数量增加1,需要 将sem_custom信号量自动加1。2 .对于消费者来说,其需要申请的资源为仓库中的产品,因此,消费者 在消费一个产品前,将申请sem_custom信号量,当此信号量的值大于0时, 即有可用产品,将消费一个产品,并将sem_custom信号量的值减去(因为 消费了一个产品),同时,当消费一个产品,当前仓库的剩余空间增加1, 需要将sem_produce信号量自动加1。四、实训仪器设备1 .支持安装运行VMware虚拟机的笔记本°2 .安装并破解Keil uVision3软件。五、实训步骤1 .安装并破解好keil uVision32 .找到并打开串口程序sem32中的demol. Uv22 Windows XP Protwttxwl VMware Wortcstabon如(D wwoj ft#(v)ma取m)星的qd | -与 © a E B B a1 0 0©RMa,3©RMa,3G Window% XP PiofeMionalWindows XP PcofeswondlWindows XP PcofeswondlQ中涛远见开发环境V1?BV3.0IQ ubuntu 1604 (RHEL7-3-0.« d» .叫网 3夕,6le10y void n<nn,v“dOSIfiltO;I, J23OS.tr. 3OS.CT. 3Sr«rt. QferUl. cL:1C:116 弊osr«sxcteat«<T»3He gt gjea 皿q BlocM ACS 忡8« *XnitTiaexOO lInitSeciftlBuffecO:veld , . :T«skl_pso<l»oerSi void , .iTanclu* “acl3e,h>r«id Taskl-produTor 1<! 'Rdam xwmtrant; void 'I ask J custcaex v©ld 卜xe«ntxant.void TAik3 :void ppdaxal rentrantOS.srx T»3lcl_producecStk(NaxStkSize: M 立:?<;.; / 4 :? 一 0213TK Taalt2"cuatOBetBtic (NAxStkBizt J J8二3TK Taalt3Stk(MaxSUSizej;8_VEHTt8:。匚EVINT ,5 二 XOgOe;Q-匕:一-3*9vr*e Wv««p«r« w» 名 RMU tfiCSUUB: rwi» 如 Soret Gro4)|i g danoic,054PU<C* jKosjrc XOSFVJkA要两6人定的*1机.清将以标邮博入H中磁CHUG.3.为其添加lib库C51L. LIB,并删除自带的lib库C51L. L1B01 日#include <includes ,h>01 日#include <includes ,h>02030405060708091011121314void void voidTa:Ta:Ta:OS_STK 1 OSSTK ' OSSTK 1 oseven' OS-EVEN,void ma15316171819202122OSI:Add Files to Group 'Source Group 1'查找范围(D: |OLIB1C51BCLIB3C51BFPC.LIB 1C51BFPL.LIB 1C51BFPS.LIB1C51BL.LIB1C51BS.LIB1C51C.LIBC51DS2A.LIB gC51DS2T.LIB SC51FPC.LIB 画 C51FPLUB国 c51mc,lib<|文件名(N): |C51L.LIBy,c51mfpc.lib §c51mfj3l.lib 西 c51mgs.lib 国 c51mLiibc51ms.libC51NC.LIBSC51NFPC.LIB文件类型(T): (Library file (*. lib)Ini-工 nius- i InitSerialBuffer();HC51NFPL.LIB 1C51NFPS.LIB |C51NL.LIB 回 C51NS.LIB 1C51S.LIB 1CD51C.LIB 1CD51FPC.LIB到 CD51FPLL 1ICD51FPS.L g|CD51L.LIB 画 CD51S.LIB 回 CH51cLiB 1CH51FPC.L 1CH51FPL.L:ZOSTaskCreate(Taskl producer, (void *)0, &Taskl producerSi2lX I X'讣I遮力;太4j率4.库添加完成后,开始debug调试模式4.库添加完成后,开始debug调试模式void main(void)OSInit ();InitTimerO();InitSerial();InitSerialBuffer();OSTaskCreate(Taskl_producer,(void*)0,&Taskl_producerStk0,2);OSTaskCreate(Task2_customer,(void*)0,&Task2_customerStk0, 3);OSTaskCreate(Task3, (void *)0, &Task3Stk0, 4);sem_produce=0SSemCreate(2);sem_custom=0SSemCreate(2);OSStart ();void Taskl producer (void *ppdata) reentrantINT8U err_p;ppdata=ppdata;ETO=1;clrscr ();PrintStr (ntt*n);*n);PrintStr(tt* Hello! The world.PrintStr ("tt*nnn);OSSemPend (sem_produce, 30*0S_TICKS_PER SEC, &err_p);PrintStr (,ztttThis is Taskl_producer. nz,);OSSemPost(sem custom);OSTimeDly(OS_TICKS_PER_SEC);void Task2_customer(void *ppdata) reentrantINT8U err_c;ppdata=ppdata;for(;) OSSemPend (semcustom, 0, &err_c);PrintStr (/zttttThis is Task2_customer. n/z);OSSemPost(sem_produce);OSTimeDly(OS_TICKS_PER_SEC);void Task3 (void *ppdata) reentrant(ppdata=ppdata;for(; ;) PrintStr ("tttttThis is Task3. n/z);OSTimeDly(6*0S_TICKS_PER_SEC);5.运行,如图所示。二 Winciowi XP ProfeMiondl VMw-WcxWlon文 WB Wffi(t) B«(V)M 喉(D «Wi) | -3 0 , & (E 曰目 t5> «二I - O »' Wndom XP Pro4c、,io>Ml。¥君运兔开发球境VI ?B V30C Ubuntu«6.04G RHEL 7-3匚 HMISMSI陕 E M Reject Qetug F。locte S*CS gJ u u B r - AlH3 ” -旧 回 g|Bj Bfc - o =:间情 我回h回nt w I V01 finclude <mc*uder.ft>英 0) o« 050, o« 01«ld Tarr, producecvoid "rpdatai reentrantA TaaKIfi”。©r>, tv,d *("p<lat4l veentiant void Ts3c3 Told *pp<lat4: x««ntrant8JHK Taskl ,pcodt>cerSt4 |Hix3ttSi:eJ; / aS. 混江 A/文伴XUCnKJod.8 87K TASIC2 custcaerStX: |M»x3tWiz«;<e-8W msK3款IC IIUx3t“Hel;void tan. void.oexnito;SnitTutatCsei cu3tmcestaetd;iwreuUART®1-:- Izi 二一 二一二三二二七二工三三. 季隹栉隹运芒雪有淳运yTMrl:r t:7»20?2屋“ , , ,切汜停转。】;以在会餐tt先我任孑里,OS打"J怙3用TSSLHMMhty :策-4 =*r*先生光级, E “:clcscrO;B <W»l.c QC«.C7. Qos.CP. Q rri. Q»«rUI.< 9 Jlr It:0rXT Lur* A“rhl,Figs /tl:0£C02501tiiK安可喻人正育撕蒯Wm. UWKl标旧入H中或被CbUQ6.再进行串口程序seni3调试,分别同以上步骤。 void Taskl_producer (void *ppdata) reentrant (INT8U err_p;ppdata=ppdata;ETO=1;clrscr ();PrintStr (ntt*n);PrintStr(tt* Hello! The world. *n); PrintStr (tt*nnn);for (; ;) OSSemPend (sem_produce, 300*0S_TICKS_PER_SEC, &err_p); if (err_p-=0S_N0_ERR) bufferinput=rbuf;for (k=0;k<5;k+)PrintChar (bufferk);PrintStr (n);PrintStr (,zttttThis is Taskl producer. nz/);input+;rbuf+;if ( input>=5) input=0;rbuf=,A')OSSemPost(semcustom);OSTimeDly(OS_TICKS_PER_SEC);void Task2_customer(void *ppdata) reentrant(INT8U err_c;ppdata=ppdata;for(; ;) OSSemPend (sem_custoni, 0, &err_c);if (err_c=0S_N0_ERR)odata=bufferoutput;bufferoutput='O'PrintChar(odata);PrintStr (n);for(j=0;j<5;j+)PrintChar(bufferj);)PrintStr (n);output+;if ( output>=5)(output=0;)PrintStr (,zttttThis is Task2 clistonier. n);OSSemPost(sem_produce);OSTimeDly(OS_TICKS_PER_SEC);void Task3 (void *ppdata) reentrant(ppdata=ppdata;for (; ;) PrintStr (z/tttttThis is Task3. nz/);OSTimeDly(6*0S_TICKS_PER_SEC);文件(D «M(D fiW(V) AHVUM) JW-EO) ««XH)C RHa 7-3Q fn30»© ««£' ftt'XI HA® 阳0 ta8B)工具(D BQOC «»MUK" *f-9 rror(t). 0 warning )41 - Mrrotoft Aviatf C bufftr2p0Xf*(3 户 0xfff 】:ebuff”。卜 3“f* =0buff”"卜 ebuff»r(2p3buffer(3p0buffpr(4i)=9buff*r(2p3buff«r(3p<lbuff>r(2>3buff«r(3p(itor»9«">input:3 O9«*>output>1<Ut« 2r»r(e):e buff©r(ipe tor*9«'>>input>3 tof69*->output«2.'殖.dtor»9«*>input torA9«*>outputs1Window* XP ProfcsuonalCiS83it»F.-Mflndowt XP Ptofewton 立6VI28 Vi 0IQ ubuntu 16.04I0RME17-3,共费喇机jfr»r(e)>0 buff»r(1p0tord9«*>input>6torw3tput2jff*r(e)-e bufftr1«2tor»9*a>tnput>2toro9«*>outputs1jff»r(epO buff»r(1)se tor*9<->Input«M lorwoutput,2调就X在文件1中查N)JIK人定由9WMK1矶.J»将占标181,临入H中电检CHIG.,六、实训体会本次的实训实是培养我们综合运用所学知识,发现、提出、分析和解决实际 问题、锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。在经过了这么多天的摸索与实验,我们终于完成了课程设计所要求的内容,有了 一个圆满的结果,但这其中的过程却是很曲折的。虽然在做课程设计以前我们已 经系统地学习了课本上是内容,但是理论与实践往往会有一些差距,在一开始拿 到课题我们还是没有头绪。经过上网查询并学习,在实验过程的每一步我们都做 了大量的尝试,倾注了我们大量的时间与心血,曾经为程序的编写冥思苦想过, 为无法找出错误郁闷苦恼过,也为某一功能无法实现犹豫彷徨过,但是在老师的 帮助及大家团结一心下,难题都被一一克服,我们最终成功调试。