嵌入式系统实习报告

目录

一、                引言

二、                课题设计

1、                     嵌入式系统

1、1嵌入式系统概述

1、2嵌入式操作系统

2、STC15F2K60S2硬件平台

3、UCOSII操作系统

4、基于STC15F2K60S2单片机的UCOSII的移植 对移植进行介绍

5、UCOSII应用软件设计

(1)流程图

(2)代码附录

6、调试过程

(1)测试数据

(2)数据分析

三、结论


一、引言

进入20世纪90年代,嵌入式技术全面展开,目前已成为通信和消费类产品的共同发展方向。在通信领域,数字技术正在全面取代模拟技术。在广播电视领域,欧洲的DVB(数字电视广播)技术已在全球大多数国家推广。而软件、集成电路和新型元器件在产业发展中的作用日益重要。所有上述产品中,都离不开嵌入式系统技术。在个人领域中,嵌入式产品将主要是个人商用,作为个人移动的数据处理和通讯软件。由于嵌入式设备具有自然的人机交互界面,GUI屏幕为中心的多媒体界面给人很大的亲和力。手写文字输入、语音拨号上网、收发电子邮件以及彩色图形、图像已取得初步成效。  

目前一些先进的PDA在显示屏幕上已实现汉字写入、短消息语音发布,日用范围也将日益广阔。对于企业专用解决方案,如物流管理、条码扫描、移动信息采集等,这种小型手持嵌入式系统将发挥巨大的作用。自动控制领域,不仅可以用于ATM机,自动售货机,工业控制等专用设备,和移动通讯设备结合、GPS、娱乐相结合,嵌入式系统同样可以发挥巨大的作用。  硬件方面,不仅有各大公司的微处理器芯片,还有用于学习和研发的各种配套开发包。目前低层系统和硬件平台经过若干年的研究,已经相对比较成熟,实现各种功能的芯片应有尽有。而且巨大的市场需求给我们提供了学习研发的资金和技术力量。  

从软件方面讲,也有相当部分的成熟软件系统。国外商品化的嵌入式实时操作系统,已进入我国市场的有WindRiver、Microsoft、QNX和Nuclear等产品。我国自主开发的嵌入式系统软件产品如科银(CoreTek)公司的嵌入式软件开发平台DeltaSystem,中科院推出的Hopen嵌入式操作系统。

二、   课题设计

1嵌入式系统

11嵌入式系统概述

通常,计算机连同一些常规的外设是作为独立的系统而存在的,而并非为某一方面的专门应用而存在。所以,人们把这样的计算机系统称为“通用”计算机系统。但是有些系统却不是这样。例如,医用的CT扫描仪也是一个系统,里面有计算机,但是这种计算机(或处理器)是作为某个专用系统中的一个部件而存在的,其本身的存在并非目的而只是手段。像这样“嵌入”到更大的、专用的系统中的计算机系统,就称之为“嵌入式计算机”、“嵌入式计算机系统”或“嵌入式系统”。从字面上讲,后者似乎比前者更为广义,因为系统中常常还包括一些机电、光电、热电或者电化的执行部件,但是实际上却往往不作严格的区分。在不致引起混淆的情况下,一般把这三者用作同义词,并且一般总是指系统中的核心部分,即嵌入在系统中的计算机。 

所谓将计算机“嵌入”到系统中,一般并不是指直接把一台通用计算机原封不动地安装到目标系统中,也不只是简单地把原有的机壳拆掉并安装到机壳中,而是指为目标系统构筑起合适的计算机系统,再把它有机地植入、甚至融入目标系统。 

