嵌入式实习报告

嵌入式实时操作系统

         实习报告

    院:  电气信息工程学院 

    业:   测控技术与仪器  

    级:             

     名:            

     号:             

指导教师:            

嵌入式系统:

   

在现在日益信息化的社会中,计算机和网络已经全面渗透到日常生活的每一个角落。对于我们每个人,需要的已经不再仅仅是那种放在桌上处理文档,进行工作管理和生产控制的计算机;各种各样的新型嵌入式系统设备在应用数量上已经远远超过通用算机,任何一个普通人可能拥有从大到小的各种使用嵌入式技术的电子产品,小到mp3,PDA等微型数字化产品,大到网络家电,智能家电,车载电子设备。而在工业和服务领域中,使用嵌入式技术的数字机床,智能工具,工业机器人,服务机器人也将逐渐改变传统的工业和服务方式。

目前嵌入式系统技术已经成为了最热门的技术之一,吸引了大批的优秀人才投入其中。但是对于何为嵌入式系统,什么样的技术又可以称之为嵌入式技术,仍在讨论之中。
    广义上讲,可以认为凡是带有微处理器的专用软硬件系统都可以称为嵌入式系统。作为系统核心的微处理器又包括三类:微控制器(MCU)、数字信号处理器(DSP)、嵌入式微处理器(MPU)。所以有人简单的说:“嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。”还有人认为嵌入式系统就是“以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”。应该说后者从功能应用特征上比较好的给出了嵌入式系统的定义,嵌入式的概念的分析根本上应该从应用上加以切入。
    狭义上讲,人们更加强调那些使用嵌入式微处理器构成独立系统,具有自己的操作系统并且具有某些特定功能的系统,这里的微处理器专指32位以上的微处理器。按照这种定义,典型的嵌入式系统有使用x86的小型嵌入式工控主板,在各种自动化设备,数字机械产品中有非常广阔的应用空间;另外一大类是使用Intel,Motorola等专用芯片构成的小系统,它不仅仅在新兴的消费电子和通讯仪表等方面获得了巨大的发展应用空间,而且甚至有趋势取代传统的工控机。现在大家更加清楚的看到:嵌入式技术的春天已经来了。所以也就难怪嵌入式系统成为当前最热门的技术之一。

实习目的:

1.  了解嵌入式操作系统

2.  学会用uc/os-Ⅱ级编写调试

3.  熟练运用visal c ++ 进行C语言编程

实习内容:

题目一、

建立4个任务,其中任务1显示院系,任务2显示班级学号,任务3显示姓名,任务4显示当前日期和时间。

题目二、

建立2个任务,其中任务1完成如下运算:1!+2!+3!+。。。+10!,并把运算结果通过消息传输机制发送给任务2。任务2将运行结果显示出来。

程序内容:

/*

*********************************************************************************************************

*                                                uC/OS-II

*                                          The Real-Time Kernel

*

*                           (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL

*                                           All Rights Reserved

*

*                                               EXAMPLE #1

*********************************************************************************************************

*/

#include    <stdio.h>

#include    <string.h>

#include    <ctype.h>

#include    <stdlib.h>

#include    <conio.h>

#include    <dos.h>

#include    <setjmp.h>

#include    "E:\ucos-ii\software\ucos-ii\ix86l\bc45\os_cpu.h"

#include    "E:\ucos-ii\SOFTWARE\uCOS-II\EX1_x86L\BC45\SOURCE\os_cfg.h"

#include    "E:\ucos-ii\software\ucos-ii\source\ucos_ii.h"

#include    "E:\ucos-ii\software\blocks\pc\bc45\pc.h"

/*

*********************************************************************************************************

*                                               CONSTANTS

*********************************************************************************************************

*/

#define  TASK_STK_SIZE                 1024       /* Size of each task's stacks (# of WORDs)            */

#define  N_TASKS                        4       /* Number of identical tasks                          */

/*

*********************************************************************************************************

*                                               VARIABLES

*********************************************************************************************************

*/

OS_STK        TaskStk[N_TASKS][TASK_STK_SIZE];        /* Tasks stacks                                  */

