嵌入式实验报告三

时间:2024.4.5

嵌入式实验报告三

实验时间  2013/6/9                                 报告人         

一、实验目的:

1.学习cygwin;

2.通过上机实验,使学生验证、巩固和充实所学理论知识,加深对相关内容的理解,了解嵌入式Linux的内核布局,掌握内核配置及编译方法。

二、实验要求:

1.安装cygwin及内核源码;

2.配置基于S3c2410处理器的内核选项。

3.编译生成zImage。

三、问题:

1.简述嵌入式开发中和体系结构相关的内核布局,说明哪些目录是在内核移植中需要重点关注的。

Linux内核主要由5个子系统构成:进程调度、内存管理、文件系统、网络接口和进程通信。相互关系如图:

2.简述内核编译的步骤和对应命令的作用,说明zImage、bzImage的异同。 

1. 安装cygwin 

安装路径 d:\cygwin     选择全部安装 All 

2. 准备文件 

复制linux-2.4.18-rmk7-pxa1-mz5.tar  --> /tmp/edukit-2410 

复制 \patch  --> /tmp/edukit-2410 

复制cross-armtools-linux-edukit2410.tar --> /tmp     

3. 安装交叉编译工具&设置系统环境    

$> cd /tmp/  

$> tar -P -xvjf cross-armtools-linux-edukit2410.tar.bz2 

$> ls  

… armtools-linux … 出现类似这样的信息即为正确,…为/tmp/目录下其他内容

$> source armtools-linux/cross-install.sh  

$> ls /usr

… arm-linux … 出现类似这样的信息即为正确,…为/usr/目录下其他内容  

$> source /tmp/edukit-2410/set_env_linux.sh

4. 安装内核源码包 

tar -xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5.tar.bz2

5.  安装内核补丁 

patch -p1 < /tmp/edukit-2410/patch/linux-2.4.18-rmk7-pxa1-mz5.tar.bz2.edukit2410.patch   

6. 编译生成内核 

   make xconfig或make menuconfig 

   选择合适的配置文件或者自己进行相应的配置    

Make dep    

Make zImage 

7. 检测生成的内核镜像是否存在 /arch/arm/boot  

  bzImage和zImage的区别来自于保护模式代码的放置位置: 

1.       众所周知,内核映像包括两部分代码:实模式代码和保护模式代码,当引导装载器装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行中转入CPU保护模式,开始执行32位保护模式代码。

2.       不管是zImage还是bzImage,他们的实模式代码部分都被装入0x9000:0000(物理地址0x90000)-0x9A00:0000(物理地址0x9A000),其0x9000:0000-0x9020:0000是内核引导扇区,现在只是些假代码,无用。0x9020:0000-0x9800:0000是内核实模式代码。内核从这里开始执行。

3.       bzImage的内核映像中的保护模式代码,由引导装载器直接装载入高位内存(物理地址0x100000),就是1M以上。内核实模式代码在完成检查引导装载器兼容性(旧loader可能把实模式代码放在不是0x90000的其他地方,这是需要移到这里),A20初始化gdt,idt(全局描述表,和中断描述表)之后,就将CPU初始化为保护模式,然后跳转到0x100000。至此内核活了起来,他进入了强大的32位线性地址空间执行。由于bzImage是在1M以上,所以它的大小理论上是没有限制的。

4.        zImage的的内核映像中的保护模式代码由引导装载器装载入低位内存0x1000:0000-0x9000:0000(物理地址0x10000-0x90000),然后实模式代码在把它移到从64K=0x10000位置移到4K位置0x1000,然后做和bzImage实模式代码一样的事情,如:检查引导装载器兼容性,A20,初始化gdt,idt(全局描述表,和中断描述表),最后进入保护模式代码执行,0x100:0000(物理地址0x1000)位置。所以我们看到保护模式代码范围必须是0x10000-0x90000,大小是512K字节,再大就会覆盖实模式安装代码。所以zImage的内核最大只能512K.

四、实验心得:  

