嵌入式系统实验二

嵌入式系统实验二
嵌入式系统实验二

实验二嵌入式操作系统程序设计

班级:0810805 姓名:谭明李学号:08200515

一、实验目的

1.了解μC/OS-Ⅱ内核的主要结构。

2.掌握μC/OS-Ⅱ程序设计的基本方法。

3.学习使用嵌入式系统绘图的API 函数。理解绘图设备上下文(DC)在多任务操作系统中的作用。会使用绘图设备上下文(DC)在屏幕上绘制一个圆角矩形和一个圆。

了解绘制动画防止闪烁的基本原理,可以实现无闪烁的动画。

4.学习使用系统的消息循环。掌握如何通过系统的消息循环来响应键盘任务的消息,同时学会使用图形模式下的液晶屏文字显示函数。

二、实验内容

1.学习μC/OS-Ⅱ的编程方法。

2.编写几个简单任务,在超级终端上观察任务的切换。

3.通过使用嵌入式系统的绘图API 函数,首先,在屏幕上绘制一个圆角矩形和一个整圆。然后,再在屏幕上无闪烁的绘制一个移动的正弦波。

4.通过使用消息队列接收键盘任务发出的按键消息,并把对应按键的字符显示在液晶屏和PC 机的终端上。

三、预备知识

1.掌握在ADS1.2 集成开发环境中编写和调试程序的基本过程。

2.了解ARM7 处理器的结构。

3.了解μC/OS-Ⅱ系统结构。

四、实验设备及工具

硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机。

软件:PC 机操作系Win2000、ADS1.2 集成开发环境、仿真器驱动程序、超级终端通讯程序。

五、实验原理

(一)μC/OS-Ⅱ程序编写基础

为了使μC/OS-Ⅱ可以正常运行,硬件初始化和配置文件也是必须的。STARTUP 目录下的文件还包括中断处理,时钟,串口通信等基本功能函数。在文件main.c 中给出了应用程序的基本框架,包括初始化和多任务的创建,启动等。

在μC/OS-Ⅱ中创建一个任务的步骤如下:

1)在程序开头定义任务堆栈,任务函数声明和任务优先级:

OS_STK TaskName_Stack[STACKSIZE]={0, }; //任务堆栈

void TaskName(void *Id); //任务函数

#define TaskName_Prio N //任务优先级

2)在main()函数中调用OSStart()函数之前用下列语句创建任务:

OSTaskCreate(TaskName,(void*)0,(OS_STK*)&TaskName_Stack[STACKSIZE-1], TaskName_Prio);

OSTaskCreate()函数的原型是:

INT8U OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos,

INT8U prio);

需要将任务函数TaskName,任务堆栈TaskName_Stack,任务优先级TaskName_Prio 三个参数传给OSTaskCreate()函数。根据任务函数的内容决定堆栈大小,宏STACKSIZE 定义为4KB,可以在此基数上乘倍。任务优先级越高,TaskName_Prio 值越小;μC/OS-Ⅱ可以管理64 个任务,由OSInit()创建的空闲任务的优先级最低为63;μC/OS-Ⅱ保留4 个最高和4 个最低优先级,用户任务可以使用其余56 个优先级值。

3)编写任务函数内容:

void TaskName(void *Id)

{

//添入任务初始化语句

for(;;)

{ //添入任务循环内容

OSTimeDly(SusPendTime);//挂起一定时间,以使其他任务可以占用CPU

}

}

μC/OS-Ⅱ至少要有一个任务,这里首先创建一个系统任务SYS_Task,其中由语句OSRunning=TRUE; //使能μC/OS-Ⅱ运行

uHALr_InstallSystemTimer();

启动系统时钟和多任务切换。

为了验证μC/OS-Ⅱ多任务切换的进行,再编写两个简单的任务,分别在超级终端上输出run task1 和run task2。可以参考main.c 的结构创建多个不同功能的任务,观察个任务的切换。

(二)完善的μC/OS-Ⅱ开发框架

需要说明的是,μC/OS-Ⅱ作为一个实时操作系统只提供了多任务调度等基本功能,这在实际应用中显然是不够的。除了移植好的操作系统内核部分,还必须有文件系统,全部硬件的驱动程序,图形API,控件函数,综合提高的消息函数以及几个系统必须的基本任务,象键盘,触摸屏,LCD 刷新等。有了这些,μC/OS-Ⅱ才能实现复杂的功能。特殊需求的地方还需要像USB 通信协议,TCP/IP 协议等更复杂的软件模块。

实验系统提供的μC/OS-Ⅱ库文件中包含了上述大部分功能,基于库的开发变的非常简单,在基本的程序框架下应用实验系统提供的丰富API 函数即可。实际开发中,用户的工程中无需包括μC/OS-Ⅱ的源代码,只需要包括库文件即可。当然,用户也可以了解库中部分代码的源文件,可以根据自己的需求就行重新编译,也可以对自己的一系列源文件生成一个专门的库,方便自己后续工作。

μC/OS-Ⅱ的开发中,应用程序和操作系统是绑在一起编译的,所生成的system.bin 文

件是唯一的可执行文件,其中包括了所需要的μC/OS-Ⅱ代码和被用到的驱动程序等函数代码,以及应用程序的代码。system.bin 文件是存放在平台的16M FLASH 中的,在系统启动时由BIOS 依靠文件系统从FLASH 中读入到SDRAM 中,然后把控制转移到该代码上,完成所谓的引导。而BIOS 是存储在另外的ROM 中的。

本实验提供了基于库的μC/OS-Ⅱ开发框架,可以打开工程进行了解。图3-3是ADS环境下看到的该框架的文件组成,还可以展开各目录查看更多的文件信息。

可以看出,STARTUP 下的都是最基本的硬件初始化和配置文件;Ucos_lib.a 是ADS 环境下的库;SRC 是用户编写的工程文件;μC/OS-Ⅱ下都是系统用到的头文件,其中ADD 下是添加的基本系统任务和消息函数的相关头文件。INC 下主要是硬件驱动程序的头文件。Init下的几个文件是ADS 环境下配置存储器及堆栈的,和μC/OS-Ⅱ无直接关系。

打开Main.c 文件,可以看到一个应用工程的基本框架,在这个实验中,所谓的应用很简单,就是在LCD 上显示“Hello world!”,大部分代码都是框架。用户可以在这些代码的基础上进行应用开发,创建新任务,编写必要的函数。当然,如果针对特定的项目有相对独立并集中的一些函数则最好新建源文件和头文件,以方便管理,这些用户新建的源文件可以放到SRC 目录下,在编译环境下用Add Files 命令加入对应位置。

下面是Main()函数中的内容:

int main(void)

{

ARMTargetInit(); //开发板初始化

OSInit(); //操作系统初始化

uHALr_ResetMMU(); //复位MMU

LCD_Init(); //初始化LCD 模块

LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据

initOSGUI(); //初始化图形界面

LoadFont(); //调Unicode 字库

LoadConfigSys(); //使用config.sys 文件配置系统设置

LCD_printf("Create task on μC/OS-Ⅱ...\n");

OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[STACKSIZE*8-1], Main_Task_Prio); // 创建系统任务

OSAddTask_Init(); //创建系统附加任务

LCD_printf("Starting μC/OS-Ⅱ...\n");

LCD_printf("Entering graph mode...\n");

LCD_ChangeMode(DspGraMode); //变LCD 显示模式为图形模式

InitRtc(); //初始化系统时钟

Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash 读写控制权旗语,初值为1 满足互斥

条件

OSStart();//操作系统任务调度开始

//不会执行到这里

return 0;

}