虽然嵌入式系统在工业、服务业、消费电子等领域的应用范围不断扩大,且已渗透到人们日常生活的方方面面,但是依然很难给它下一个明确的定义。嵌入式系统本身是一个外延很广的名词,凡是与产品结合在一起的、具有嵌入式特点的控制系统都可以叫做嵌入式系统。国际电工与电子工程师协会(即IEEE)曾经把嵌入式系统定义为“控制、监视或者辅助设备、机器和车间运行的装置”。显然该定义具有突出的应用色彩,不过现在看来,似乎并未充分体现嵌入式系统现今的学术内涵。目前国内普遍认同的嵌入式系统的定义是“嵌入式系统是将计算机嵌入到某个应用系统内的一种计算机体系结构形式”。换言之,嵌入式系统是以应用为中心,以计算机技术为基础,软硬件能灵活变化以适应所嵌入的应用系统,对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。简言之,嵌入式系统就是嵌入式计算机系统的简称。 

在嵌入式操作系统迅速发展的同时,系统芯片的制造与设计技术也在不断进步。系统芯片就是把一个完整的最终产品的主要功能单元集成到一块或一组大规模集成电路芯片上,这是现代集成电路工艺技术——深亚微米技术迅速发展的必然结果。系统芯片制造技术发展主要体现在硅圆片的尺寸逐渐增大,硅晶片的特征线宽逐步减小,同时芯片的集成度不断提高。系统芯片技术的发展,使得嵌入式系统硬件进一步向微型化、高集成化发展,从而为嵌入式系统的应用开辟更为广阔的天地。

12嵌入式操作系统

从硬件上,将基于CPU的处围器件,整合到CPU芯片内部,比如早期基于X86体系结构下的计算机,CPU只是有运算器和累加器的功能,一切芯片要造外部桥路来扩展实现,象串口之类的都是靠外部的16C550/2的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到CPU内部,还有PC机有显卡,而多数嵌入式处理器都带有LCD控制器,但其种意义上就相当于显卡。比较高端的ARM类Intel Xscale架构下的IXP网络处理器CPU内部集成PCI控制器(可配成支持4个PCI从设备或配成自身为CPI从设备);还集成3个NPE网络处理器引擎,其中两个对应于两个MAC地址, 可用于网关交换用,而另外一个NPE网络处理器引擎支持DSL,只要外面再加个PHY芯片即可以实现DSL上网功能。IXP系列最高主频可以达到 1.8G,支持2G内存,1G×10或10G×1的以太网口或Febre channel的光通道。IXP系列应该是目标基于ARM体系统结构下由 intel进行整合后成Xscale内核的最高的处理器了。   

  从软件上看,就是在定制操作系统内核里将应用一并选入,编译后将内核下载到ROM中。而在定制操作系统内核时所选择的应用程序组 件就是完成了软件的“嵌入”,比如WinCE在内核定制时,会有相应选择,其中就是wordpad,PDF,MediaPlay等等选择,如果我们选择 了,在CE启动后,就可以在界面中找到这些东西,如果是以前PC上将的windows操作系统,多半的东西都需要我们得新再装。   

   把软件内核或应用文件系统等东西烧到嵌入式系统硬件平台中的ROM中就实现了一个真正的“嵌入”。,

2STC15F2K60S2硬件平台

STC15为 1T单片机 即晶振速度既是主频速度

工作电压  STC15F2K60S2   5V单片机   5.5v-3.8v

60K flash  存储空间

2048字节  即2K   SRAM

1K  EEPROM存储空间

8通道10位高速ADC  速度可达 30万次/秒    3路PWM还可当3路D/A使用

共3通道捕获/比较单元(CCP/PWM/PCA)

内部高可靠复位   8级可选择复位门槛电压    可省去外部复位电路

 支持内部高精度R/C时钟 ,可选择(5.5296MHz、11.0592MHz、22.1184MHz、33.1776MHz)

两组高速异步串行通信端口(可同时使用)即双串口 可在5组管脚之间进行切换  分时复用可当5组串口使用!

一组高速异步串行SPI总线  在读SD卡  NRF24L01  flash芯片 即扩展IO等 均可使用

低功耗设计:  低速模式,空闲模式,掉电模式/停机模式