在这次试验中已经完全熟练了cygwin的安装,这次试验花费的时间比较长,用了两节实验课的时间才完成,第一次实验课没有成功。再课后花了些时间操作,在第二次的试验课的时候成功完成了,不过中间也遇到了一些小问题。要学好还要继续努力。


第二篇:北航ARM9嵌入式实验报告3


实验三 基于实时操作系统?C/OS-II实验

一、 实验目的

1. 掌握在内核移植了uCOS-II 的处理器上创建任务的方法。

2. 了解uCOS-II内核的主要结构。

二、 实验内容

1. 运行C盘的实验十,在超级终端上观察两个任务的切换。

2. 创建第三个任务,在超级终端上打印第三个任务。

3. 任务1~3,每个控制“红”、“绿”、“蓝”一种颜色的显示,适当增加OSTimeDly()的时间,且优先级高的任务延时时间加长,以便看清三种颜色。

4. 引入一个全局变量 BOOLEAN ac_key,解决完整刷屏问题。

5. 创建任务4,#define rUTRSTAT0 (*(volatile unsigned *)0x50000010) #define RdURXH0() (*(volatile unsigned char *)0x50000024)

6. 当键盘有输入时在超级终端上显示相应的字符。

三、 预备知识

1. 了解uCOS-II的系统结构。

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

四、 实验设备

硬件:模拟电压信号源、2410s教学实验箱、PC机Pentium100以上、ARM920T的JTAG仿真器、串口连接线。

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

五、 实验步骤

1 以实验十为模板,将实验六 inc目录下的LCD320.H 和src目录下的LCD640.C拷到 模板下的相应目录。

包含以下头文件 #include “inc/lcd320.h”。

改LCD640.C 文件中包含头文件的路径 。

#include "lcd320.h ”

#include "reg2410.h”

4 声明引用的变量 extern U32 LCDBufferII2[480][640];

5 程序代码如下:

/***************************************************************************\

Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved. 5

by threewter 2004.5.12

\***************************************************************************/

/***************************************************************************\

#说明: C main 函数,ucos-ii初始化等定义

---------------------------------- Bug --------------------------------------

---------------------------------- TODO list --------------------------------------

----------------------------------修正--------------------------------------

2004-5-12 创建

\***************************************************************************/

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

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

#include "../inc/drivers.h"

#include "../inc/sys/lib.h"

#include "../src/gui/gui.h"

#include "../inc/lcd320.h"

#include <string.h>

#include <stdio.h>

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

OS_EVENT *MboxSem;

extern U32 LCDBufferII2[480][640];

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

/*OS_STK SYS_Task_Stack[STACKSIZE]= {0, }; //system task刷新任务堆栈 #define SYS_Task_Prio 1

void SYS_Task(void *Id);*/

OS_STK task1_Stack[STACKSIZE]={0, }; //Main_Test_Task堆栈

void Task1(void *Id); //Main_Test_Task

#define Task1_Prio 12 //任务优先级

OS_STK task2_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈

void Task2(void *Id); //test_Test_Task

#define Task2_Prio 15

OS_STK task3_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈

void Task3(void *Id); //test_Test_Task

#define Task3_Prio 17

2

OS_STK task4_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈

void Task4(void *Id); //test_Test_Task

#define Task4_Prio 10

int i,j,k;

U32 jcolor;

BOOLEAN ac_key;

void Uart_SendByten(int,U8);

char Uart_Getchn(char* Revdata, int Uartnum, int timeout);

#define U8 unsigned char

#define TRUE 1

#define FALSE 0

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

#define rUTRSTAT0 (*(volatile unsigned *)0x50000010)

#define rUTRSTAT1 (*(volatile unsigned *)0x50004010)

#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)

#define WrUTXH1(ch) (*(volatile unsigned char *)0x50004020)=(unsigned char)(ch)

#define RdURXH0() (*(volatile unsigned char *)0x50000024)

#define RdURXH1() (*(volatile unsigned char *)0x50004024)

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

#define SYS_Task_Prio 1