main()函数中调用了必要的初始化函数,创建了系统任务和用户任务,然后启动系统任务调度。建议用户不要改动该函数中的初始化过程,但可以按本实验第一部分所述的任务创建方法来创建更多的任务,注意每个任务必须具有不同的优先级。

(三)绘图的API 函数

请查阅附录API 函数,在Display.h 中定义了和绘图显示有关的数据类型和函数原型。在μC/OS-Ⅱ系统环境下,绘图必须通过使用绘图设备上下文(DC)来实现。绘图设备上下文(DC)中包括了与绘图相关的信息,比如:画笔的宽度、绘图的原点等等。这样,在多任务系统中,不同的任务通过不同的绘图设备上下文(DC)绘图才不会互相影响。绘图设备上下文(DC)的结构定义如下:

typedef struct{

int DrawPointx;

int DrawPointy; //绘图所使用的坐标点

int PenWidth; //画笔宽度

U32 PenMode; //画笔模式

COLORREF PenColor; //画笔的颜色

int DrawOrgx; //绘图的坐标原点位置

int DrawOrgy;

int WndOrgx; //绘图的窗口坐标位置

int WndOrgy;

int DrawRangex; //绘图的区域范围

int DrawRangey;

structRECT DrawRect; //绘图的有效范围

U8 bUpdataBuffer; //是否更新后台缓冲区及显示

U32 Fontcolor; //字符颜色

}DC,*PDC

与绘图设备上下文(DC)有关的函数有:initOSDC()用来初始化系统的DC,为DC 动态内存开辟空间;CreateDC()和DestoryDC(PDC pdc)分别用来创建和删除DC,前者返回所创建的DC 指针,后者则释放DC 的内存空间。

和绘图有关的函数有TextOut(),LineTo(),FillRect(),Circle(),ShowBmp()等常见的图形函数,用户可以查看附录API 函数显示部分,尝试使用这些函数。

在μC/OS-Ⅱ操作系统中,液晶显示屏的刷新是通过Lcd_Fresh_Task 任务完成的,该任务是在系统附加任务初始化函数OSAddTask_Init()中定义的,该函数开辟了LCD 刷新任务,触摸屏任务,键盘任务等。绘图首先是在绘图缓冲区中完成的,然后系统自动(也可以通过设置绘图设备上下文参数,不让系统自动刷新)向Lcd_Fresh_Task 发送更新消息。其流程图如图4-1所示:

图4-1 绘图流程

因为绘图是在后台进行的,绘制完成之后,再更新到液晶屏上,所以,在绘图的时候不用担心反覆的擦除屏幕会引起屏幕的闪烁,这样,可以很方便的实现动画无闪烁的显示。绘制完一次图形以后,必须要使用OSTimeDly()给出一定时间的延时(推荐用200),同时使Main_Task 任务主动让出对CPU 的控制权,使Lcd_Fresh_Task 任务可以完成刷新。

(四)图形系统的消息循环

通常在多任务操作系统中,任务之间的通讯是通过发送消息来实现的。消息队列是

μC/OS-Ⅱ操作系统的一种通信机制,它可以使一个任务或者中断服务程序向另一个任务发送以指针方式定义的变量。μC/OS-Ⅱ操作系统提供了若干对消息队列进行操作的函数,例如OSQCreate(),OSQPend(),OSQPost()等,都定义在OS_Q.C 中。但是,在将μC/OS-Ⅱ移植到本ARM 嵌入式开发平台时,对消息队列相关函数又作了提高,使得程序中对消息队列的使用变得更加简单易行。请参考附录API 函数系统消息部分,开发平台的消息队列相关函数定义在OSMessage.h 中。程序中可以用OSCreateMessage()函数为某个控件创建消息,用SendMessage()函数将该消息发送到消息队列中,用WaitMessage()函数等待消息,用DeleteMessage()函数删除消息。

消息的数据结构定义如下:

typedef struct {

POS_Ctrl pOSCtrl; //消息所发到的窗口(控件),为NULL 时指桌面

U32 Message; //消息类型

U32 WParam; //消息参数

U32 LParam; //消息参数

}OSMSG, *POSMSG;

下面是平台的基本消息类型定义:

#define OSM_KEY 1 //键盘消息

#define OSM_TOUCH_SCREEN 2 //触摸屏消息

#define OSM_SERIAL 100 //串口收到数据的消息

#define OSM_LISTCTRL_SELCHANGE 1001 //列表框的选择被改变的消息

#define OSM_LISTCTRL_SELDBCLICK 1002 //列表框的选择双击消息

#define OSM_BUTTON_CLICK 1003 //单击按钮消息

对于键盘消息来说其类型pMsg->Message=OSM_KEY,参数pMsg->WParam 则是按键的键码(pMsg 是指向该消息结构体的指针)。键盘中断服务程序只向键盘邮箱(邮箱是μC/OS-Ⅱ的另一种通信机制)中发送一个消息,通知键盘扫描任务发生按键事件:

void ISR_Key()

{

OSMboxPost(Key_MailBox, (void*)1);

}

当键盘扫描任务等到该邮箱的消息后就会从键盘扫描芯片读取扫描码,继而将该扫描码对应的键码用键盘消息发送到消息队列:

void Key_Scan_Task(void *Id)//键盘扫描任务

{

U32 key;

INT8U err;

POSMSG pmsg;

Uart_Printf("begin key task \n");

for (;;){

OSMboxPend(Key_MailBox, 0, &err);

key=ZLG7289_ReadKey();

if(key>=64)

continue;

pmsg=OSCreateMessage(NULL, OSM_KEY,KeyBoard_Map[key],0);

if(pmsg)

SendMessage(pmsg);

}

}

所谓的系统消息循环如图4-2所示:

图4-2系统的消息循环

应用程序在Main_Task 任务中等待消息,并对该消息进行判断和处理,如果是键盘消息则提取出键码,变换为对应字符,然后将其显示到液晶屏上。在图形模式下,液晶屏的文字输出函数是TextOut(),实际是通过在图形方式下绘图完成文字显示的。此函数输出的字符数组必须是基于双字节Unicode 编码的。在程序中可以使用Int2Unicode()和strChar2Unicode()两个函数分别将整形数或ASCII 字符转换为Unicode 字符串。这部分内容请参考附录API 函数,在Ustring.h 定义。

六、实验步骤

(一)嵌入式操作系统基本程序设计

1.查看实验示例程序,学习μC/OS-Ⅱ任务创建和延时的程序编写方法。

2. 编写多任务程序,要求实现:

任务1不停的向串口打印“Task 1”,任务2向不同的串口打印“Task2”,任务3不停的向串口打印“Task3”。打印的规律为:1 2 1 2 1 3,循环打印。效果如下:

Task1

Task2

Task1

Task2

Task1

Task3

3.编译、调试所编写的程序。

(二)绘图的API 函数

1、新建工程,将“Exp4-1 绘图的API 函数”中的文件加入工程。

2、编辑Main.c 文件,在Main_Task 任务中加入代码。使用操作系统的绘图API 函数,绘制出如图4-3所示的图形。

图4-3 绘制的图形

提示:

1)绘制整个圆可以用Circle 函数,绘制直线用LineTo 函数,绘制圆弧用ArcTo 函数。调试的过程中可以在每次调用绘图函数之后调用OSTimeDly()函数,使系统更新显示,输出到液晶屏上。

2)为方便绘图,可使用SetDrawOrg 函数设置绘图的原点。

3)因为本次实验不用系统的字符显示,所以,可以去掉Main()函数中LoadFont()函数,以节省系统启动的时间。

3、用ADS1.2 编译、下载并调试上述程序,检查运行结果。

4、在屏幕上无闪烁的绘制一个移动的正弦波。