OS_STK        TaskStartStk[TASK_STK_SIZE];

char          TaskData[N_TASKS];                      /* Parameters to pass to each task               */

OS_EVENT     *RandomSem;

/*

*********************************************************************************************************

*                                           FUNCTION PROTOTYPES

*********************************************************************************************************

*/

        void  Task(void *data);                       /* Function prototypes of tasks                  */

        void  TaskStart(void *data);                  /* Function prototypes of Startup task           */

static  void  TaskStartCreateTasks(void);

static  void  TaskStartDispInit(void);

static  void  TaskStartDisp(void);

        OS_STK Task1[1024];

              OS_STK Task2[1024];

              OS_STK Task3[1024];

              OS_STK Task4[1024];

/*$PAGE*/

/*

*********************************************************************************************************

*                                                MAIN

*********************************************************************************************************

*/

void  main (void)

{

    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* Clear the screen                         */

    OSInit();                                              /* Initialize uC/OS-II                      */

    PC_DOSSaveReturn();                                    /* Save environment to return to DOS        */

    PC_VectSet(uCOS, OSCtxSw);                             /* Install uC/OS-II's context switch vector */

   /*

    RandomSem   = OSSemCreate(1);

  */                                                       /* Random number semaphore                  */

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);

    OSStart();                                             /* Start multitasking                       */

}

/*

*********************************************************************************************************

*                                              STARTUP TASK

*********************************************************************************************************

*/

//void  TaskStart (void *pdata)

//{

//#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */

    //OS_CPU_SR  cpu_sr;

//#endif

    //char       s[100];

    //INT16S     key;

    //pdata = pdata;                                         /* Prevent compiler warning                 */

    //TaskStartDispInit();                                   /* Initialize the display                   */

    //OS_ENTER_CRITICAL();

    //PC_VectSet(0x08, OSTickISR);                           /* Install uC/OS-II's clock tick ISR        */

    //PC_SetTickRate(OS_TICKS_PER_SEC);                      /* Reprogram tick rate                      */

    //OS_EXIT_CRITICAL();

    //OSStatInit();                                          /* Initialize uC/OS-II's statistics         */

    //TaskStartCreateTasks();                                /* Create all the application tasks         */

    //for (;;)

       //{

        //TaskStartDisp();                                  /* Update the display                       */

        //if (PC_GetKey(&key) == TRUE)

              //{                     /* See if key has been pressed              */

            //if (key == 0x1B)

                     //{                             /* Yes, see if it's the ESCAPE key          */

                //PC_DOSReturn();                            /* Return to DOS                            */

            //}

        //}

        //OSCtxSwCtr = 0;                                    /* Clear context switch counter             */

        //OSTimeDlyHMSM(0, 0, 1, 0);                         /* Wait one second                          */

    //}

//}

/*$PAGE*/

/*

*********************************************************************************************************

*                                        INITIALIZE THE DISPLAY

*********************************************************************************************************

*/

static  void  TaskStartDispInit (void)