#define Touch_Screen_Task_Prio 9

#define Main_Task_Prio 12

#define Key_Scan_Task_Prio 58

#define Lcd_Fresh_prio 59

#define Led_Flash_Prio 60

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

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

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

// Main function. //

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

int main(void)

{

ARMTargetInit(); // do target (uHAL based ARM system) initialisation //

ac_key=0;

OSInit(); // needed by uC/OS-II //

LCD_Init(); //LCD初始化

//OSInitUart();

//initOSFile();

//#if USE_MINIGUI==0

// initOSMessage();

5

// initOSDC();

// LoadFont();

//#endif

//loadsystemParam();

// create the tasks in uC/OS and assign increasing //

// priorities to them so that Task3 at the end of //

// the pipeline has the highest priority. //

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

//OSTaskCreate(SYS_Task, (void *)0, (OS_STK *)&SYS_Task_Stack[STACKSIZE-1], SYS_Task_Prio);

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

OSTaskCreate(Task2, (void *)0, (OS_STK *)&task2_Stack[STACKSIZE-1], Task2_Prio);

OSTaskCreate(Task3, (void *)0, (OS_STK *)&task3_Stack[STACKSIZE-1], Task3_Prio);

OSTaskCreate(Task4, (void *)0, (OS_STK *)&task4_Stack[STACKSIZE-1], Task4_Prio);

OSAddTask_Init(0);

BSPprintf(0,"Starting uCOS-II...\n");

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

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

//LCD_ChangeMode(DspGraMode);

OSStart(); // start the OS //

// never reached //

return 0;

}//main

////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void Task1(void *Id)

{

for(;;){

jcolor=0x000000f8; //R 红色

BSPprintf(0,"run task1\n");

if(ac_key==0)

{

ac_key=1;

for (k=0;k<480;k++)

for (j=0;j<640;j++)

LCDBufferII2[k][j]=jcolor;

LCD_Refresh();

ac_key=0;

}

OSTimeDly(9000);

}

4

}

void Task2(void *Id)

{

for(;;){

jcolor=0x0000fc00; //G 绿色 BSPprintf(0,"run task2\n");

if(ac_key==0)

{

ac_key=1;

for (k=0;k<480;k++)

for (j=0;j<640;j++)

LCDBufferII2[k][j]=jcolor; LCD_Refresh();

ac_key=0;

}

OSTimeDly(7000);

}

}

void Task3(void *Id)

{

for(;;){

jcolor=0x00f80000; //B 蓝色 BSPprintf(0,"run task2\n");

if(ac_key==0)

{

ac_key=1;

for (k=0;k<480;k++)

for (j=0;j<640;j++)

LCDBufferII2[k][j]=jcolor; LCD_Refresh();

ac_key=0;

}

OSTimeDly(5000);

}

}

void Task4(void *Id)

{

for(;;){

char a[1];

char err;

err=Uart_Getchn(a,0,0); //从串口采集数据 if (err==TRUE)

Uart_SendByten(0,a[0]); //显示采集的数据 OSTimeDly(10);

}

}

void Uart_SendByten(int Uartnum, U8 data)//ok eric rong 5

{ //int i;

if(Uartnum==0)

{

while(!(rUTRSTAT0 & 0x4)); //Wait until THR is empty.

hudelay(10);

WrUTXH0(data);

}

else

{

while(!(rUTRSTAT1 & 0x4)); //Wait until THR is empty.

hudelay(10);

WrUTXH1(data);

}

}

char Uart_Getchn(char* Revdata, int Uartnum, int timeout)

{

if(Uartnum==0){

if((rUTRSTAT0 & 0x1))//Receive data read

{

*Revdata=RdURXH0();

return TRUE;

}

else

return FALSE;

}

else{

while(!(rUTRSTAT1 & 0x1));//Receive data read

*Revdata=RdURXH1();

return TRUE;

}

}

六、 实验思考

1. 如何提高键盘的响应速度?