提示:

1)绘制正弦波等有数学表达式的曲线时,可以根据平面几何的知识通过数学计算得到曲线上点的坐标,然后用线段连起来构成整个曲线。两帧画面之间可以清屏擦掉原来图形,然后重画新图形。

2)因为绘图需要使用sin()函数,所以需要在main.c 中加入#include

5、用ADS1.2 编译、下载并调试上述程序,检查运行结果。

(三)图形系统的消息循环

7、新建工程,将“Exp4-2 系统的消息循环”中的文件加入工程。

8、编辑Main_Task 任务中的代码,理解如何实现消息循环。即:等待消息、处理(响应)消息、删除消息。

提示:

1)使用WaitMessage(0)接收消息,通常等待时间设置为无限长。

2)系统的消息循环是一个无限循环。

3)收到消息以后(即WaitMessage()函数返回后),通过判断消息结构中Message成员来判断消息类型。如果是键盘消息,则Message 的值为OSM_KEY,WParam 参数存储的是按键的键码,LParam 参数存储的是同时按下的功能键(如果没有,则为0)。

4)开始等待下一条消息之前必须使用DeleteMessage 删除消息,释放系统的内存空间。

9、编写键盘消息响应函数onKey(),处理键盘的消息。当有键盘消息收到的时候,把按键字符显示在液晶屏上,同时,发送给PC 机的终端。

提示:

1)通过Uart_Printf()函数向串行口发送键面字符串。

10、用ARM ADS1.2 编译、下载并调试上述程序,检查运行结果。

12、在学习和调试上述例子程序的基础上,按照教师现场的要求,编写一个结合进程通信和绘图函数的综合程序,要求最终程序能够通过开发板自启动运行。

七、实验心得体会

通过这次实验,我还认真学习了μC/OS-Ⅱ操作系统,通过思考和不断的尝试,我和一个同学同组解决了再屏幕上按照一定规律显示任务,在调节过程中,我们不断的思考延时的时长和任务的优先级的设置,最终我们我实现了预定的要求。通过这次实验,我们积极思考,互相合作,感受很深。任何事情都是从开始不懂,到了解,以至于深深的感兴趣,在以后的学习生活中,嵌入式系统与人们的生活息息相关,因此我们要好好学习嵌入式系统,使得人们以后的生活更为方便,快捷。

八、实验中遇到的问题及解决

在编写多任务程序中,由于对任务的优先级和延时的设定没有进行预先的思考,只是盲目的给了一个设定值,在程序编写完成后,始终得不到理想的结果。最后通过思考,明白了其中的原理,重新调节了任务的优先级和延时,最终得到了理想的结果,完成了任务。

最后在编写指定键完成画图任务过程中,先是对键盘的具体的对应的数组中的值不清晰,不知如何下手,最终确定了“4”、“5”、“6”各键。然后选择函数画出了指定的图形。

九、实验源代码

1、多任务程序

#include"..\ucos-ii\includes.h" /* uC/OS interface */

#include "..\ucos-ii\add\osaddition.h"

#include "..\inc\drv.h"

#include

#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting

///******************任务定义***************///

OS_STK Main_Stack[STACKSIZE*8]={0, }; //Main_Test_Task堆栈

void Main_Task(void *Id); //Main_Test_Task

#define Main_Task_Prio 12

OS_STK Task1_Stack[STACKSIZE*8]={0, }; //Main_Test_Task堆栈

void Task1(void *Id); //Main_Test_Task

#define Task1_Prio 30

OS_STK Task2_Stack[STACKSIZE*8]={0, }; //Main_Test_Task堆栈

void Task2(void *Id); //Main_Test_Task

#define Task2_Prio 32

OS_STK Task3_Stack[STACKSIZE*8]={0, }; //Main_Test_Task堆栈

void Task3(void *Id); //Main_Test_Task

#define Task3_Prio 31

/**************已经定义的OS任务*************

tcp监控任务11

以太网物理层监控任务8

触摸屏任务9

键盘任务10

lcd刷新任务59

系统任务 1

*****************************************************/

///*****************事件定义*****************///

OS_EVENT *Nand_Rw_Sem; //Nand_Flash读写控制权旗语

//and you can use it as folloeing:

// Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//

// OSSemPend(Nand_Rw_Sem,0,&err);

// OSSemPost(Nand_Rw_Sem);

OS_EVENT *Uart_Rw_Sem; //Uart读写控制权旗语

//and you can use it as folloeing:

// Uart_Rw_Sem=OSSemCreate(1); //创建Uart读写控制权旗语,初值为1满足互斥条件//

// OSSemPend(Uart_Rw_Sem,0,&err);

// OSSemPost(Uart_Rw_Sem);

//////////////////////////////////////////////////////////

void initOSGUI() //初始化操作系统的图形界面

{

initOSMessage();

initOSList();

initOSDC();

initOSCtrl();

initOSFile();

}

/////////////////////////////////////////////////////

// Main function. //

////////////////////////////////////////////////////

int main(void)

{

ARMTargetInit(); //开发板初始化

OSInit(); //操作系统初始化

uHALr_ResetMMU();//复位MMU

LCD_Init(); //初始化LCD模块

LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据

LCD_printf("320 x 240 Text Mode\n");

initOSGUI();//初始化图形界面

LoadFont();//调Unicode字库

LoadConfigSys();//使用config.sys文件配置系统设置

LCD_printf("Create task on uCOS-II...\n");

//OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[STACKSIZE*8-1], Main_Task_Prio);// 创建系统任务

OSTaskCreate(Task1, (void *)0, (OS_STK *)&Task1_Stack[STACKSIZE*8-1], Task1_Prio);// 创建系统任务

OSTaskCreate(Task2, (void *)0, (OS_STK *)&Task2_Stack[STACKSIZE*8-1], Task2_Prio);// 创建系统任务

OSTaskCreate(Task3, (void *)0, (OS_STK *)&Task3_Stack[STACKSIZE*8-1], Task3_Prio);// 创建系统任务

OSAddTask_Init();//创建系统附加任务

LCD_printf("Starting uCOS-II...\n");

LCD_printf("Entering graph mode...\n");

LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式

InitRtc();//初始化系统时钟

Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//

OSStart();//操作系统任务调度开始

//不会执行到这里

return 0;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*

void Main_Task(void *Id) //Main_Test_Task

{

LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式LCD_Cls();//文本模式下清屏命令

LCD_printf("Hello world!\n");//向液晶屏输出

Uart_Printf("Hello world!\n");//向串口输出

//消息循环

for(;;)

{//死循环

OSTimeDly(200);//主任务挂起200毫秒

//LCD_printf("Hello world!\n");//向液晶屏输出

}

}

*/

void Task1(void *Id) //Main_Test_Task

{

LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式LCD_Cls();//文本模式下清屏命令

//LCD_printf("Task1\n");//向液晶屏输出

Uart_Printf("Hello world!\n");//向串口输出

//消息循环

for(;;)

{//死循环

LCD_printf("Task1\n");//向液晶屏输出

OSTimeDly(1000);//主任务挂起200毫秒

}

}

void Task2(void *Id) //Main_Test_Task

{

LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式LCD_Cls();//文本模式下清屏命令

//LCD_printf("Task2\n");//向液晶屏输出

Uart_Printf("Hello world!\n");//向串口输出

//消息循环

for(;;)

{//死循环

LCD_printf("Task2\n");//向液晶屏输出

OSTimeDly(1500);//主任务挂起200毫秒

}

}

void Task3(void *Id) //Main_Test_Task

{

LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式

LCD_Cls();//文本模式下清屏命令

//LCD_printf("Task3\n");//向液晶屏输出

Uart_Printf("Hello world!\n");//向串口输出

//消息循环

for(;;)

{//死循环

LCD_printf("Task3\n");//向液晶屏输出

OSTimeDly(3000);//主任务挂起200毫秒

}

}

2、指定键完成画图程序

#include"..\ucos-ii\includes.h" /* uC/OS interface */

#include "..\ucos-ii\add\osaddition.h"

#include "..\inc\drv.h"

#include

#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting

///******************任务定义***************///

OS_STK Main_Stack[STACKSIZE*8]={0, }; //Main_Test_Task堆栈

void Main_Task(void *Id); //Main_Test_Task

#define Main_Task_Prio 12

/**************已经定义的OS任务*************

tcp监控任务11

以太网物理层监控任务8

触摸屏任务9

键盘任务10

lcd刷新任务59

系统任务 1

*****************************************************/

///*****************事件定义*****************///

OS_EVENT *Nand_Rw_Sem; //Nand_Flash读写控制权旗语

//and you can use it as folloeing:

// Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1

满足互斥条件//

// OSSemPend(Nand_Rw_Sem,0,&err);

// OSSemPost(Nand_Rw_Sem);

OS_EVENT *Uart_Rw_Sem; //Uart读写控制权旗语

//and you can use it as folloeing:

// Uart_Rw_Sem=OSSemCreate(1); //创建Uart读写控制权旗语,初值为1满足互斥条件//

// OSSemPend(Uart_Rw_Sem,0,&err);

// OSSemPost(Uart_Rw_Sem);

//////////////////////////////////////////////////////////

void initOSGUI() //初始化操作系统的图形界面

{

initOSMessage();

initOSList();

initOSDC();

initOSCtrl();

initOSFile();

}

/////////////////////////////////////////////////////

// Main function. //

////////////////////////////////////////////////////

int main(void)

{

ARMTargetInit(); //开发板初始化

OSInit(); //操作系统初始化

uHALr_ResetMMU();//复位MMU

LCD_Init(); //初始化LCD模块

LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据

LCD_printf("320 x 240 Text Mode\n");

initOSGUI();//初始化图形界面

LoadFont();//调Unicode字库

LoadConfigSys();//使用config.sys文件配置系统设置

LCD_printf("Create task on uCOS-II...\n");

OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[STACKSIZE*8-1], Main_Task_Prio);// 创建系统任务

OSAddTask_Init();//创建系统附加任务

LCD_printf("Starting uCOS-II...\n");

LCD_printf("Ensstering graph mode...\n");

LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式

InitRtc();//初始化系统时钟

Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互

斥条件//

OSStart();//操作系统任务调度开始

//不会执行到这里

return 0;

}