共6个定时器/计数器 3个16位可重装载定时器/计数器(T0/T1/T2  其中T0/T1兼容普通8051的定时器/计数器),并均可独立实现对外可编程时钟输出(3通道),3路CPP/PWM/PCA还可再实现3个定时器。

可编程时钟输出功能(对内部系统时钟或对外部管脚的时钟输入进行时钟分频输出)

硬件看门狗(WDT)

先进的指令集结构 兼容普通8051指令集 有硬件乘法/除非指令

42个通用I/O口  复位后为:准双向口/弱上拉(普通8051传统I/O口)可设置四种模式。

STC15F2K60S2的最小系统板,具体资源及系统板电路如下图,具体可参考相关资料资料。

3UCOSII操作系统

uC/OSii是一个完成的,可移植、可固化、可裁减的抢占式实时多任务操作系统内核。主要用于ANSI的   C语言编写,少部分代码是汇编语言。uC/OS主要有以下特点:

(1)可移植性  可以移植到多个CPU上,包括三菱单片机。

(2)可固化  可以固化到嵌入式系统中

(3)可裁减  可以定制uC/OS,使用少量的系统服务

(4)可剥夺行  uC/OS是完全可剥夺的实时内核,uC/OS总是运行优先级最高的就绪任务。

(5)多任务运行  uC/OS可管理最多64个任务。不支持时间片轮转调度法,所以要求每个任务的优先级不一样。

(6)可确定性  uC/OS的函数调用和系统服务的执行时间可以确定。

(7)任务栈,而且每个任务栈空间的大小可以不一样

(8)系统服务  uC/OS有很多系统服务,如信号量、时间标志、消息邮箱、消息队列、时间管理等等。

4、基于STC15F2K60S2单片机的UCOSII的移植对移植进行介绍

移植就是使UCOSII能在VRS51上运行。为了方便移植,大部分的UCOSII的代码是用C语言编写的;但是仍需要用C语言和汇编语言编写一些处理器硬件相关的代码,这是因为UCOSII在读/写处理器寄存器时,只能通过汇编语言来实现。在了解了微处理器和Keil C51编译器的技术细节的基础上,就可以开始UCOSII源文件移植的工作了。真正编写移植代码的工作就相对比较简单了

要使µC/OS-Ⅱ正常运行,处理器必须满足以下要求:

处理器的C编译器能产生可重入代码。

用C语言就可以打开和关闭中断。

处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。

处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。

处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令

5UCOSII应用软件设计

1)流程图

2)代码附录

#include "includes.h"

//运行灯

sbit LED1 = P3^2;

sbit LED2 = P5^5;

//定义任务堆栈

OS_STK Task1Stk[MaxStkSize+1];             

OS_STK Task2Stk[MaxStkSize+1];

OS_STK Task3Stk[MaxStkSize+1];

//变量

//OS_EVENT* FirstSem;

INT8U err;

void InitTime0(void) reentrant