答:通过提高键盘读取任务的优先级,同时提高减少键盘读取任务的运行时间间隔可以提高键盘的响应速度。

2. 全局变量 ac_key对共享资源管理有何意义?

答:ac_key的使用保证了缓冲区内只有一个数据可以被一个任务操作,使得这个任务在完成数据复制和LCD刷新的时候不会被其他任务干扰。

6

更多相关推荐:
嵌入式实验报告模板

武汉大学计算机学院08级嵌入式系统设计实验报告班级08级计科5班指导老师武小平学期20xx20xx第1学期小组成员目录一设计题目选择3二实验目的3三实验内容3四实验设备3五实验步骤5六实验结果及测试5七实验总结...

嵌入式系统实验报告

嵌入式系统实验报告姓名:##学号:##班级:计算机科学与技术非师范121班实验一LCD控制一、实验目的1、初步掌握液晶显示屏的使用及其电路设计方法。2、掌握S3C44B0X处理器的LCD控制器的使用。3、通过实…

嵌入式实验报告

嵌入式实验报告姓名邓庆学号1075490019学院通信工程学院实验一电源复位时钟管理单元一实验目的1了解如何配置不同的时钟2如何使用MRCC的功能而读取芯片上不用的时钟的当前状态和频率3如何处理外部4MHZ的石...

嵌入式系统实验报告

嵌入式系统实验报告学院测量与通信工程学院专业信号与信息处理学生姓名姜元学号1320xx0050指导教师董静薇一实验目的了解BootLoader的基本概念和框架结构了解BootLoader引导操作系统的过程掌握b...

嵌入式系统实验报告

嵌入式系统实验报告小组成员指导老师实验三键盘及LED驱动实验一实验目的1学习键盘及LED驱动原理2掌握ZLG7289芯片的使用方法二实验内容通过ZLG7289芯片驱动17键的键盘和8个共阴极LED将按键值在LE...

嵌入式系统实验报告

大连理工大学本科实验报告课程名称嵌入式系统实验学院系电子信息与电气工程学部专业自动化班级0804学号20xx81197学生姓名何韬20xx年11月18日大连理工大学实验报告学院系电信专业自动化班级0804姓名何...

嵌入式系统实验报告书

郑州航空工业管理学院嵌入式系统实验报告书院系姓名专业学号指导老师电子通信工程系电子信息工程电子通信工程系20xx年11月制实验一认识嵌入式开发平台一实验目的认识UPNETARM2410S嵌入式开发平台了解使用的...

嵌入式系统实验报告

嵌入式系统设计实验报告班级学号姓名成绩指导教师20xx061420xx061411刘群峰赵国冬孟昭林1实验一11实验名称博创UP3000实验台基本结构及使用方法12实验目的1熟悉UPnet3000实验平台的核心...

嵌入式系统技术实验报告

南京理工大学嵌入式系统技术实验报告指导老师作者学院系班级学号实验日期实验一熟悉Linux开发环境一实验目的熟悉Linux开发环境学会基于S3C2410的Linux开发环境的配置和使用使用Linux的armv4l...

嵌入式实验报告书

江苏科技大学嵌入式linux实验报告姓名梅发同学号09428261241江苏科技大学实验一熟悉嵌入式系统开发环境一实验目的1熟悉嵌入式系统硬件实验平台2掌握超级终端配置方法3掌握嵌入式系统开发环境配置ARMLi...

嵌入式实验报告

重庆邮电大学研究生堂下考试答卷20xx20xx学年第2学期考试科目嵌入式系统开发技术姓名李才齐年级20xx级专业仪器科学与技术20xx年4月28日一实验题目实验题目QT程序设计之数码管二实验目的实验目的1学会开...

嵌入式系统实训报告

重庆航天职业技术学院课程作业课程名称班级学号姓名成绩前言嵌入式系统是基于单片机的一种升级版它是以应用为中心以计算机技术为基础软件硬件可裁剪适应应用系统对功能可靠性成本体积功耗严格要求的专用计算机系统我们可从几方...

嵌入式实验报告(29篇)