char

*KeyTable[]={"NumLock","/","*","-","7","8","9","+","4","5","6","1","2","3","Ent er","0","."};

void onKey(int nkey, int fnkey)

{

PDC pdc;//创建绘图设备上下文结构

U16 ch[10];

ClearScreen();//清屏

pdc=CreateDC();//创建绘图设备上下文

if(nkey==4)

{

ClearScreen();//清屏

Circle(pdc,150, 100, 50);//画圆

}

if(nkey==5)

{

ClearScreen();//清屏

DrawRectFrame(pdc,120,120,220,220);

}

if(nkey==6)

{

ClearScreen();//清屏

}

// Uart_Printf("key=%s\n",KeyTable[nkey]);//向串口发送按键值对应的ASCII吗strChar2Unicode(ch,KeyTable[nkey]);//将整形数据转化成Unicode

TextOut(pdc, 150, 100, ch, TRUE, FONTSIZE_MIDDLE);//文本模式下显示文字

DestoryDC(pdc);//删除绘图设备上下文

}

/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////

void Main_Task(void *Id) //Main_Test_Task

{

POSMSG pMsg=0;//创建消息结构

ClearScreen();//清屏

//消息循环

for(;;){

pMsg=WaitMessage(0); //等待消息

switch(pMsg->Message){

case OSM_KEY://键盘消息

onKey(pMsg->WParam,pMsg->LParam);

break;

}

DeleteMessage(pMsg);//删除消息,释放资源}

}

嵌入式系统及应用 实验大纲

《嵌入式系统及应用》课程实验 一、实验课程的性质、目的和任务 性质:《嵌入式系统及应用》课程是自动化专业的专业基础课程,本实验课是该课程教学大纲中规定必修的实验教学内容。 目的和任务:通过实验环节来巩固和加深学生对嵌入式系统的理解,使学生掌握MCS51单片机和ARM的基本原理和应用技术。通过熟悉MCS51开发环境和ARM集成开发环境,使学生掌握嵌入式系统开发的一般规律和方法。在集成开发环境下,进行系统功能程序的编写和调试的训练,掌握嵌入式系统软硬件调试的一般方法和系统设计的能力。 二、实验内容、学时分配及基本要求

三、考核及实验报告 (一)考核 本课程实验为非独立设课,实验成绩占课程总成绩的15%,综合评定实验成绩。(二)实验报告 实验报告应包括: 实验名称 实验目的 实验内容与要求 设计思路(如:分析、程序流程图等) 实验步骤 实验代码(含必要注释) 实验结果分析 实验小结(本题调试过程中遇到的问题和解决方法、注意事项、心得体会等)注:综合型实验需写出系统功能、设计过程 实验报告的要求: 实验报告以文本形式递交,实验报告要书写规范、文字简练、语句通顺、图表清晰。 四、主要仪器设备 硬件:微型计算机;嵌入式系统开发平台。 软件:Keil C51;ADT 五、教材及参考书 教材

[1] 高锋.单片微型计算机原理与接口技术(第二版).北京:科学出版社,2007 [2] 自编.嵌入式系统及应用 参考书 [1] 王田苗.嵌入式系统设计与实例开发.北京:清华大学出版社,2003 [2] 陈赜.ARM9 嵌入式技术及Linux高级实践教程.北京:北京航空航天大学出版社,2005 [3] 李忠民等.ARM嵌入式VxWorks实践教程.北京:北京航空航天大学出版社,2006

嵌入式操作系统实验指导书1

嵌入式操作系统实验 实验一 Linux常用命令 一.实验目的 1. 熟悉VMware Workstation虚拟机的使用。 2. 熟悉ubuntu操作系统。 3. 掌握常用的Linux命令。 二.实验设备 硬件:PC机。 软件:VMware Workstation虚拟机、ubuntu操作系统。 三.实验内容 1.基于虚拟机的Linux操作系统的使用。 2.文件与目录相关命令的使用。 3.磁盘管理与维护命令的使用。 4.系统管理与设置命令的使用。 5.网络相关命令的使用。 6.压缩备份命令的使用。 四.实验步骤 1.基于虚拟机的Linux操作系统的使用 (1)启动VMware Workstation应用程序,启动windows以后,点击开始→程序→VMware→VMware Workstation,出现如图1所示界面。

图1 启动VMware Workstation (2)点击菜单File Open选择安装好的Linux虚拟机文件,或者直接点击Start this virtual machine启动Linux操作系统。 (3)启动系统后需要输入用户名和密码,如图2所示,这里用户名为root,密码为“123456”。 图2输入用户名和密码 (3)启动终端,成功进入系统后,选择应用程序->系统工具->终端,如图3所示。 图3 启动终端 (4)在终端中执行Linux命令,终端运行以后,就可以在这里输入Linux命令,并按回车键执行,如图4所示。

图4运行Linux命令 2.文件与目录相关命令的使用 理解12个常用的文件与目录相关命令的使用,完成如下练习。 (1)查询/bin目录,看一看有哪些常用的命令文件在该目录下:ll /bin (2)进入/tmp目录下,新建目录myshare: cd /tmp mkdir myshare ls -ld myshare/ (3)用pwd命令查看当前所在的目录 pwd (4)新建testfile文件 touch testfile ls -l (5)设置该文件的权限模式 chmod 755 testfile ls -l testfile (6)把该文件备份到/tmp/myshare目录下,并改名为testfile.bak。 cp testfile myshare/testfile.bak ls -l myshare/ (7)在/root目录下为该文件创建1个符号连接。 ln -s /tmp/testfile /root/testfile.ln ls -l /root/testfile.ln (8)搜索inittab文件中含有initdefault字符串的行。 cat /etc/inittab | grep initdefault 3.磁盘管理与维护命令的使用 理解2个磁盘管理与维护命令,完成如下练习。 (1)Linux下使用光盘步骤: ?确认光驱对应的设备文件:ll /dev/cdrom ?挂载光盘:mount -t iso9660 /dev/cdrom testdir ?查询挂载后的目录:ll /media/cdrom ?卸载光盘(umount testdir)umount /dev/cdrom (2)Linux下USB设备的使用 ?挂载U盘,看看系统认出的盘(或者使用#fdisk -l)。cat /proc/partitions

嵌入式实验报告二

实习二建立交叉编译环境 实习内容: 本次实验主要包括二部分内容:开发环境配置,主要有配置NFS,Samba和超级终端;编写编译程序。 1、配置NFS(实现宿主机和目标机的信息共享) 打开Linux虚拟机,点击主菜单运行系统设置->服务器设置->NFS 服务器,点击增加,在出现的界面中的目录中填入需要共享的路径,在主机中填入允许进行连接的主机的IP地址(注意:这里主机IP指的是开发板的IP)。并选择允许客户对共享目录的操作为只读或读写(注意:实验中选的是读写,一定不能忽略),如下图: 对客户端存取服务器的一些其他设置,一般不需要设置,取默认值。然后退出,完成了NFS配置。 2、配置Samba(实现Windows和Linux系统的文件共享) ①关闭防火墙,这个地方和上面的NFS的配置是一样的。 ②配置Samba服务器 选择“系统设置”—>“服务器配置”—>“Samba服务”,进行Samba 服务器配置。首先创建Samba共享,选择“基本”选项卡,在“目录”

的文本框中输入要共享的文件,基本权限设为读/写。在“访问”选项卡中选择“允许所有用户访问”选项,通过“首选项”进行服务器配置。在“基本”选项卡中设置工作组和描述,在“安全性”选项卡中设置“验证模式”为共享,“加密口令”为否,“来宾账号”为无来宾账号。 ③设置Samba服务器IP地址(与前面的NFS的设置相同) ④启动Samba服务器 在命令行中输入service smb start,即可启动Samba服务器。 ⑤配置Windows下的IP地址 将Windows下的IP地址和Samba服务器IP地址设置在同一网段中即可(注意:这里设置IP时一定要注意在同一网段) ⑥在Windows下访问共享 在Windows中的“运行”窗口中输入Samba服务器的IP地址,就可以看见在虚拟机中共享的文件。 3、配置超级终端 ①在linux操作系统Xwindow界面下建立终端,在终端的命令行提示符后输入minicom,回车,然后就会看见minicom的启动画面,若没有启动Xwindow则在命令行提示符后直接输入minicom即可。 ② minicom启动后,先按Ctrl+A键,然后按Z键进入主配置界面,按“O”进入配置界面,按上下键选择Serial port setup,进入端口设置界面,然后按照指导书中的指示修改几个重要选项。 ③选好后按ESC键退出端口设计界面,选择Save setup as df1保存

嵌入式系统实验报告

实验报告 课程名称:嵌入式系统 学院:信息工程 专业:电子信息工程 班级: 学生姓名: 学号: 指导教师: 开课时间:学年第一学期

实验名称:IO接口(跑马灯) 实验时间:11.16 实验成绩: 一、实验目的 1.掌握 STM32F4 基本IO口的使用。 2.使用STM32F4 IO口的推挽输出功能,利用GPIO_Set函数来设置完成对 IO 口的配置。 3.控制STM32F4的IO口输出,实现控制ALIENTEK 探索者STM32F4开发板上的两个LED实现一个类似跑马灯的效果。 二、实验原理 本次实验的关键在于如何控制STM32F4的IO口输出。IO主要由:MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR、AFRH和AFRL等8个寄存器的控制,并且本次实验主要用到IO口的推挽输出功能,利用GPIO_Set函数来设置,即可完成对IO口的配置。所以可以通过了开发板上的两个LED灯来实现一个类似跑马灯的效果。 三、实验资源 实验器材: 探索者STM32F4开发板 硬件资源: 1.DS0(连接在PF9) 2.DS1(连接在PF10) 四、实验内容及步骤 1.硬件设计 2.软件设计 (1)新建TEST工程,在该工程文件夹下面新建一个 HARDWARE文件夹,用来存储以后与硬件相关的代码。然后在 HARDWARE 文件夹下新建一个LED文件夹,用来存放与LED相关的代码。 (2)打开USER文件夹下的test.uvproj工程,新建一个文件,然后保存在 LED 文件夹下面,保存为 led.c,在led.c中输入相应的代码。

(3)采用 GPIO_Set 函数实现IO配置。LED_Init 调用 GPIO_Set 函数完成对 PF9 和 PF10 ALIENTEK 探索者 STM32F407 开发板教程 119 STM32F4 开发指南(寄存器版) 的模式配置,控制 LED0 和 LED1 输出 1(LED 灭),使两个 LED 的初始化。 (4)新建一个led.h文件,保存在 LED 文件夹下,在led.h中输入相应的代码。 3.下载验证 使用 flymcu 下载(也可以通过JLINK等仿真器下载),如图 1.2所示: 图1.2 运行结果如图1.3所示:

(完整word版)嵌入式系统设计与应用

嵌入式系统设计与应用 本文由kenneth67贡献 ppt文档可能在W AP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 课程名称:课程名称:嵌入式系统设计与应用 总学时:其中讲课36学时,上机实践环节12 36学时12学时总学时:其中讲课36学时,上机实践环节12学时教材:嵌入式系统设计教程》教材:《嵌入式系统设计教程》电子工业出版社马洪连参考书:参考书:1、《嵌入式系统开发与应用》北航出版社、田泽编著. 嵌入式系统开发与应用》北航出版社、田泽编著. 2、《ARM体系结构与编程》清华大学出版社杜春雷编著ARM体系结构与编程体系结构与编程》嵌入式系统设计与实例开发—ARM ARM与C/OS3、《嵌入式系统设计与实例开发ARM与μC/OS-Ⅱ》清华大学出版社王田苗、魏洪兴编著清华大学出版社王田苗、ARM嵌入式微处理器体系结构嵌入式微处理器体系结构》4、《ARM嵌入式微处理器体系结构》北航出版社、马忠梅等著. 北航出版社、马忠梅等著. 张石.ARM嵌入式系统教程嵌入式系统教程》5、张石.《ARM嵌入式系统教程》.机械工业出版2008年社.2008年9月 1 课程内容 绪论:绪论: 1)学习嵌入式系统的意义2)高校人才嵌入式培养情况嵌入式系统设计(实验课)3)嵌入式系统设计(实验课)内容安排 第1章嵌入式系统概况 1.1 嵌入式系统的定义1.2 嵌入式系统的应用领域及发展趋势1.3 嵌入式系统组成简介 第2章嵌入式系统的基本知识 2.1 2.2 2.3 嵌入式系统的硬件基础嵌入式系统的软件基础ARM微处理器的指令系统和程序设计ARM微处理器的指令系统和程序设计 2 第3章 3.1 3.2 3.3 基于ARM架构的嵌入式微处理器基于ARM架构的嵌入式微处理器ARM 概述嵌入式微处理器的组成常用的三种ARM ARM微处理器介绍常用的三种ARM 微处理器介绍 第4章 4.1 4.2 4.3 4.4 4.5 4.6 嵌入式系统设计 概述嵌入式系统的硬件设计嵌入式系统接口设计嵌入式系统人机交互设备接口嵌入式系统的总线接口和网络接口设计嵌入式系统中常用的无线通信技术 3 第5章嵌入式系统开发环境与相关开发技术 5.1 5.2 5.3 5.4 5.5 6.1 6.2 6.3 6.4 概述嵌入式系统的开发工具嵌入式系统调试技术嵌入式系统开发经验嵌入式系统的Bootloader Bootloader技术嵌入式系统的Bootloader技术μC/OS-II操作系统概述C/OS-II操作系统概述ADS开发环境ARM ADS开发环境C/OS-II操作系统在ARM系统中的移植操作系统在ARM μC/OS-II操作系统在ARM系统

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