{      TMOD &= 0xF0;

       TMOD |= 0x01;   //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器

//  TH0 = 0xDC;     //定义Tick=100次/秒(即0.01秒/次),TH,TL值与CPU的频率有关(11.0592M)

//  TL0 = 0x00;       //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系

    TR0  = 1;          //必须启动}

// 硬件看门狗

void Feed_WDT(void) reentrant

{     WDT_CONTR = 0x3f; //EN_WDT=1,CLR_WDT=1,IDLE_WDT=0,PS2=0,PS1=0,PS0=0

       H_DOG = ~H_DOG;}

void Task1(void *ppdata) reentrant

{     ppdata = ppdata;

       ET0 = 1;       //根任务开时钟节拍中断 重要!!!!!!!!!!!!!!!!!!!!!!!!

       for(;;)    {

              LED1 = ~LED1;

        OSTimeDly(OS_TICKS_PER_SEC);  //延时1s

              //OSSemPost(FirstSem);       } }

void Task2(void *ppdata) reentrant

{     ppdata=ppdata;

       while(1)    {

              Process_Uart();

              LED2=~LED2;

              OSTimeDly(OS_TICKS_PER_SEC/20);

              Feed_WDT();    }  }

void Task3(void *ppdata) reentrant

{     ppdata=ppdata;

       for(;;)         {

//            OSTimeDlyHMSM(0,0,10,0);

           LCD1602_write_string(LCD1602_LINE1,0,"Welcome to you");

        LCD1602_write_string(LCD1602_LINE2,0,"Come in UC_OSII");

              OSTimeDly(OS_TICKS_PER_SEC);    }  }

void main(void)

{    initial_lcd1602();

       OSInit();

       InitTime0();      

       InitSerial();

       Feed_WDT();

//     FirstSem=OSSemCreate(0);//定义一个信号量

       OSTaskCreate(Task1,(void*)0,&Task1Stk[0],0);  //优先级

       OSTaskCreate(Task2,(void*)0,&Task2Stk[0],1);

       OSTaskCreate(Task3,(void*)0,&Task3Stk[0],4);

       OSStart();}

6、调试过程

1)测试数据

#include "includes.h"

sbit LED1 = P3^2;

sbit LED2 = P5^5;

OS_STK Task1Stk[MaxStkSize+1];           

OS_STK Task2Stk[MaxStkSize+1];

OS_STK Task3Stk[MaxStkSize+1];

OS_STK Task4Stk[MaxStkSize+1];

INT8U err;

void InitTime0(void) reentrant

{  

    TMOD &= 0xF0;

       TMOD |= 0x01;    TR0  = 1;            }

void Feed_WDT(void) reentrant

{

       WDT_CONTR = 0x3f;

       H_DOG = ~H_DOG;

}

void Task1(void *ppdata) reentrant

{

       ppdata = ppdata;

       ET0 = 1;       //

       for(;;)

    {

              LED1 = ~LED1;

        OSTimeDly(OS_TICKS_PER_SEC);     }   

}

void Task2(void *ppdata) reentrant

{

       ppdata=ppdata;

       while(1)

    {

              Process_Uart();

              LED2=~LED2;

              OSTimeDly(OS_TICKS_PER_SEC/2);

              Feed_WDT();

    }   

}

void Task3(void *ppdata) reentrant

{

       ppdata=ppdata;

       for(;;)                                                     

    {

           LCD1602_write_string(LCD1602_LINE1,0,"Welcome");

        LCD1602_write_string(LCD1602_LINE2,0,"Come in UC_OSII");

              OSTimeDly(OS_TICKS_PER_SEC);

    }   

}

void Task4(void *ppdata) reentrant

{

       ppdata=ppdata;                                     

       for(;;)                                                     

    {

              OSTimeDly(OS_TICKS_PER_SEC);

    }

}

void main(void)

{

      initial_lcd1602();

       OSInit();

       InitTime0();      

       InitSerial();

       Feed_WDT();

       OSTaskCreate(Task1,(void*)0,&Task1Stk[0],0); OSTaskCreate(Task2,(void*)0,&Task2Stk[0],1);

       OSTaskCreate(Task3,(void*)0,&Task3Stk[0],4);

       OSTaskCreate(Task4,(void*)0,&Task4Stk[0],5);

       OSStart();

}

三、结论

通过本次为期三周的嵌入式系统实习,在本次实习中,我收获甚多,我从一开始拿着硬件的不知从何入手到后面慢慢通过实习指导书,通过一个个实例懂得了一些基本的原理。通过实习明白如何对UCOSII系统进行移植。如何把已开发好的应用程序移植后的系统中运行,除此之外,经过本次实习,还对以前所学的《嵌入式系统》、《C语言程序设计》、《单片机应用系统设计》、《微机原理》等课程的知识起到了巩固的作用,但是由于以前的实习都是偏软件居多,这次实习是第一接触硬件,所以有很多方面还是需要继续提高!

相关推荐