嵌入式系统实验报告_第1页
嵌入式系统实验报告_第2页
嵌入式系统实验报告_第3页
嵌入式系统实验报告_第4页
嵌入式系统实验报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大连理工大学本科实验报告课程名称:嵌入式系统实验学院(系):电子信息与电气工程学部专业:自动化 班级:0804 学号: 学生姓名: 2011年11月18日大连理工大学实验报告学院(系): 电信专业: 自动化班级: 0804姓名:何韬学号: 200881197组:实验时间:2011-11-12实验室:dW8实验台:指导教师签字:成绩:实验二ARM的串行口实验一、 实验目的和要求见预习报告二、 实验原理和内容见预习报告三、 主要仪器设备硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上、串口线。软件:PC机操作系统win98、Win2000或WinXP、ARMSDT2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。四、 实验步骤见预习报告五、 核心代码在主函数中实现将从串口0接收到的数据发送到串口0(Main.c)intmain(void){charc1[1];charerr;ARMTargetInit(); //开发版初始化LCD_Init();LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式LCD_Cls();//文本模式下清屏命令while(1)

Uart_SendByte(0,0xa);//换行Uart_SendByte(0,0xd);//回车err=Uart_Getch(c1,0,0);//从串口采集数据Uart_SendByte(0,c1[0]);//显示采集的数据LCD_printf(c1);//向液晶屏输出}return0;}六、实验结果与分析1.ARM串口实验超级终端上显示:当输入一个字符,会在超级终端中显示出来,如下图所示。BIOSstartOK*,BIOSstart;OK!hhy2.ARM串口实验Debug运行显示:ailxa [I■ _._ .uhi1hII|xCnVlSTATlaD:x4j;.I'/trHitiduCdMENUIKFOhTue-e泌ailxa [I■ _._ .uhi1hII|xCnVlSTATlaD:x4j;.I'/trHitiduCdMENUIKFOhTue-e泌ata.1nosEKTP.TRb»BE^lKndlHEHucilLaxUridc-CAaJjlLtlPibOETJrEdedabugrhAtld.la:EUKidjwC」融口inxierti.fla-G.hABilliEZPJLbC.ET;IIlEDnUILIVDiei.1h日邱注LwIFQbElonlLErFiaCtLBE;EX;UHTkEjaTlm*E||;isiidlerL】_5B3idBj-hBla^axd.:!□isxt-HetidBycj!:IDjairoi:U»et._IraT^h|ch&E"P^-v-dHtarinxHietn*A^merinacux}Lut1-0,1LC(Unmi皿□■(・■!IHTTESTATnw(lwl|)7//P.tEeloi-darart«j,T!・x■廿■匚■■口dUH>:H0i:[日XBTUxnTP-LTI-ifliiJel!|iUTE5TATl器Oji:l|)p/j'BEcelira!dat:n.ceadS・w」M・RdJm>:HLI:[FzaixixnTWJIj七、实验心得该实验展示了ARM的串行口通讯过程及控制方式,使我基本掌握了ARM的串行口工作原理、编程实现ARM的UART通讯及CPU利用串口通讯的方法,对之前所学知识有了明确的理解和认识,能够在正确操作下准确做出实验现象,并在实验箱上显示出实验结果,使我收获很多。大连理工大学实验报告学院(系): 电信专业: 自动化 班级: 0804姓名:何韬学号: 200881197组:实验时间:2011-11-12实验室:dW8实验台:指导教师签字:成绩:实验九uC/OS-II在ARM平台的移植一、 实验目的和要求见预习报告二、 实验原理和内容见预习报告三、 主要仪器设备硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上、串口线。软件:PC机操作系统win98、Win2000或WinXP、ARMSDT2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。四、 实验步骤见预习报告五、 核心代码所涉及到的函数:汇编函数OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()C语言函数void*OSTaskStkInit(void(*task)(void*pd),void*pdata,void*ptos,INT16Uopt)voidOSTaskCreateHook(OS_TCB*ptcb)voidOSTaskDelHook(OS_TCB*ptcb)voidOSTaskSwHook(void)voidOSTaskStatHook(void)voidOSTimeTickHook(void)后5个函数为接口函数,可以不加代码cut/OS-II的启动:voidmain(void){OSInit();//初始化uC/OS-II.通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;.OSStart();〃开始多任务调度,永不返回}基于uC/OS的应用开发:voidYourTask(void*pdata){/*用户代码*/OSTaskDel(OS_PRIO_SELF);}main函数,ucos-ii初始化等定义:#include”../ucos-ii/includes.h" /*uC/OSinterface*/#include”../ucos-ii/add/osaddition.h”#include”../inc/drivers.h”#include”../inc/sys/lib.h”#include”../src/gui/gui.h”#include<string.h>#include<stdio.h>semihosting#pragmaimport(__use_no_semihosting_swi)//ensurenofunctionsthatusesemihosting///******************任务定义***************////*OS_STKSYS_Task_Stack[STACKSIZE]={0,};//systemtask刷新任务堆栈#defineSYS_Task_Prio 1voidSYS_Task(void*Id);*/OS_STKtask1_Stack[STACKSIZE]={0,}; //Main_Test_Task堆栈voidTask1(void*Id); //Main_Test_Task

#defineTask1_Prio12OS_STKtask2_Stack[STACKSIZE]={0,}; //test_Test_Task堆栈voidTask2(void*Id); //test_Test_Task#defineTask2_Prio15/**************已经定义的OS任务*************TOC\o"1-5"\h\z#defineSYS_Task_Prio 1#defineTouch_Screen_Task_Prio 9#defineMain_Task_Prio12#defineKey_Scan_Task_Prio58#defineLcd_Fresh_prio 59#defineLed_Flash_Prio 60"""""""""""""""""""""""""""""""""""""""***************************************intmain(void){ARMTargetInit(); //dotarget(uHALbasedARMsystem)initialisation//OSInit(); //neededbyuC/OS-II////OSInitUart();//initOSFile();//#ifUSE_MINIGUI==0//initOSMessage();//initOSDC();//LoadFont();//#endif//loadsystemParam();//createthetasksinuC/OSandassignincreasing////prioritiestothemsothatTask3attheendof////thepipelinehasthehighestpriority. ////LCD_printf("CreatetaskonuCOS-II...\n");//OSTaskCreate(SYS_Task,(void*)0,(OS_STK*)&SYS_Task_Stack[STACKSIZE-1],SYS_Task_Prio);OSTaskCreate(Task1, (void*)0, (OS_STK*)&task1_Stack[STACKSIZE-1],Task1_Prio);OSTaskCreate(Task2, (void*)0, (OS_STK*)&task2_Stack[STACKSIZE-1],Task2_Prio);OSAddTask_Init(0);//LCD_printf("StartinguCOSTI...\n");//LCD_printf("Enteringgraphmode...\n");//LCD_ChangeMode(DspGraMode);OSStart();//starttheOS//OSStart();//starttheOS////neverreached//return0;}//mainvoidTask1(void*Id){for(;;){printf("runtask1\n");OSTimeDly(1000);}}voidTask2(void*Id){for(;;){printf("runtask2\n");OSTimeDly(3000);}}六、 实验结果与分析超级终端上交替显示runtask1,runtask2,runtask1,runtask1,runtask1,runtask2,runtask1,runtask1,runtask1。表明由于task1的优先级为12,而task2的优先级为15,所以系统在task1和task2同时就绪时总是先执行task1后执行task2.由于task2挂起时间为3秒,所以在task2挂起期间task1能执行两次,而当第三次时由于task1与task2同时处于就绪态,由优先级次序,还是先执行task1在执行task2.然后就这样周而复始的循环下去。为验证ucos的强实时性,可以去掉task2()的“OSTimeDly(3000);”然后令task1()中的“OSTimeDly(1000);”改为“OSTimeDly(10);”。观察到的实验现象是在超级终端上显示被“runtask1”打断的”“runtask2”,反之把task1和task2的优先级交换则在超级终端上只显示“runtask2”。这说明ucos的强实时性得到了验证,因为在任何时候只要高优先级的任务都可以打断正在执行的低优先级任务,反之低优先级任务却不可打断正在执行的高优先级的任务。七、 实验心得该实验使我了解了uCOS-II内核的主要结构,对所学知识有了加深刻的理解和认识,基本掌握了将uCOS-II内核移植到ARM920T处理器上的方法,能够正确完成基本操作得出正确结果。15316:15715316:1571S91711731巧17717?1S11S3185ISIS?191应1釜1971951541561网17017217417617EISO1&21U1&61够典1?21P41珀1?S2DODVSBD-DNLPD泪HTJSBIH-HUSBD-RXDOJUCDD/GPH3nRTSOliRTSQ-GPHldiCTSl:KXDLnCTSLGPH?站TOL7Tu^SrOLTGP^lEINTW'GFF三ED<T7.-GFF7FC'LECLE'GPAl?nFCEnFCZGFA2WWEnF^BGPAl?RXD1EXD1.-GPH5_AIX5_AIX7 VDDRTC学院(系): 电信专业: 自动化 班级: 0804姓名:何韬学号: 200881197组:实验时间:2011-11-12实验室:dW8实验台:指导教师签字:成绩:实验二ARM的串行口实验、实验目的和要求.掌握ARM的串行口工作原理。.学习编程实现ARM的UART通讯。.掌握CPU利用串口通讯的方法。二、实验原理和内容实验原理:硬件电路图核心板电路接口:C'LKOLT'l/GPHiaCLKaUTlCLK0LWGPH9CLKOVR)IXD0-GPH2"DOTiiCTSOGPHflTKD2.'nR.TSl/GPHj6uRTSlLJCLK-'GFHSZn.T4/GPF4ZENT&'GmEIXT6AIEGFA18FAIZFRBiiFECEIXD1-GPH4"roiVREF硬件电路图一MAX3232:

RS232TXD014RS232RXD0-13RS232TXD17R.S232RXD1sC1+RS232TXD014RS232RXD0-13RS232TXD17R.S232RXD1sC1+C1-C2-V-C2-GMD-T1OUTT1IN・R1INR1OUTT2OUTT2DJR2OUT接口连线:保炉姬〔摸站帕i发遂数据TkDs技收收据RXDj?谓束现选RiS45It演植甫AIHt指示RlRUHLOOK1、 6Jrx_2RS232KW0—3^S232TXDOgp.497II,I1异步串行I/O异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行1/0可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行1/0方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。图2-1串行通信字符格式图2-1给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为T'。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600,119200等。接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:1)奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。2)帧格式错:一个字符从起始位到停止位的总位数不对。3)溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。每一种错误都会给出相应的出错信息,提示用户处理。ARM自带的串行口寄存器ARM自带两个串行口,各带有16字节的FIFO(先入先出寄存器),最大波特率115.2K。每个UART有7种状态:溢出错误、校验错误、帧错误、暂停态、接收缓冲区准备好、发送缓冲区空、发送移位缓冲器空,这些状态可以由相应的UTRSTATn/UERSTATn表示,并且与发送接收缓冲区相对应的有错误缓冲区。波特率的可以通过控制波特率寄存器(UBRDIVn)控制。与UART有关的寄存器主要有以下几个:UART线性控制寄存器ULCONn该寄存器的第6位决定是否使用红外摸式,位5〜3决定校验方式,位2决定停止位长度,位1和。决定每帧的数据位数。参考:普通模式,无奇偶校验,1位停止位,8为数据长度。UART控制寄存器UCONn,该寄存器决定UART的各种摸式。UARTFIFO控制寄存器UFCONn,UARTMODEM控制寄存器,分别决定UARTFIFO和MODEM的模式。其中UFCONn的第0位决定是否启用FIFO,UMCONn的第0位是请求发送位,对我们来说是比较重要的。参考:Tx电平触发,Rx边沿触发,禁止接收超时中断,允许接收错误中断,发送和接受模式均为01。读写状态寄存器UTRSTAT以及错误状态寄存UERSTAT,可以反映芯片目前的读写状态以及错误类型。FIFO状态寄存器UFSTAT和MODEM状态寄存器UMSTAT,通过前者可以读出目前FIFO是否满以及其中的字节数;通过后者可以读出目前MODEM的CTS状态。发送寄存器UTXH和接收寄存器URXH,这两个寄存器存放着发送和接收的数据,当然只有一个字节8位数据。需要注意的是在发生溢出错误的时候,接收的数据必须要被读出来,否则会引发下次溢出错误。最后是波特率引子寄存器UBRDIV。该寄存器为十六位,算法参见上页的部分。计算公式如下:UBRDIVn=(round_off)(MCLK/(bpsX16))-1其中MCLK是系统频率,例如在40MHz的情况下,当波特率取115200时,UBRDIVn=(int)(40000000/(115200X16)+0.5)-1=(int)(21.7+0.5)-1=22-1=21注意:由于ARM工作时存在小端和大端两种工作模式,所以同样一个寄存器在不同模式时地址也不一样,需要加以区别。实验内容:学习串行通讯原理,了解串行通讯控制器,阅读ARM芯片文档,掌握ARM的UART相关寄存器的功能,熟悉ARM系统硬件的UART相关接口。编程实现ARM和计算机实现串行通讯:ARM监视串行口,将接收到的字符再发送给串口(计算机与开发平台是通过超级终端通讯的),即按PC键盘通过超级终端发送数据,开发平台将接收到的数据再返送给PC,在超级终端上显示。三实验步骤新建工程,将“Exp2ARM串口实验”中的文件添加到工程中,这些是启动时所需要的文件。定义与UART有关的各个寄存器地址和一些特殊的位命令。主要有以下各寄存器(44b.h):/*UART的全部功能寄存器*/#definerULCONO(*(volatileunsigned*)0x1d00000)#definerULCON1(*(volatileunsigned*)0x1d04000)#definerUCON0(*(volatileunsigned*)0x1d00004)#definerUCON1(*(volatileunsigned*)0x1d04004)#definerUFCON0(*(volatileunsigned*)0x1d00008)#definerUFCON1(*(volatileunsigned*)0x1d04008)#definerUMCON0(*(volatileunsigned*)0x1d0000c)#definerUMCON1(*(volatileunsigned*)0x1d0400c)#definerUTRSTAT0(*(volatileunsigned*)0x1d00010)#definerUTRSTAT1(*(volatileunsigned*)0x1d04010)#definerUERSTAT0(*(volatileunsigned*)0x1d00014)#definerUERSTAT1(*(volatileunsigned*)0x1d04014)#definerUFSTAT0(*(volatileunsigned*)0x1d00018)#definerUFSTAT1(*(volatileunsigned*)0x1d04018)#definerUMSTAT0(*(volatileunsigned*)0x1d0001c)#definerUMSTAT1(*(volatileunsigned*)0x1d0401c)#definerUBRDIV0(*(volatileunsigned*)0x1d00028)#definerUBRDIV1(*(volatileunsigned*)0x1d04028)#ifdef__BIG_ENDIAN〃大端摸式#definerUTXH0(*(volatileunsignedchar*)0x1d00023)#definerUTXH1(*(volatileunsignedchar*)0x1d04023)#definerURXH0(*(volatileunsignedchar*)0x1d00027)#definerURXH1(*(volatileunsignedchar*)0x1d04027)#defineWrUTXH0(ch)(*(volatileunsignedchar*)(0x1d00023))=(unsignedchar)(ch)#defineWrUTXH1(ch)(*(volatileunsignedchar*)(0x1d04023))=(unsignedchar)(ch)#defineRdURXH0()(*(volatileunsignedchar*)(0x1d00027))#defineRdURXH1()(*(volatileunsignedchar*)(0x1d04027))#defineUTXH0(0x1d00020+3)//byte_accessaddressbyBDMA#defineUTXH1(0x1d04020+3)#defineURXH0(0x1d00024+3)#defineURXH1(0x1d04024+3)#else//小端摸式#definerUTXH0(^(volatileunsignedchar*)0x1d00020)#definerUTXH1(*(volatileunsignedchar*)0x1d04020)#definerURXH0(*(volatileunsignedchar*)0x1d00024)#definerURXH1(*(volatileunsignedchar*)0x1d04024)#defineWrUTXH0(ch)(*(volatileunsignedchar*)0x1d00020)=(unsignedchar)(ch)#defineWrUTXH1(ch)(*(volatileunsignedchar*)0x1d04020)=(unsignedchar)(ch)#defineRdURXH0()(*(volatileunsignedchar*)0x1d00024)#defineRdURXH1()(*(volatileunsignedchar*)0x1d04024)#defineUTXH0(0x1d00020)//byte_accessaddressbyBDMA#defineUTXH1(0x1d04020)#defineURXH0(0x1d00024)#defineURXH1(0x1d04024)#endif3.编写串口驱动函数(MyUart.c):图2-4为串口初始化的实现流程。图2-4串口初始化在主函数中实现将从串口0接收到的数据发送到串口0(Main.c):图2-7为主函数流程图。学院(系):电信专业:自动化班级:0804姓名:学号: 组:实验时间: 实验室:实验台:指导教师签字:成绩:实验九uC/OS-II在ARM平台的移植一、 实验目的和要求了解uCOS-II内核的主要结构。掌握将uCOS-II内核移植到ARM920T处理器上的基本方法。二、 实验原理和内容实验原理:所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。虽然uCOS-II的大部分源代码是用C语言写成的,仍需要用C语言和汇编语言完成一些与处理器相关的代码。比如:uCOS-II在读写处理器、寄存器时只能通过汇编语言来实现。因为uCOS-II在设计的时候就已经充分考虑了可移植性,所以,uCOS-II的移植还是比较容易的。要使uCOS-II可以正常工作,处理器必须满足以下要求:处理器的C编译器能产生可重入代码。可重入的代码指的是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据。也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。下面的两个例子可以比较可重入型函数和非可重入型函数:程序1:可重入型函数voidswap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}程序2:非可重入型函数inttemp;voidswap(int*x,int*y){temp=*x;*x=*y;*y=temp;}程序1中使用的是局部变量temp作为变量。通常的C编译器,把局部变量分配在栈中。所以,多次调用同一个函数,可以保证每次的temp互不受影响。而程序2中temp定义的是全局变量,多次调用函数的时候,必然受到影响。代码的可重入性是保证完成多任务的基础,除了在C程序中使用局部变量以外,还需要C编译器的支持。笔者使用的是ARMADS的集成开发环境,均可以生成可重入的代码。在程序中可以打开或者关闭中断。在uCOS-II中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持,在ARM920T的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。处理器支持中断,并且能产生定时中断(通常在10Hz1000Hz之间)。uCOS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。在ARM920T的处理器上可以产生定时器中断。处理器支持能够容纳一定量数据的硬件堆栈。处理器有将堆栈指针和其它CPU寄存器存储和读出到堆栈(或者内存)的指令。uCOS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是uCOS-II多任务调度的基础。图4-1说明7uC/OS的结构以及它与硬件的关系。应用程序软件UC/OS-II(与处理器无关的代码)OS_CORE.C uCOS, II, COS.MBOX.C uCOS II, COSMEM.C OS COS_SEM.C OS_TASK. COS_TIME.CuC/OS-II设置(与应用相关的代码)OS_CFG.HINCLUDES.HuC/OS-H移植(与处理器相关的代码)

OS_CPU.H0S_CUPA.ASM

OS_CPU_C-cARM920T处理器完全满足上述要求。接下来将介绍如何把uCOS-II移植到Samsung公司软件

硬件

的一款ARM920T的嵌入式处理器——S3C2410X上。实验内容:将uC/OS-II内核移植到ARM9微处理器 上。创建两个任务task1、task2,分别向串口输出数据,在超级终端上显示当前正在运行那个任务。三、实验步骤将uCOS-II内核移植到ARM7微处理器上。编写两个简单任务,在超级终端上观察两个任务的切换来测试一下移植是否成功。为了使uCOS-II可以正常运行,除

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论