嵌入式实验报告

嵌入式实验报告 学院:信息工程学院 专业:计算机科学与技术班级:计算机班 姓名: 学号: 指导老师:

实验目录 实验一嵌入式系统开发环境实验 (2) 实验二系统节拍定时器实验 (12) 实验三 GPIO控制实验 (16) 实验四外部中断实验 (19) 实验五串口通讯实验 (23)

实验一嵌入式系统开发环境实验 【实验目的】 1.熟悉RealView MDK集成开发环境以及使用方法。 2.熟悉嵌入式系统软件设计方法和流程。 【实验内容】 1. 通过例程熟悉、掌握嵌入式系统的编辑、编译、调试、下载及运行过程。 2. 建立自己的工程文件,在开发板板上调试程序。 【实验步骤】 (一)程序安装 1. 建议在安装之前关闭所有的应用程序,双击安装文件,弹出如图对话框,Next 2.默认选择C盘文件下安装。

3.这样就在c盘底下出现keil文件夹。 4.单击选择菜单“File”-->"License Management" 将弹出下面一张图的界面:复制其中CID号,以便在粘贴到下一步中的破解软件。 5.复制CID

6.运行破解软件,将出现下面一张图的界面,把上步复制的CID号粘贴到相应位置,其他选项如图,然后点击“Generate”按钮,然后复制产生的序列号,粘贴到上一步的下面一张图的LIC输入框中,然后点击右侧的Add LIC,即可完成破解。 7.安装文件夹中的jlink驱动。 (二)工程创建、编译 使用Realview MDK创建、完成一个新的工程只需要以下几个环节: →创建工程并选择处理器→选择工具集→创建源文件→配置硬件选项→配置对应启动代码→编译链接→下载→调试。 1.创建工程并选择处理器 选择Project→New Project…,输入创建的新工程的文件名,即可创建一个新的工程。 2.创建一个新工程时,需要为工程选择一款对应处理器,在NXP 列表下选择LPC1768 芯片。然后点击OK。接下来出现的对话框选择“是或者也可以通过单击Project→Select Device for Target…在本次课程中,我们选择

