嵌入式课程设计.docx

上传人:b****6 文档编号:5181504 上传时间:2022-12-13 格式:DOCX 页数:8 大小:190.55KB
下载 相关 举报
嵌入式课程设计.docx_第1页
第1页 / 共8页
嵌入式课程设计.docx_第2页
第2页 / 共8页
嵌入式课程设计.docx_第3页
第3页 / 共8页
嵌入式课程设计.docx_第4页
第4页 / 共8页
嵌入式课程设计.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

嵌入式课程设计.docx

《嵌入式课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计.docx(8页珍藏版)》请在冰豆网上搜索。

嵌入式课程设计.docx

嵌入式课程设计

嵌入式操作系统的移植和应用

课程设计报告

院系:

自动化学院

班级:

自动化100X班

学生:

电话:

 

(1)实验选题:

LCD显示字符与LED流水灯并行执行,KEY控制LED流水模式切换。

(2)实验目的:

通过本课程学习,使学生掌握嵌入式操作系统基本知识,了解系统移植和使用的基本方法,软件和硬件结合,培养学生动手解决实际问题能力。

(3)实验要求:

1.根据设计题目要求的指标,查阅相关资料;

2.确定开发技术,熟悉、掌握相关开发工具,包括:

HEW集成开发环境、M16C开发板使用、u/Cos嵌入式操作系统移植,按所选课题实现任务测试;

3.编写本课程设计报告。

(四)实验原理:

嵌入式系统:

定义为以应用为中心、计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积功耗严格要求的专用计算机系统。

IEEE对嵌入式系统的定义为:

嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”(devicesusedtocontrol、monitor、orassisttheoperationofequipment、machineryorplants)

操作系统:

是计算机系统中的一个系统软件,它是这样一些程序模块的集合----它们能有效地组织和管理计算机系统中的硬件及软件资源,合理地组织计算机工作流程,控制程序的执行,并向用户提供各种服务功能,使得用户能够灵活、方便、有效地使用计算机,并使整个计算机系统能高效地运行。

并发性:

所谓“并发性”是指在计算机系统中同时运行着多个程序。

程序的并发性具体体现在两个方面:

用户程序与用户程序之间并发执行,用户程序与操作系统程序之间并发执行。

共享性:

所谓资源“共享性”是指操作系统程序与多个用户程序共用系统中的各种资源。

这种共享是在操作系统的控制下实现的。

这种共享包括几个方面的内容:

1)操作系统要管理并发程序对处理器资源的共享,即在多个并发程序间通过调度来分配处理器时间。

2)操作系统要负责管理对主存和外存的共享使用,并且保证对系统数据共享的正确性和数据的完整性。

3)操作系统要管理各种外部设备的共享使用。

嵌入式(实时)操作系统:

用于嵌入式设备的操作系统,具有通用操作系统的基本特点,又具有系统实时性、硬件的相关依赖性、软件固态化以及应用的专用性等优点。

嵌入式(实时)操作系统通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器Browser等。

嵌入式(实时)操作系统的重要指标:

实时性(中断响应时间、任务切换时间等)、尺寸(可裁剪性)、可扩展性(内核、中间件)。

如下图所示:

μC/OS-II:

是美国一个名为JeanLabrosse的工程师开发的实时操作系统。

它以小内核、多任务、丰富的系统服务等特点越来越受欢迎;它具有

可移植性:

绝大部分的μC/OS-II的源代码是用一致性强的ANSIC写的。

和微处理器应将相关的那部分使用汇编语言编写,并且已经压到最低限度。

可在绝大多数8位、16位、32位、64位微处理器、微控制器,数字信号处理器(DSP)上运行。

可裁剪:

用户可以再使用程序中通过语句#define定义所需的μC/OS-II功能模块,以减少不必要的存储器空间开支。

占先式:

属于完全占先式的实时内核,意味着μC/OS-II总是运行就绪条件下的最高优先级任务。

多任务:

可以管理64个任务,支持56个用户任务。

赋予每个任务的优先级必须是不相同的,不支持时间片轮转调度法。

中断管理:

中断可以使正在执行的任务暂时挂起。

如果优先级高的任务被唤醒,则高优先级的任务在中断嵌套中全部退出后立即执行,中断嵌套可达255层。

其他特点:

公开源代码、可固化、可确定性、任务栈、体统很多系统服务、稳定性和可靠性强。

μC/OS-II提供的系统服务:

信号量,带互斥机制的信号量(减少优先级倒置问题),事件标志,消息邮箱,消息队列,内存管理,时钟管理,任务管理。

M16C/62:

单片机采用高性能硅栅CMOS工艺,是M16C/60系列单片机中的一种.它具有和所有M16C/60系列单片机一样的CPU内核,采用100脚塑料封装QFP。

数据寄存器(R0,R1,R2,R3):

这四个寄存器为16位寄存器.根据命令语句可以作为8位或32位寄存器用.

地址寄存器(A0,A1):

A0,A1为具有和数据寄存器相同功能的16位寄存器,可用作相对寻址或间接寻址中的地址寄存器.

帧基址寄存器(FB):

FB为16位寄存器,使用于帧相对寻址.

程序计数器(PC):

PC由20位组成,指示执行命令的地址

中断表格寄存器(INTB):

它由20位组成,指示有中断向量表的初始地址

堆栈指针(USP/ISP):

由16位组成,有用户堆栈指针(USP)和中断堆栈指针(ISP)两种.用堆栈指针选择标志,可设定使用其中的一种.

启动程序的任务:

为了使编好的程序能正常工作在执行程序前需先对单片机进行初始化,并设置堆栈,这些处理通常不是用C语言编写的,而是用汇编语言写的,单独构成“启动程序”,NC30的启动程序为“ncrt30.a30”和“sect30.inc”。

功能如下:

1.划定堆栈的位置

2.单片机的初始化位置

3.初始化静态变量区

4.设置中断表格寄存器“INTB”

5.调用main函数

6.设置中断矢量表

 

(五)实验内容:

我在学习了何顶新老师嵌入式理论课程的基础上,自己动手查阅相关资料和书籍,参考学长们的代码,边学边做,一步步完成课程设计。

我选择的是第一个题目,LCD和LED并行执行,LCD显示LED灯所代表的的8421BCD码数值和流水灯模式,按键控制LED流水灯模式。

程序流程:

OSTaskCreate(Led,NULL,&TaskLedStk[TASK_STK_SIZE-1],5);

OSTaskCreate(Lcd,NULL,&TaskLcdStk[TASK_STK_SIZE-1],6);

OSTaskCreate(Key,NULL,&TaskKeyStk[TASK_STK_SIZE-1],7);

说明:

LED流水灯是最高优先级,按键KEY是最低优先级。

①当LED灯输出结束时,LED程序挂起。

②Lcd开始显示Led流水灯当前数值和加减计数方式。

加计数用+表示,减计数用-表示。

显示完毕以后,Lcd程序挂起,执行按键Key中断响应程序。

③Key按键控制Led灯显示方式,一号按键表示+计数方式,二号按键表示-计数方式。

④按键Key一直运行,直到更高优先级的Lcd或者Led程序结束挂起。

 

(6)核心代码

OS_STKTaskLedStk[TASK_STK_SIZE];//分配堆栈

OS_STKTaskLcdStk[TASK_STK_SIZE];

OS_STKTaskKeyStk[TASK_STK_SIZE];

 

voidmain()

{

/*---------------------------硬件初始化------------------------*/

hardware_init();

/*---------------------------uCOS初始化------------------------*/

OSInit();

/*---------------------------uCOS创建任务----------------------*/

OSTaskCreate(Led,NULL,&TaskLedStk[TASK_STK_SIZE-1],5);

OSTaskCreate(Lcd,NULL,&TaskLcdStk[TASK_STK_SIZE-1],6);

OSTaskCreate(Key,NULL,&TaskKeyStk[TASK_STK_SIZE-1],7);

/*---------------------------uCOS任务运行----------------------*/

OSStart();

}

 

voidLed(void*pdata)

{

unsignedcharitemp=0x10;

while

(1)

{

if(key_mode==1)///模式1.加计数

{

for(;(itemp<0xA0)&(key_mode==1);itemp=itemp+0x10){

p9=LEDPORT|itemp;

LED_OUT();

fflag=itemp;//记录此时的led数值

OSTimeDlyHMSM(0,0,7,0);//程序挂起7s

}

if((itemp>=0xA0)|(itemp<=0x00))

itemp=0x10;//计数复原

if(key_mode==2)//按键更改计数方式后对计数值进行处理

itemp=itemp-0x20;

}

elseif(key_mode==2)//模式2减计数

{

for(;(itemp>0x00)&(key_mode==2);itemp=itemp-0x10){

p9=LEDPORT|itemp;

LED_OUT();

fflag=itemp;

OSTimeDlyHMSM(0,0,7,0);

}

if((itemp>=0xA0)|(itemp<=0x00))

itemp=0x90;

if(key_mode==1)

itemp=itemp+0x20;

}

}

}

voidKey(void*pdata)

{

while

(1)

{

if(g_KeyFlag==1)/*ifthekeyinterruptflagis1*/

{

switch(WaitKeyPress())

{

caseKEY1:

//LED1_ON();/*LED1on*/

key_mode=1;

break;

caseKEY2:

//LED2_ON();/*LED2on*/

key_mode=2;

break;

caseKEY3:

//LED3_ON();/*LED3on*/

//key_mode=3;

break;

caseKEY4:

//LED4_ON();/*LED4on*/

//key_mode=4;

break;

default:

break;

}

LED_OUT();

g_KeyFlag=0;/*Clearthekeyinterruptflag*/

//OSTimeDlyHMSM(0,0,0,200);

}

}

}

voidLcd(void*pdata)

{

while

(1)

{

unsignedcharff;

unsignedcharfm;

if((ff!

=fflag)|(fm!

=key_mode))

{

if(ff!

=fflag)

fflag=fflag>>4;//将fflag缩小到0-15

f=fflag;

fm=key_mode;

LcdInit();

BufferPixelStuff(2,'N',26,16,5,7);

BufferPixelStuff(2,'O',34,16,5,7);//显示NO.

BufferPixelStuff(2,fm*2+41,41,16,5,7);//显示+-号

BufferPixelStuff(2,':

',48,16,5,7);

BufferPixelStuff(2,ff+48,54,16,5,7);

CommitBuffer();

LCD_ENABLE();

}

//LcdSetContrast(127);

OSTimeDlyHMSM(0,0,0,500);//延时使液晶稳定显示

}

}

(7)实验总结

通过这次课程设计,我将课堂上学到的理论知识运用到实践,加深了对嵌入式程序设计的理解,为以后嵌入式的使用打下了基础。

我在课程设计的过程中,遇到了很多困难,比如LCD的显示等。

通过查阅相关资料和书籍,慢慢了解了其中的原理,并逐渐解决了遇到的LCD显示的问题。

不怕困难,从陌生到熟悉,慢慢学习总有收获。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1