{                                                                                                                            

                                          

/*                                1111111111222222222233333333334444444444555555555566666666667777777777 */

/*                      01234567890123456789012345678901234567890123456789012345678901234567890123456789 */

 PC_DispStr( 0,0, "       uC/OS-II, The Real-Time Kernel                         ",DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);

  PC_DispStr( 0,  1, "                                  J ean J. Labrosse                              ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,2,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr( 0,  3, "                                    EXAMPLE #1                             ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,4,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,5"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,6,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,7,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,8,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,9,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,10,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,11,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,12,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,13,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,14,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,15,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,16,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,17,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,18,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,19,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,20,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

  PC_DispStr(0,21,"                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr( 0, 22, "                                  <-PRESS 'ESC' TO QUIT->          ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);

/*                                1111111111222222222233333333334444444444555555555566666666667777777777 */

/*                      01234567890123456789012345678901234567890123456789012345678901234567890123456789 */

}

/*$PAGE*//*

*********************************************************************************************************

*                                           UPDATE THE DISPLAY

*********************************************************************************************************

*/

/*

    static  void  TaskStartDisp (void)

   {

    char   s[80];

    //sprintf(s, "%5d", OSTaskCtr);                                  /* Display #tasks running               */

    //PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);

//#if OS_TASK_STAT_EN > 0

    //sprintf(s, "%3d", OSCPUUsage);                                 /* Display CPU usage in %               */

   // PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);

//#endif

    //sprintf(s, "%5d", OSCtxSwCtr);                                 /* Display #context switches per second */

    //PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);

    //sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* Display uC/OS-II's version number    */

    //PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);

    //switch (_8087) {                                               /* Display whether FPU present          */

       // case 0:

            // PC_DispStr(71, 22, " NO  FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE);

            //break;

       // case 1:

            // PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);

            // break;

       // case 2:

             //PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);

            // break;

       // case 3:

            // PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);

            // break;

   // }

//}

/*$PAGE*/

/*

*********************************************************************************************************

*                                             CREATE TASKS

*********************************************************************************************************

*/

static  void  TaskStartCreateTasks (void)

{

    INT8U err;

       OSInit();

                      OSTaskCreate(Task1, (void *)0, &Task1[TASK_STK_SIZE-1], 1);

                            OSTaskCreate(Task2, (void *)0, &Task2[TASK_STK_SIZE-1], 2);

                OSTaskCreate(Task3, (void *)0, &Task3[TASK_STK_SIZE-1], 3);

                            OSTsakCreate(Task4, (void *)0, &Task4[TASK_STK_SIZE-1], 4);

    }

/*

*********************************************************************************************************

*                                                  TASKS

*********************************************************************************************************

*/

void  Task (void *pdata)

{

    INT8U  x;

    INT8U  y;

    INT8U  err;

    for (;;) {

        OSSemPend(RandomSem, 0, &err);           /* Acquire semaphore to perform random numbers        */

        x = random(80);                          /* Find X position where task number will appear      */

        y = random(16);                          /* Find Y position where task number will appear      */

        //OSSemPost(RandomSem);                    /* Release semaphore                                  */

                                                 /* Display the task number on the screen              */

        PC_DispChar(x, y + 5, *(char *)pdata, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

         PC_DispStr( 0,  5, "      dianqixinxigongchengxueyuan  cekongjishuyuyiqi  ", DISP_FGND_BLACK +

DISP_BGND_LIGHT_GRAY);

        PC_DispStr( 0,  6, "           09_1    28                     ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

              PC_DispStr( 0,  7, "           wumeng                     ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        PC_DispStr( 0,  8, "           20##-10-29                     ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        OSTimeDly(1);                            /* Delay 1 clock tick                                 */

    }

}

程序调试

1、修改TSET.MAK的地址

2,修改borlandc地址

3、找到头文件地址

4,程序编译,运行

实习心得:

一周的嵌入式实习中,我学到了许多书本上学不到的知识,本以为十分枯燥的设计过程却让我得到了很多乐趣,同时也为我今后的进一步学习奠定了基础。

当老师布置完题目后,由于对需要掌握的知识还不是十分理解,于是我通过看教材和查资料等方式初步掌握了嵌入式系统的基本知识,并最终在老师以及同学们的帮助下成功地完成了整个系统的设计。

在设计的过程中编程部分是个难点,编程的过程中我们遇到了很多的问题,比如说当我把之前设计出的基本模块整合在一起的时候,出现了很多错误,但是在经过细致的分析整个程序后,通过进一步的修正,程序才运行正常。这个问题也提醒我们在编程的时候需要细心和耐心,这样才不会出现一些马虎的错误。

     经过这次的实际动手操作,让我明白不仅要充分的掌握课本上的知识,而且要活学活用、学以致用,不能过分强调基本理论的掌握,而应该侧重于基本知识和实际的相结合,我觉得,具有一定的系统分析能力和设计能力才是本次实习的目的。

本次实习使我把学到的理论知识和实际的硬件相结合,对嵌入式系统这门课程有了新的理解和认识,这对于我今后的学习会有事半功倍的效果。非常感谢本次实习给了我这样一个锻炼我的机会,在此也感谢老师对我的指导!

最后,祝老师事业顺利,身体健康!

                                            20##年11月11日

相关推荐