南邮嵌入式系统B实验报告2016年度-2017年度-2

_* 南京邮电大学通信学院 实验报告 实验名称:基于ADS开发环境的程序设计 嵌入式Linux交叉开发环境的建立 嵌入式Linux环境下的程序设计 多线程程序设计 课程名称嵌入式系统B 班级学号 姓名 开课学期2016/2017学年第2学期

实验一基于ADS开发环境的程序设计 一、实验目的 1、学习ADS开发环境的使用; 2、学习和掌握ADS环境下的汇编语言及C语言程序设计; 3、学习和掌握汇编语言及C语言的混合编程方法。 二、实验内容 1、编写和调试汇编语言程序; 2、编写和调试C语言程序; 3、编写和调试汇编语言及C语言的混合程序; 三、实验过程与结果 1、寄存器R0和R1中有两个正整数,求这两个数的最大公约数,结果保存在R3中。 代码1:使用C内嵌汇编 #include int find_gcd(int x,int y) { int gcdnum; __asm { MOV r0, x MOV r1, y LOOP: CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE LOOP MOV r3, r0 MOV gcdnum,r3 //stop // B stop // END } return gcdnum; } int main() { int a; a = find_gcd(18,9);

printf("gcdnum:%d\n",a); return 0; } 代码2:使用纯汇编语言 AREA example1,CODE,readonly ENTRY MOV r0, #4 MOV r1, #9 start CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE start MOV r3, r0 stop B stop END 2、寄存器R0 、R1和R2中有三个正整数,求出其中最大的数,并将其保存在R3中。 代码1:使用纯汇编语言 AREA examp,CODE,READONL Y ENTRY MOV R0,#10 MOV R1,#30 MOV R2,#20 Start CMP R0,R1 BLE lbl_a CMP R0,R2 MOVGT R3,R0 MOVLE R3,R2 B lbl_b lbl_a CMP R1,R2 MOVGT R3,R1 MOVLE R3,R2 lbl_b B . END 代码2:使用C内嵌汇编语言 #include int find_maxnum(int a,int b,int c)

嵌入式系统综合实验一

实验名称: 姓名: 学号: 装 订 线 P.1 实验报告 课程名称: 嵌入式系统设计 指导老师:马永昌 成绩:________________ 实验名称:综合实验一dht11和人体感应传感器 实验类型:验证型 同组学生姓名:孙凡原 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得 一、实验目的和要求 1.掌握字符设备驱动程序的基本结构和开发方法 2.掌握用户空间调用设备驱动的方法 3.掌握用户和内核的交互 二、实验内容和原理 1.编写温湿度传感器DHT11驱动,传输打印温湿度信息 2.编写人体感应传感器驱动,控制LED 灯亮灭 原理: 温湿度传感器DHT11: 1.引脚图 实际使用传感器没有NC 引脚 2.数据采集 a.数据总时序 用户主机发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发 专业:测控技术与仪器 姓名:颜睿 学号:3130103850 日期:2018.4.28 地点:创客空间

装订线送响应信号,送出40bit 的数据,幵触发一次信采集。 b.主机发送起始信号 连接DHT11的DATA引脚的I/O口输出低电平,且低电平保持时间不能小于18ms,然后等待DHT11 作出应答信号。 c.检测从机应答信号 DHT11 的DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11 的DATA引脚处于输出状态,输出80 微秒的低电平作为应答信号,紧接着输出80 微秒的高电平通知外设准备接收数据。 d.接收数据 (1)数据判定规则 位数据“0”的格式为:50 微秒的低电平和26-28 微秒的高电平,位数据“1”的格式为:50 微秒的低电平加70微秒的高电平。 接收数据时可以先等待低电平过去,即等待数据线拉高,再延时60us,因为60us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 :安磊 班级:计科0901 学号: 0909090310 指导老师:宋虹

目录 课程设计容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------ 6 文件系统的层次结构和功能模块 --------------------- 6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录 -------------------------------------------------- 12

课程设计容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统核,它仅仅包含了任务调度,任务管理,时间管理,存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时核,并在这个核之上提供最基本的系统服务,如信号量,,消息队列,存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

嵌入式实验报告

嵌入式技术 实验报告 系别:计算机与科学技术系 班级:计12-1班 姓名:刘杰 学号:12101020128 总成绩: 评语: 日期:

