《嵌入式系统及应用模板教学提纲.doc》由会员分享,可在线阅读,更多相关《嵌入式系统及应用模板教学提纲.doc(184页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Good is good, but better carries it.精益求精,善益求善。嵌入式系统及应用模板-江苏师范大学计算机科学与技术学院实验报告课程:嵌入式系统及应用学号:姓名:班级:教师:计算机科学与技术学院制实验一:实验名称:BC工具的使用方法实验目的:学习和掌握BC工具的使用方法实验(程序调试)过程:进行下述实验前设置环境变量PATH,变量值添加:例题2-1一个简单的问候程序1. 程序代码#includevoidmain()printf(“Hello,World!n”);2. 编辑程序使用Windows提供的文本文件,待程序编写完毕无误后用8109.c名称将文件存放到事先创建的
2、一个目录中,即11268109中。3. 把程序编译成目标程序进入命令环境并进入程序所在的目录,然后使用如下的命令对源文件8109.c进行编译:bcc-c-ml-Ic:bc31include-Lc:bc31lib8109.c4. 把目标文件连接成可执行文件命令如下:tlinkc:bc31libc0l.objtest.obj,test,test,c:bc31libcl.lib5. 运行8109例题2-2一个具有三个源文件应用程序的编译及连接示例1. pa程序代码/pa.h#ifndefPA_H#definePA_HvoidA_print();#endif/pa.c#include#includep
3、a.hvoidA_print()printf(AAAAAAAAn);2. pb程序代码/pb.h#ifndefPB_H#definePB_HvoidB_print();#endif/pb.c#include#includepb.hvoidB_print()printf(BBBBBBBBn);3. 8109.c程序代码/8109.c#includepa.h#includepb.hvoidmain()for(;)A_print();B_print();4. 编译编译pa.c以形成pa.obj文件,命令为:bcc-c-ml-Ic:bc31include-I.-Lc:bc31libpa.c编译pb.c
4、以形成pa.obj文件,命令为:bcc-c-ml-Ic:bc31include-I.-Lc:bc31libpb.c编译8109.c以形成8109.obj文件,命令为:bcc-c-ml-Ic:bc31include-I.-Lc:bc31lib8109.c5. 连接成可执行文件8109.exe生成8109.exe的命令为tlinkc:bc31libc0l.objpa.objpb.obj8109.obj,8109,8109,c:bc31libcl.lib6.运行实验过程中遇到的问题与解决方法:1. 问题:源代码中出现中文字符,程序出错。解决方法:把源代码中的中文字符改为英文字符。2. 输入命令时把英
5、文字母L写成数字1。3. 没有配置环境变量,命令不能执行。分析程序运行结果:Bcc命令编译生成obj文件,tlink命令将obj文件链接生成可执行文件。用bcc分别编译pa.c,pb.c,8109.c生成obj文件,编写tlink文件进行连接,生成可执行文件。运行结果实验二:实验名称:*.MAK的编写方法实验目的:掌握*.MAK文件的编写方法实验(程序调试)过程:例题2-3标号作用的示例1. makefile代码target1:md11target2:md22target3:rd11rd222. 运行命令makemaketarget2maketarget3例题2-4:为例题2-2设计一个具有4
6、个程序段的makefile,并在该文件中实现源文件的编译以及目标文件的连接,从而生成最终可执行文件。1. makefile代码如下:8109.EXE:TLINKtlink.txtPA.OBJ:Bcc-c-ml-Ic:bc31include-Lc:bc31libPA.cPB.OBJ:Bcc-c-ml-Ic:bc31include-Lc:bc31libPB.c8060.OBJ:Bcc-c-ml-Ic:bc31include-Lc:bc31lib8109.c2. makefile的执行:makepa.objmakepb.objmake8109.objmake例题2-5为例题2-2程序编写一个make
7、file文件,并利用依赖把用以完成工程文件编译及连接工作的各个程序段之间关联起来,从而使用户仅使用一个make命令,便可完成编译及连接任务。1. makefile文件8109.EXE:PA.OBJPB.OBJ8109.OBJTLINKtlink.txtPA.OBJ:Bcc-c-ml-Ic:bc31include-Lc:bc31libPA.cPB.OBJ:Bcc-c-ml-Ic:bc31include-Lc:bc31libPB.c8109.OBJ:Bcc-c-ml-Ic:bc31include-Lc:bc31lib8109.c2. makefile的执行过程make例题2-6使用批处理文件、ma
8、kefile和连接文件来处理例题2-2源程序的编译和连接。1. 批处理文件由于在前面已经有了makefile和连接文件,所以这里只写批处理文件:ECHOOFFECHO*ECHO*批处理文件ECHO*ECHO*ECHOONc:bc31binmake-f8109.mak2. 批处理文件的启动:双击该文件即可例题2-7:本例使用了两个来源不同的第三方源程序,一个存放在目录PORTPT,另一个存放在目录PC。用户自己的源文件TEST.c和连接文件TEST.LNK存放在目录SOURCE,批处理文件和makefile文件被存放在目录TEST,同时该目录还要负责存放将来创建出来的最终可执行文件TEST.EX
9、E。本例题无第三方源程序,故无实验结果!实验过程中遇到的问题与解决方法:1. 问题:在做例题2-6时,双击批处理文件,运行失败。解决方法:没有把makefile文件名字改为8060.mak,修改之后就可以正常运行了。分析程序运行结果:2-3创建目录11,创建目录22,删除目录11,、22.2-4(1)2-4(2)2-4(3)2-4(4)2-5(1)2-5(2)2-6实验三:实验名称:调试第三章3-63-10例题实验目的:掌握第三章3-63-10例题的调试方法实验(程序调试)过程:例题3-6设计一个只有一个任务MyTasK的应用程序,当程序运行后,任务MyTasK的工作就是每秒在显示器上显示一个
10、字符“M”。该应用程序的代码如下:#includeincludes.h#defineTASK_STK_SIZE512/任务堆栈长度OS_STKTaskStartStkTASK_STK_SIZE;/定义任务堆栈区INT16Skey;/用于退出uCOS_II的键INT8Ux=0,y=0;/字符显示位置voidMyTask(void*data);/声明一个任务/*主函数*/voidmain(void)char*s=M;/定义要显示的字符OSInit();/初始化uCOS_IIPC_DOSSaveReturn();/保存Dos环境PC_VectSet(uCOS,OSCtxSw);/安装uCOS_II中
11、断OSTaskCreate(MyTask,/创建任务MyTasks,/给任务传递参数&TaskStartStkTASK_STK_SIZE-1,/设置任务堆栈栈顶指针0);/使任务MyTask的优先级别为0OSStart();/启动uCOS_II的多任务管理voidMyTask(void*pdata)#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);/安装uCOS_II时钟中断向量PC_SetTickRate(OS_TICKS_PER_SE
12、C);/设置uCOS_II时钟频率OS_EXIT_CRITICAL();OSStatInit();/初始化uCOS_II的统计任务for(;)if(x10)x=0;y+=2;PC_DispChar(x,y,/在x,y位置显示s中的字符*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;/如果按下Esc键则退出uCOS_IIif(PC_GetKey(&key)=TRUE)if(key=0x1B)PC_DOSReturn();OSTimeDlyHMSM(0,0,1,0);/等待例题3-7在3-6应用程序的任务MyTasK中再创建一个任务YouTa
13、sK,当程序运行后,任务MyTasK的工作在显示器上显示一个字符“M”;而任务YouTasK则是在显示器上显示字符“Y”。应用程序的源代码如下:/*Test*/#includeincludes.h#defineTASK_STK_SIZE512/任务堆栈长度OS_STKMyTaskStkTASK_STK_SIZE;/定义任务堆栈区OS_STKYouTaskStkTASK_STK_SIZE;/定义任务堆栈区INT16Skey;/用于退出uCOS_II的键INT8Ux=0,y=0;/字符显示位置voidMyTask(void*data);/声明任务voidYouTask(void*data);/声明
14、任务/*主函数*/voidmain(void)char*s_M=M;/定义要显示的字符OSInit();/初始化uCOS_IIPC_DOSSaveReturn();/保存Dos环境PC_VectSet(uCOS,OSCtxSw);/安装uCOS_II中断OSTaskCreate(MyTask,/创建任务MyTasks_M,/给任务传递参数&MyTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶指针0/任务的优先级别为0);OSStart();/启动多任务管理/*任务MyTask*/voidMyTask(void*pdata)char*s_Y=Y;/定义要显示的字符#ifOS_CR
15、ITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);/安装时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);/设置时钟频率OS_EXIT_CRITICAL();OSStatInit();/初始化统计任务OSTaskCreate(YouTask,/创建任务MyTasks_Y,/给任务传递参数&YouTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶指针2/MyTask的优先级别为2);for(;)if(x50)x=0
16、;y+=2;PC_DispChar(x,y,/字符的显示位置*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;/如果按下Esc键则退出uCOS_IIif(PC_GetKey(&key)=TRUE)if(key=0x1B)PC_DOSReturn();/恢复Dos环境OSTimeDlyHMSM(0,0,3,0);/等待3秒/*任务YouTask*/voidYouTask(void*pdata)#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;)if(x50)x=0;y+
17、=2;PC_DispChar(x,y,/字符的显示位置*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;OSTimeDlyHMSM(0,0,1,0);/等待1秒/*End*/例题3-8修改例题3-7应用程序的任务YouTasK。要求任务YouTasK运行20次后,挂起任MyTasK务;当任务YouTasK运行40次后,恢复任务MyTasK。应用程序的源代码如下:#includeincludes.h#defineTASK_STK_SIZE512/任务堆栈长度OS_STKMyTaskStkTASK_STK_SIZE;/定义任务堆栈区OS_STK
18、YouTaskStkTASK_STK_SIZE;/定义任务堆栈区INT16Skey;/用于退出uCOS_II的键INT8Ux=0,y=0;/字符显示位置INT8Utime=0;voidMyTask(void*data);/声明任务voidYouTask(void*data);/声明任务/*主函数*/voidmain(void)char*s_M=M;/定义要显示的字符OSInit();/初始化uCOS_IIPC_DOSSaveReturn();/保存Dos环境PC_VectSet(uCOS,OSCtxSw);/安装uCOS_II中断OSTaskCreate(MyTask,/创建任务MyTasks
19、_M,/给任务传递参数&MyTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶指针0);/使任务MyTask的优先级别为0OSStart();/启动uCOS_II的多任务管理/*任务MyTask*/voidMyTask(void*pdata)char*s_Y=Y;/定义要显示的字符#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);/安装uCOS_II时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC)
20、;/设置uCOS_II时钟频率OS_EXIT_CRITICAL();OSStatInit();/初始化uCOS_II的统计任务OSTaskCreate(YouTask,/创建任务MyTasks_Y,/给任务传递参数&YouTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶指针2);/使任务MyTask的优先级别为0for(;)if(x50)x=0;y+=2;PC_DispChar(x,y,/显示字符的位置*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;/如果按下Esc键则退出uCOS_IIif(PC_GetKey(&key)
21、=TRUE)if(key=0x1B)PC_DOSReturn();OSTimeDlyHMSM(0,0,3,0);/等待/*任务YouTask*/voidYouTask(void*pdata)#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;)if(time=20)OSTaskSuspend(0);if(time=40)OSTaskResume(0);time+=1;if(x50)x=0;y+=2;PC_DispChar(x,y,/显示字符的位置*(char*)pdata,DISP_BGND_BLACK+DISP_FGND
22、_WHITE);x+=1;OSTimeDlyHMSM(0,0,1,0);/等待/*End*/例题3-9改造例题3-7的任务MyTasK,当任务MyTasK运行10次时用函数OSSchedLock()对调度器进行加锁,而当任务MyTasK运行到第80次时再用函数OSSchedUnlock()对调度器进行解锁,并运行该程序。应用程序的代码如下:#includeincludes.h#defineTASK_STK_SIZE512/任务堆栈长度OS_STKMyTaskStkTASK_STK_SIZE;/定义任务堆栈区OS_STKYouTaskStkTASK_STK_SIZE;/定义任务堆栈区INT16S
23、key;/用于退出uCOS_II的键INT8Ux=0,y=0;/字符显示位置INT8Utimes=0;/运行次数voidMyTask(void*data);/声明任务voidYouTask(void*data);/声明任务/*主函数*/voidmain(void)char*s_M=M;/定义要显示的字符OSInit();/初始化uCOS_IIPC_DOSSaveReturn();/保存Dos环境PC_VectSet(uCOS,OSCtxSw);/安装uCOS_II中断OSTaskCreate(MyTask,/创建任务MyTasks_M,/给任务传递参数&MyTaskStkTASK_STK_SI
24、ZE-1,/设置任务堆栈栈顶指针0);/使任务MyTask的优先级别为0OSStart();/启动uCOS_II的多任务管理/*任务MyTask*/voidMyTask(void*pdata)char*s_Y=Y;/定义要显示的字符#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);/安装uCOS_II时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);/设置uCOS_II时钟频率OS_EXIT_CRITICAL(
25、);OSStatInit();/初始化uCOS_II的统计任务OSTaskCreate(YouTask,/创建任务MyTasks_Y,/给任务传递参数&YouTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶指针2);/使任务MyTask的优先级别为2for(;)if(x50)x=0;y+=2;times+=1;if(times=10)OSSchedLock();/锁调度器if(times=80)OSSchedUnlock();/解锁调度器PC_DispChar(x,y,/显示字符的位置*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
26、x+=1;/如果按下Esc键则退出uCOS_IIif(PC_GetKey(&key)=TRUE)if(key=0x1B)PC_DOSReturn();OSTimeDlyHMSM(0,0,3,0);/等待/*任务YouTask*/voidYouTask(void*pdata)#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;)if(x50)x=0;y+=2;PC_DispChar(x,y,/显示字符的位置*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;OSTimeDl
27、yHMSM(0,0,1,0);/等待/*End*/例题3-10修改例题3-7应用程序,使任务MyTasK能删除任务YouTasK。修改后的代码如下:#includeincludes.h#defineTASK_STK_SIZE512/任务堆栈长度OS_STKMyTaskStkTASK_STK_SIZE;/定义任务堆栈区OS_STKYouTaskStkTASK_STK_SIZE;/定义任务堆栈区INT16Skey;/用于退出uCOS_II的键INT8Ux=0,y=0;/字符显示位置voidMyTask(void*data);/声明任务voidYouTask(void*data);/声明任务/*主函
28、数*/voidmain(void)char*s_M=M;/定义要显示的字符OSInit();/初始化uCOS_IIPC_DOSSaveReturn();/保存Dos环境PC_VectSet(uCOS,OSCtxSw);/安装uCOS_II中断OSTaskCreate(MyTask,/创建任务MyTasks_M,/给任务传递参数&MyTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶指针0);/使任务MyTask的优先级别为0OSStart();/启动uCOS_II的多任务管理/*任务MyTask*/voidMyTask(void*pdata)char*s_Y=Y;/定义要显示的字
29、符char*s=MyTask:我要求YouTask自己删除自己!;#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);/安装uCOS_II时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);/设置uCOS_II时钟频率OS_EXIT_CRITICAL();OSStatInit();/初始化uCOS_II的统计任务OSTaskCreate(YouTask,/创建任务MyTasks_Y,/给任务传递参数&YouTask
30、StkTASK_STK_SIZE-1,/设置任务堆栈栈顶指针2);/使任务MyTask的优先级别为0for(;)if(x30)while(OSTaskDelReq(2)!=OS_TASK_NOT_EXIST)PC_DispStr(10,8,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);OSTimeDly(1);/延时一个时钟节拍if(x50)x=0;y+=2;PC_DispChar(x,y,/显示字符的位置*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;/如果按下Esc键则退出uCOS_IIif(PC_GetKey
31、(&key)=TRUE)if(key=0x1B)PC_DOSReturn();OSTimeDlyHMSM(0,0,3,0);/等待/*任务YouTask*/voidYouTask(void*pdata)char*s1=YouTask:我必须要删除我自己了!;char*s2=YouTask:我已经删除我自己了!;#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;)if(OSTaskDelReq(OS_PRIO_SELF)=OS_TASK_DEL_REQ)PC_DispStr(10,10,s1,DISP_FGND_WHITE
32、+DISP_BGND_BLACK);OSTimeDlyHMSM(0,0,15,0);PC_DispStr(10,12,s2,DISP_FGND_WHITE+DISP_BGND_BLACK);OSTaskDel(OS_PRIO_SELF);if(x50)x=0;y+=2;PC_DispChar(x,y,/显示字符的位置*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;OSTimeDlyHMSM(0,0,1,0);/等待/*End*/实验过程中遇到的问题与解决方法:1. 编写连接文件时出错,程序不能正常运行。解决方法:用记事本打开,并把文件属性
33、设置为所有属性,然后修改即可。分析程序运行结果:3-6无符号8位整数x记录一行中已打印的字符数,y记录打印位置的行数,分别初始化为0。Main函数中经OSInit()初始化uC/OSii,经PC_DOSSaveReturn()保存当前的dos环境,安装任务切换中断向量,用OSTaskCreate()创建MyTask任务,设置优先级为0(最高),随后用OSStart()启动多任务管理器。MyTask任务中,首先进入临界段,安装时钟中断向量,并设置时钟频率,然后退出临界段。for循环中刚开始的if判断当前一行打印字符数是否超过11个(x从0开始计数,每打印一个M,则x+=1),若超过11个,则x复
34、位到0,y+=2,即打印位置向下移2行。PC_DispChar()函数用于打印字符,后景色黑色,前景色白色,位置为x列y行,每打印一个字符,列数加1。若按下ESC,则推出uC/OS,OSTimeDlyHMSM()用于延时,每输出一个字符,等待1秒。3-7无符号8位整数x记录打印字符位置的列数,y记录打印位置的行数,分别初始化为0。Main函数中经OSInit()初始化uC/OSii,经PC_DOSSaveReturn()保存当前的dos环境,安装任务切换中断向量,用OSTaskCreate()创建MyTask任务,设置优先级为0(最高),随后用OSStart()启动多任务管理器。MyTask任
35、务中,首先进入临界段,安装时钟中断向量,并设置时钟频率,然后退出临界段。MyTask中通过OSTaskCreate()创建了YouTask任务,设置优先级为2。for循环中刚开始的if判断当前一行打印字符数是否超过51个(x从0开始计数,每打印一个M,则x+=1),若超过51个,则x复位到0,y+=2,即打印位置向下移2行。PC_DispChar()函数用于打印字符,后景色黑色,前景色白色,位置为x列y行,每打印一个字符“M”,列数加1。若按下ESC,则推出uC/OS,OSTimeDlyHMSM()用于延时,每输出一个字符,等待3秒。在MyTask任务等待期间,YouTask运行,for循环中
36、刚开始的if判断当前一行打印字符数是否超过51个(x从0开始计数,每打印一个Y,则x+=1),若超过51个,则x复位到0,y+=2,即打印位置向下移2行。PC_DispChar()函数用于打印字符,后景色黑色,前景色白色,位置为x列y行,每打印一个字符“Y”,列数加1。若按下ESC,则推出uC/OS,OSTimeDlyHMSM()用于延时,每输出一个字符,等待1秒。由于MyTask运行每次等待3秒,YouTask运行每次等待1秒,所以程序每次打印一个M,然后打印三个Y,循环往复,一行满51个字符则换行。3-8无符号8位整数x记录打印字符位置的列数,y记录打印位置的行数,分别初始化为0。无符号8
37、位整数变量time记录YouTask的运行次数。Main函数中经OSInit()初始化uC/OSii,经PC_DOSSaveReturn()保存当前的dos环境,安装任务切换中断向量,用OSTaskCreate()创建MyTask任务,设置优先级为0(最高),随后用OSStart()启动多任务管理器。MyTask任务中,首先进入临界段,安装时钟中断向量,并设置时钟频率,然后退出临界段。MyTask中通过OSTaskCreate()创建了YouTask任务,设置优先级为2。for循环中刚开始的if判断当前一行打印字符数是否超过51个(x从0开始计数,每打印一个M,则x+=1),若超过51个,则x复位到0,y+=2,即打印位置向下移2行。PC_DispChar()函数用于打印字符,后景色黑色,前景色白色,位置为x列y行,每打印一个字符“M”,列数加1。若按下ESC,则推出uC/OS,OSTimeDlyHMSM