嵌入式实时操作系统
实习报告
学 院: 电气信息工程学院
专 业: 测控技术与仪器
班 级:
姓 名:
学 号:
指导教师:
嵌入式系统:
在现在日益信息化的社会中,计算机和网络已经全面渗透到日常生活的每一个角落。对于我们每个人,需要的已经不再仅仅是那种放在桌上处理文档,进行工作管理和生产控制的计算机;各种各样的新型嵌入式系统设备在应用数量上已经远远超过通用算机,任何一个普通人可能拥有从大到小的各种使用嵌入式技术的电子产品,小到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日
嵌入式实习报告20xx年1月13日一、嵌入式的概述:随着信息化技术的发展和数字化产品的普及,以计算机技术、芯片技术和软件技术为核心…
嵌入式系统设计实训报告实训报告目录一任务名称内容1二题目分析1三系统平台搭建6四系统设计与实现7五心得体会14六参考文献及资料15…
嵌入式系统实验报告姓名:##学号:##班级:计算机科学与技术非师范121班实验一LCD控制一、实验目的1、初步掌握液晶显示屏的使用…
嵌入式系统实习报告学院专业班级学号姓名指导老师计算机与信息学院电子信息工程20xx111120xx111123王金民严朝军彭文标嵌…
成绩CSIP嵌入式实习报告院系计算机与工程学院专业计算机科学与技术学生姓名学号实习单位指导老师实习时间20xx520xx9本着对嵌…
你好,我是一名嵌入式开发爱好者.近来总是看到很多初学者(多数是在校大学生)由于没有条件,想学习却不知道如何下手。本人绝对能体会到学…
这学期才接触嵌入式系统感觉还称不上入门,我通过学习知道了嵌入式的发展前景很大,各个领域都用到了嵌入式,学好嵌入式不愁没饭吃。广义上…
实习日志20xx年x月x日今天是我来到XX软件有限公司实习的第一天,在公司工作先要进行培训,因此将进行长达4个多月的培训。培训是一…
学习嵌入式系统心得说实在话在没有学习之前,以及在学之前通过一些口中得知这是一门很不错,很有意思的一门课。而且目前是十分吃香的一门课…
实习总结就在昨天3月x日,学校规定实习时间已经到期了。从上个月的13日到现在已经近一个月,虽然与公司的实习时间还没有结束,但是为了…
嵌入式实训总结20xx年x月我参加了学校安排的课题实训,基地在北京,学院安排我们集体坐火车一同前去,浩浩荡荡的队伍开始出发了。刚来…