2.在弹出的对话框中依次选择“cedevice emulator emulator kdstub”。 3.选择“Build OS”菜单的“sysgen”开始构建平台。 1.1.4连接,下载和运行平台 1.选择“Target”菜单下的“Connection option”菜单项。 2.在新的对话框中,配置连接关系 3.选择“Target”菜单下的“attach”菜单项,开始下载。 ?实验结果 操作系统定制成功,能正常运行。 ?结果截图 ?问题总结 由于对实验平台了解不够,致使操作过程中添加和删除组件时不知道该如何下手,影响整个实验进度。 实验1.2: 1.打开Platform Builder,并且打开实验1的工程,在实验1的工程基础上做本实验。

进程显示 IE信息查看

报文监测 实验1.3使用Platform Builder开发应用程序 简单实验步骤 1.打开Platform Builder。 2.选择“File”菜单下的“Open Workspace…”,然后打开实验1中创建的平台,本实验要基于 上面的实验的基础上做。 3.选择“File”菜单下的“New Project or File…”,打开“New Project or File”对话框。 4.在“Projects”选项页中选择“WCE Application”;在“Project Name”中输入项目的名字,例 如“MyApp”。 5.在“New Project Wizard – step 1 of 1”中选择“A typical Hello World Application”,点击“Finish” 按钮。 6.选择“Build”菜单中的“Build MyApp.exe”来编译应用程序。

嵌入式系统设计实验四

实验报告 课程名称: 嵌入式系统设计 指导老师:马永昌 成绩:________________ 实验名称:实验四C 语言裸机编程 实验类型:验证型 同组学生姓名:__孙凡原_______ 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得 一、实验目的和要求 ? 初步了解C 运行库 ? 初步了解gcc arm 常用编译选项 ? 了解ARM 中断处理过程 二、实验内容和原理 ? 编写C 裸机代码实现跑马灯,通过控制Timer 中断实现 ? 通过控制uart 串口进行调试打印 三、主要仪器设备 树莓派、PC 机 四、操作方法和实验步骤 1 通过定时器产生中断,控制gpio ,实现跑马灯 2 控制uart 控制器,产生调试打印。 五、实验数据记录和处理 1.主程序arm.c 注释 //包含头文件 #include #include #include #include "rpi-aux.h" #include "rpi-armtimer.h" #include "rpi-gpio.h" #include "rpi-interrupts.h" #include "rpi-systimer.h" #include "rpi-led.h" /** Main function - we'll never return from here */ void kernel_main( unsigned int r0, unsigned int r1, unsigned int atags ) 专业:测控技术与仪器 姓名:颜睿 学号:3130103850 日期:2018.3.28 地点:创客空间

嵌入式操作系统实验一建立交叉编译环境

嵌入式操作系统实验一建 立交叉编译环境 Last updated on the afternoon of January 3, 2021

嵌入式操作系统实验报告 队友:张圣苗亚 实验内容 1、准备工作工作:安装virtualbox虚拟机工具,并安装系统、增强型工具,实现共享文件夹的自动挂载。 2、利用crosstool提供的脚本安装和相关资源编译面向的ARM的GCC工具。 详细内容1:安装虚拟机软件和虚拟机时要完成的主要步骤有:安装virtualbox,建立一台虚拟机,分配内存和硬盘,指定共享文件夹(主机和虚拟机可共同操作),指定操作系统镜像文件路径(相当于光盘,第一次启动时安装),安装虚拟操作系统,安装增强工具包,实现共享文件夹的自动挂载。有几点需要注意: 1、虚拟硬盘尽量分配大一些,之后再扩就比较麻烦。 2、共享文件夹不要有中文路径,不然挂载后看不到中文名称文件。 3、安装操作系统时,不能断网,需要下载各种资源,不然会异常。 详细内容2需要安装与脚本相关的工具,需要修改crosstool中的配置文件以指定编译的目标位arm-linux。需要修改需要的资源 实验步骤 实验准备: 在实验准备中,在安装完增强工具包()并重启之后,需要实现对共享文件夹的自动挂载,只需要修改etc目录中的配置文件,是很多linux系统管理员的偏爱,因为凡是需要随系统自动启动的服务、程序等,都可以放在里面。 $sudomkdir/mnt/share $sudomount-tvboxsfembedded/mnt/shared 上面三句话实现了将共享文件夹embeded挂载到了share上。 gedit/etc/ 将第2句命令添加在exit之前,实现了自动挂载功能。 实验一 一、搭建编译环境 1、安装于脚本运行相关及其他的工具bison、flex、build-essential、patch、libncurses5-dev。

嵌入式实验报告二work2.

实验报告 课程名称嵌入式系统编程实践 实验仪器清华同方辰源嵌入式系统实验箱 实验名称实验二:利用中断实现OLED动态显示实验 系别__计算机学院_ 专业___ __ 班级/学号_ 学生姓名___ __ ___ _ _ 实验日期_ 2013年9月22日 成绩___________________ 指导教师_ _ 朱敏玲 ___

实验二:利用中断实现OLED动态显示实验 一、实验问题回答 (1)ISR是什么?简述一下中断的作用和使用方法 答:ISR是中断服务程序。作用是通过处理器执行事先编好的某个特定的程序。使用方法就是在main中写一个中断程序,然后在startup.s中进行注册。 (2)嵌入式系统中有哪些应用有定时性循环处理的要求?举几个例子答:在各种网络的应用中,设计的一些部件,如计数器,时钟等。 (3)定时时间间隔如何修改? 答:通过改变SysTickPeriodSet(SysCtlClockGet()/100)后面的100这个参数。(4)选作内容5-8的编程思路是什么?若做的话应该怎样实现? 答:编程思路:先画直线和竖线,组成一个正方形,将各个参数填写到函数RIT128x96x4ImageDraw(buf,,,,);第6个选作:判断画的原点x,原点y,和画原点x+的长,画原点y+画宽的值要在0-128和0-96。第7个选作:把RIT128x96x4StringDraw("hello",,,);就是把画的灰度定义为一个变量x。最后就会出现由不同的亮度而形成的波浪。第8个就是利用随机函数产生画的原点,随机的在屏幕上进行显示。 (5)拖影现象如何解决?计数值显示为什么没有拖影? 答:在程序结束后执行清屏语句:计数显示是每次重新赋值,所以不会出现拖影。 二、实验目的和效果(效果即是否达到实验目的,达到的程度如何) (1)深入学习、理解、掌握OLED字符显示方法 (2)深入学习、理解、掌握OLED图形显示方法 (3)学习、理解、掌握中断使用方法 实验效果图: 三、实验内容和步骤(重点阐述自己的思路及遇到的问题)

嵌入式系统设计性实验报告

嵌入式系统设计性实验报告 水温控制系统 院别:控制工程学院 专业:自动 学号:5090633 姓名:邱飒飒 指导老师:孙文义 2012年6月8日

嵌入式系统设计性实验报告 作者:邱飒飒班级:50906 学号:5090633 摘要:在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大的提高产品的质量和数量。因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题.该实验设计基于飞思卡尔MC9S12DG128开发板平台,根据实验任务要求,完成了基于单片机的水温自动控制系统的设计该实验设计基于飞思卡尔MC9S12DG128开发板平台,根据实验任务要求,完成了水温自动控制系统的设计。 关键字:水温控制单片机MC9S12DG128 一、系统设计的功能 1.1 水温控制系统设计任务和要求 该系统为一实验系统,系统设计任务: 设计并制作一个水温自动控制系统,控制对象为1升净水,容器为搪瓷器皿。 水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。同时满足以下要求: (1)温度设定范围为40~90℃,最小区分度为1℃,标定温度≤1℃。 (2)环境温度降低时(例如用电风扇降温)温度控制的静态误差≤1℃。 (3)用十进制数码管显示水的实际温度保留一位小数。 (4)采用适当的控制方法(如数字PID),当设定温度突变(由40℃提高到60℃)时,减小系统的调节时间和超调量。 (5)温度控制的静态误差≤0.2℃。 (6)从串口输出水温随时间变化的数值。 1.2 水温控制系统部分 水温控制系统是一个过程控制系统,组成框图如下所示,有控制器、执行器、被控对象及其反馈作用的测量变送组成。 图1 控制系统框图 1.3 系统总体功能分析 本系统是一个简单的单回路控制系统,为了实现温度的测量及自动控制,根据任务要求及要求,系统由单片机系统,前向通道,后向通道,及人机通话四个模块构成。总体框图如图2 所示。

嵌入式系统实验报告

嵌入式系统实验报告文件排版存档编号:[UYTR-OUPT28-KBNTL98-UYNN208]

大连理工大学 本科实验报告 课程名称:嵌入式系统实验 学院(系):电子信息与电气工程学部 专业:自动化 班级: 0804 学号: 学生姓名:何韬 2011年 11月 18日 大连理工大学实验报告 学院(系):电信专业:自动化班级: 0804 姓名:何韬学号:组: ___ 实验时间: 2011-11-12 实验室: d108 实验台: 指导教师签字:成绩: 实验二ARM的串行口实验 一、实验目的和要求 见预习报告 二、实验原理和内容 见预习报告 三、主要仪器设备

硬件:ARM嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC机Pentium100 以上、串口线。 软件:PC 机操作系统win98、Win2000 或WinXP 、ARM SDT 或集成开发环境、仿真器驱动程序、超级终端通讯程序。 四、实验步骤 见预习报告 五、核心代码 在主函数中实现将从串口0接收到的数据发送到串口0() int main(void) { char c1[1]; char err; ARMTargetInit(); 通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务; . OSStart(); /ucos-ii/" /* uC/OS interface */ #include "../ucos-ii/add/" #include "../inc/" #include "../inc/sys/" #include "../src/gui/" #include <> #include <>

嵌入式实验报告

目录 实验一跑马灯实验 (1) 实验二按键输入实验 (3) 实验三串口实验 (5) 实验四外部中断实验 (8) 实验五独立看门狗实验 (11) 实验七定时器中断实验 (13) 实验十三ADC实验 (15) 实验十五DMA实验 (17) 实验十六I2C实验 (21) 实验十七SPI实验 (24) 实验二十一红外遥控实验 (27) 实验二十二DS18B20实验 (30)

实验一跑马灯实验 一.实验简介 我的第一个实验,跑马灯实验。 二.实验目的 掌握STM32开发环境,掌握从无到有的构建工程。 三.实验内容 熟悉MDK KEIL开发环境,构建基于固件库的工程,编写代码实现跑马灯工程。通过ISP 下载代码到实验板,查看运行结果。使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。 四.实验设备 硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。 软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。 五.实验步骤 1.熟悉MDK KEIL开发环境 2.熟悉串口编程软件ISP 3.查看固件库结构和文件 4.建立工程目录,复制库文件 5.建立和配置工程

6.编写代码 7.编译代码 8.使用ISP下载到实验板 9.测试运行结果 10.使用JLINK下载到实验板 11.单步调试 12.记录实验过程,撰写实验报告 六.实验结果及测试 源代码: 两个灯LED0与LED1实现交替闪烁的类跑马灯效果,每300ms闪烁一次。七.实验总结 通过本次次实验我了解了STM32开发板的基本使用,初次接触这个开发板和MDK KEILC 软件,对软件操作不太了解,通过这次实验了解并熟练地使用MDK KEIL软件,用这个软件来编程和完成一些功能的实现。作为STM32 的入门第一个例子,详细介绍了STM32 的IO口操作,同时巩固了前面的学习,并进一步介绍了MDK的软件仿真功能。

嵌入式系统实验报告

实验一系统认识实验 一、实验目的 学习Dais软件的操作,熟悉程序编写的操作步骤及调试方法。 二、实验设备 PC计算机一台,Dais-52PRO+或Dais-PRO163C实验系统一套。 三、实验内容 编写程序,将80h~8Fh共16 个数写入单片机内部RAM 的30h~3Fh空间。 四、实验步骤 1.运行Dais软件,进入集成开发环境,软件弹出设置通信端口对话框(如图2-1-1), 请确保实验装置与PC正确连接,并已打开实验装置电源,使其进入在待命状态。 这里选择与实验装置实际相连的通信端口,并单击“确定”。如通信正确则进入Dais 软件主界面,否则弹出“通信出错”的信息框(如图2-1-2),请检查后重试。 图2-1-1设置通信端口对话框图2-1-2通信错误信息框 2.通信成功后,单击菜单栏“设置”→“仿真模式”项打开对话框,选择需要设置型 号、程序/数据空间。这里我们将型号设置为“MCS-51实验系统”,外部数据区 设置为“系统RAM”,用户程序区设置为“片外(EA=0)”,如图2-1-3所示,最 后单击“确定”按钮保存设置。

图2-1-3设置工作方式对话框 3.工作方式设置完毕后,单击菜单栏“文件”→“新建”项或按Ctrl+N组合键(建 议单击工具栏“”按钮)来新建一个文件,软件会出现一个空白的文件编辑窗口。 4.在新窗口中输入程序代码(A51\2_1.ASM): ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R1,#30H ;片内RAM首地址 MOV A,#80H ;写入数据初值 MOV R7,#16 ;循环变量 LOOP1: MOV @R1,A ;写数据到片内RAM INC R1 ;地址增量 INC A ;数据+1 DJNZ R7,LOOP1 ;循环变量-1,不为0继续 SJMP $ ;结束 END 5.单击菜单栏“文件”→“保存”项(建议单击工具栏“”按钮)保存文件。若 是新建的文件尚未命名,系统会弹出文件保存对话框(如图2-1-4),提示用户选择文件保存的路径和文件名,再单击“保存”按钮。

(完整版)2014完整ARM嵌入式系统实验报告

郑州航空工业管理学院 嵌入式系统实验报告 (修订版) 20 – 20第学期 赵成,张克新编著

院系: 姓名: 专业: 学号: 电子通信工程系 2014年3月制

实验一ARM体系结构与编程方法 一、实验目的 了解ARM9 S3C2410A嵌入式微处理器芯片的体系结构,熟悉ARM微处理器的工作模式、指令状态、寄存器组及异常中断的概念,掌握ARM指令系统,能在ADS1.2 IDE中进行ARM汇编语言程序设计。 二、实验内容 1.ADS1.2 IDE的安装、环境配置及工程项目的建立; 2.ARM汇编语言程序设计(参考附录A): (1)两个寄存器值相加; (2)LDR、STR指令操作; (3)使用多寄存器传送指令进行数据复制; (4)使用查表法实现程序跳转; (5)使用BX指令切换处理器状态; (6)微处理器工作模式切换; 三、预备知识 了解ARM嵌入式微处理器芯片的体系结构及指令体系;熟悉汇编语言及可编程微处理器的程序设计方法。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:UP-NETARM2410-S嵌入式开发平台,J-Link V8仿真器; 2. 软件环境配置

操作系统:Microsoft Windows XP Professional Service Pack 2; 集成开发环境:ARM Developer Suite (ADS) 1.2。 五、实验分析 1.安装的ADS1.2 IDE中包括和两个软件组件。在ADS1.2中建立类型的工程,工程目标配置为;接着,还需要对工程进行、及链接器设置;最后,配置仿真环境为仿真方式。 2.写出ARM汇编语言的最简程序结构,然后在代码段中实现两个寄存器值的加法运算,给出运算部分相应指令的注释。 ; 文件名:

相关文档
最新文档