文档库 最新最全的文档下载
当前位置:文档库 › 实验2:存储器的分配与回收

实验2:存储器的分配与回收

实验2:存储器的分配与回收
实验2:存储器的分配与回收

实验报告学院(系)名称:计算机与通信工程学院

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

#include

using namespace std;

typedef struct Ramtable //内存表结构体

{

int use; //是否被占用,=0未被占用,=1被占用

}Ramtable;

typedef struct FreeRamtable //空闲地址登记表结构体

{

int FreeRamSize; //空闲占用内存大小

int FreeStartAdd; //空闲起始地址

int FreeEndAdd; //空闲结束地址

int FreeNumber; //按照顺序的空闲分区编号(由地址的从前到后)

}FreeRamtable;

typedef struct UsedRamtable //已分配区地址登记表结构体

{

int UsedRamSize; //已分配区地址占用大小

int UsedStartAdd; //已分配区起始地址

int UsedEndAdd; //已分配区结束地址

int UsedNumber; //按照作业占用的内存起始地址顺序的排序编号

string WorkName; //作业名称

}UsedRamtable;

Ramtable Ram[100]={0}; //内存表

FreeRamtable FreeRam[51]; //空闲地址登记表

UsedRamtable UsedRam[100]; //已分配区地址登记表

int WorkNumber=0; //当前作业数注意:全局变量只能计算一次,再次计算需先置零int FreeWorkNumber=0; //当前空闲区数注意:全局变量只能计算一次,再次计算需先置零int Choose; //选择三种算法的一种

string name; //作业的名字

int WorkSize; //作业所占内存大小

void CountWorkNumber() //计算当前作业数

{

for(int i=0;i<100;i++)

{

if(UsedRam[i].WorkName=="")

break;

else

WorkNumber++;

}

}

void CountFreeWorkNumber()

{

for(int i=0;i<51;i++)

{

FreeWorkNumber++;

else

break;

}

}

void InitWorkName() //初始化已分配内存登记表的第一个记录,使其名字为空,方便计算{

UsedRam[0].WorkName="";

FreeRam[0].FreeRamSize=100;

FreeRam[0].FreeStartAdd=0;

FreeRam[0].FreeEndAdd=99;

FreeRam[1].FreeStartAdd=-1;

}

void GetWork()

{

cout<<"Please Enter Work`s name and ram size:";

cin>>name>>WorkSize;

cout<<"Enter 1 using Quick arithmetic"<

cout<<"Enter 2 using Best arithmetic"<

cout<<"Enter 3 using Worst arithmetic: ";

cin>>Choose;

cout<

}

int Quick() //最先适应算法

{

int i;

for(i=0;i<51;i++)

if(FreeRam[i].FreeRamSize>=WorkSize)

break;

if(i==51)

{

cout<<"ERROR! No Enough FreeRam Lefe!"<

return -1; //找不到合适的空间时返回-1,方便进行下一步操作}

return i; //返回值是指示第几个空闲区的下标

}

int Best() //最佳适应算法

{

int temp=-1;

for(int i=0;i<51;i++)

{

if(FreeRam[i].FreeRamSize>=WorkSize)

{

if(temp<0)

else

{

if(FreeRam[temp].FreeRamSize>FreeRam[i].FreeRamSize)

temp=i;

}

}

}

if(temp<0)

{

cout<<"ERROR! No Enough FreeRam Lefe!"<

return -1;

}

return temp;

}

int Worst() //最坏适应算法

{

int temp=-1;

for(int i=0;i<51;i++)

{

if(FreeRam[i].FreeRamSize>=WorkSize)

{

if(temp<0)

temp=i;

else

{

if(FreeRam[temp].FreeRamSize

temp=i;

}

}

}

if(temp<0)

{

cout<<"ERROR! No Enough FreeRam Lefe!"<

return -1;

}

return temp;

}

void Moldification()

{

WorkNumber=0;

CountWorkNumber();

for(int i=0;i

{

for(int j=UsedRam[i].UsedStartAdd;j<=UsedRam[i].UsedEndAdd;j++)

}

}

void Insert()

{

int i;

int k; //找到要插入的作业的所在已分配表中的位置

WorkNumber=0;

FreeWorkNumber=0;

CountWorkNumber(); //计算此时的作业数

CountFreeWorkNumber(); //计算此时的空闲区数

if(Choose==1)

{

i=Quick();

for(int j=0;j<100;j++)

{

if(WorkNumber!=0)

{ //这种情况可能会使k=0,在第一个作业的开始地址比较靠后,且前面是空闲分区if(UsedRam[j].WorkName=="")

{ //这个没有登记作业

k=j;

break;

}

else if(FreeRam[i].FreeEndAdd

{ //已经登记作业,但是需要在此处插入

k=j;

break;

}

}

else

{

k=0;

break;

}

}

if(k!=0)

{

if(UsedRam[k].WorkName!="") //这个格子已经登记过其他作业

{ //即不是数组最后的空的格子

for(int j=WorkNumber;j>k;j--)

{

UsedRam[j].UsedRamSize=UsedRam[j-1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j-1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j-1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j-1].WorkName;

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

UsedRam[WorkNumber+1].WorkName="";

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

else //这个格子还没有登记

{ //即是数组中最后空白中的第一个格子UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

UsedRam[k+1].WorkName="";

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

else //k=0时有两种情况,一种是没有作业,另一种是:

{ //第一个作业的开始地址之前是空闲分区,且大小比插入作业大小大if(WorkNumber==0)

{

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

UsedRam[k+1].WorkName="";

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

else

{

for(int j=WorkNumber;j>0;j++)

{

UsedRam[j].UsedRamSize=UsedRam[j-1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j-1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j-1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j-1].WorkName;

}

UsedRam[WorkNumber+1].WorkName="";

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

int x;

x=1;

}

}

else if(Choose==2)

{

i=Best();

for(int j=0;j<100;j++)

{

if(WorkNumber!=0)

{

if(UsedRam[j].UsedStartAdd==0&&UsedRam[j].UsedEndAdd==0)

{

k=j;

break;

}

else if(FreeRam[i].FreeEndAdd

{

k=j;

break;

}

}

else

{

k=0;

break;

}

}

if(k!=0)

{

if(UsedRam[k].UsedStartAdd!=0)

{

for(int j=WorkNumber;j>k;j--)

{

UsedRam[j].UsedRamSize=UsedRam[j-1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j-1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j-1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j-1].WorkName;

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

else

{

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

}

else

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

}

else if(Choose==3)

{

i=Worst();

for(int j=0;j<100;j++)

{

if(WorkNumber!=0)

{

if(UsedRam[j].UsedStartAdd==0&&UsedRam[j].UsedEndAdd==0)

{

k=j;

break;

}

else if(FreeRam[i].FreeEndAdd

{

k=j;

break;

}

}

else

{

k=0;

break;

}

if(k!=0)

{

if(UsedRam[k].UsedStartAdd!=0)

{

for(int j=WorkNumber;j>k;j--)

{

UsedRam[j].UsedRamSize=UsedRam[j-1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j-1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j-1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j-1].WorkName;

}

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

else

{

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

}

else

{

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

if(FreeRam[i].FreeRamSize>WorkSize)

{

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

}

else

{

for(int j=i;j

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

}

}

}

Moldification();

}

void ShowUsed()

{

cout<

cout<<"UsedRam information: "<

cout<<"No.x\t"<<"Name\t"<<"Size\t"<<"StAdd\t"<<"EndAdd\t"<

for(int i=0;i<100;i++)

{

if(UsedRam[i].UsedStartAdd==0&&UsedRam[i].UsedEndAdd==0)

break;

else

cout<

cout<

cout<

}

}

}

void ShowFree()

{

cout<

cout<<"FreeRam information: "<

cout<<"No.x\t"<<"Size\t"<<"StAdd\t"<<"EndAdd\t"<

for(int i=0;i<51;i++)

{

if(FreeRam[i].FreeStartAdd==-1)

break;

else

{

cout<

cout<

}

}

}

void Init()

{

FreeRam[0].FreeRamSize=3;

FreeRam[0].FreeStartAdd=4;

FreeRam[0].FreeEndAdd=6;

FreeRam[1].FreeRamSize=2;

FreeRam[1].FreeStartAdd=9;

FreeRam[1].FreeEndAdd=10;

FreeRam[2].FreeRamSize=4;

FreeRam[2].FreeStartAdd=14;

FreeRam[2].FreeEndAdd=17;

FreeRam[3].FreeRamSize=79;

FreeRam[3].FreeStartAdd=21;

FreeRam[3].FreeEndAdd=99;

FreeRam[4].FreeStartAdd=-1;

UsedRam[0].WorkName="A";

UsedRam[0].UsedRamSize=4;

UsedRam[0].UsedStartAdd=0;

UsedRam[0].UsedEndAdd=3;

UsedRam[1].WorkName="B";

UsedRam[1].UsedRamSize=2;

UsedRam[1].UsedStartAdd=7;

UsedRam[2].WorkName="C";

UsedRam[2].UsedRamSize=3;

UsedRam[2].UsedStartAdd=11;

UsedRam[2].UsedEndAdd=13;

UsedRam[3].WorkName="D";

UsedRam[3].UsedRamSize=3;

UsedRam[3].UsedStartAdd=18;

UsedRam[3].UsedEndAdd=20;

UsedRam[4].WorkName="";

for(int j=0;j<100;j++)

UsedRam[j].UsedNumber=j+1;

for(int j=0;j<51;j++)

FreeRam[j].FreeNumber=j+1;

Moldification();

}

void RecycleRam()

{

int i;

int m,n;

cout<

cout<<"Please enter work`s number you wanna free:";

cin>>i;

i--;

if(UsedRam[i].UsedStartAdd==0&&UsedRam[i].UsedEndAdd!=0) //这个作业是内存中的从0地址开始的

{

FreeWorkNumber=0;

CountFreeWorkNumber();

if(UsedRam[i].UsedRamSize==100)

{

for(int j=0;j<100;j++) //全部置零

Ram[j].use=0;

UsedRam[0].UsedEndAdd=0;

UsedRam[0].UsedRamSize=0;

UsedRam[0].UsedStartAdd=0;

UsedRam[0].WorkName="";

FreeRam[0].FreeNumber=1;

FreeRam[0].FreeRamSize=100;

FreeRam[0].FreeStartAdd=0;

FreeRam[0].FreeEndAdd=99;

FreeRam[1].FreeStartAdd=-1;

}

else

{

Ram[j].use=0;

WorkNumber=0;

CountWorkNumber();

if(i==WorkNumber-1) //这种情况就是只有一个作业,且从0地址开始

{

FreeRam[0].FreeStartAdd=UsedRam[0].UsedStartAdd;

FreeRam[0].FreeRamSize=FreeRam[0].FreeEndAdd-FreeRam[0].FreeStartAdd+1;

FreeRam[1].FreeStartAdd=-1;

UsedRam[0].UsedRamSize=0;

UsedRam[0].UsedStartAdd=0;

UsedRam[0].UsedEndAdd=0;

UsedRam[0].WorkName="";

}

else

{

if(Ram[UsedRam[i].UsedEndAdd+1].use==1)

{

for(int k=FreeWorkNumber;k>0;k--)

{

FreeRam[k].FreeRamSize=FreeRam[k-1].FreeRamSize;

FreeRam[k].FreeStartAdd=FreeRam[k-1].FreeStartAdd;

FreeRam[k].FreeEndAdd=FreeRam[k-1].FreeEndAdd;

}

FreeRam[FreeWorkNumber+1].FreeStartAdd=-1;

FreeRam[0].FreeStartAdd=UsedRam[i].UsedStartAdd;

FreeRam[0].FreeEndAdd=UsedRam[i].UsedEndAdd;

FreeRam[0].FreeRamSize=FreeRam[0].FreeEndAdd-FreeRam[0].FreeStartAdd+1;

for(int j=0;j

{

UsedRam[j].UsedRamSize=UsedRam[j+1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j+1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j+1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j+1].WorkName;

}

UsedRam[WorkNumber-1].UsedRamSize=0;

UsedRam[WorkNumber-1].UsedStartAdd=0;

UsedRam[WorkNumber-1].UsedEndAdd=0;

UsedRam[WorkNumber-1].WorkName="";

}

else

{

FreeRam[0].FreeStartAdd=UsedRam[i].UsedStartAdd;

//这一行应该定义结束地址的,由于本来就存储了,所以省略

FreeRam[0].FreeRamSize=FreeRam[0].FreeEndAdd-FreeRam[0].FreeStartAdd+1;

{

UsedRam[j].UsedRamSize=UsedRam[j+1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j+1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j+1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j+1].WorkName;

}

UsedRam[WorkNumber-1].UsedRamSize=0;

UsedRam[WorkNumber-1].UsedStartAdd=0;

UsedRam[WorkNumber-1].UsedEndAdd=0;

UsedRam[WorkNumber-1].WorkName="";

}

}

}

}

else

{

if(Ram[UsedRam[i].UsedStartAdd-1].use==0&&Ram[UsedRam[i].UsedEndAdd+1].use==1) { //作业区前面的为空闲区,后面为作业区

m=UsedRam[i].UsedStartAdd-1;

FreeWorkNumber=0;

CountFreeWorkNumber();

for(int j=0;j

{

if(m==FreeRam[j].FreeEndAdd)

{

n=j;

break;

}

}

for(int j=UsedRam[i].UsedStartAdd;j<=UsedRam[i].UsedEndAdd;j++)

Ram[j].use=0;

WorkNumber=0;

CountWorkNumber();

FreeRam[n].FreeEndAdd=UsedRam[i].UsedEndAdd;

FreeRam[n].FreeRamSize=FreeRam[n].FreeEndAdd-FreeRam[n].FreeStartAdd+1;

for(int j=i;j

{

UsedRam[j].UsedRamSize=UsedRam[j+1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j+1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j+1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j+1].WorkName;

}

UsedRam[WorkNumber-1].UsedRamSize=0;

UsedRam[WorkNumber-1].UsedStartAdd=0;

UsedRam[WorkNumber-1].WorkName="";

return ;

}

if(Ram[UsedRam[i].UsedStartAdd-1].use==1&&Ram[UsedRam[i].UsedEndAdd+1].use==0) { //此时是作业区前为作业区,后面为空闲区

m=UsedRam[i].UsedEndAdd+1;

FreeWorkNumber=0;

CountFreeWorkNumber();

for(int j=0;j

{

if(m==FreeRam[j].FreeStartAdd)

{

n=j;

break;

}

}

for(int j=UsedRam[i].UsedStartAdd;j<=UsedRam[i].UsedEndAdd;j++)

Ram[j].use=0;

WorkNumber=0;

CountWorkNumber();

FreeRam[n].FreeStartAdd=UsedRam[i].UsedStartAdd;

FreeRam[n].FreeRamSize=FreeRam[n].FreeEndAdd-FreeRam[n].FreeStartAdd+1;

for(int j=i;j

{

UsedRam[j].UsedRamSize=UsedRam[j+1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j+1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j+1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j+1].WorkName;

}

UsedRam[WorkNumber-1].UsedRamSize=0;

UsedRam[WorkNumber-1].UsedStartAdd=0;

UsedRam[WorkNumber-1].UsedEndAdd=0;

UsedRam[WorkNumber-1].WorkName="";

return ;

}

if(Ram[UsedRam[i].UsedStartAdd-1].use==0&&Ram[UsedRam[i].UsedEndAdd+1].use==0) { //此时作业区前后均有空闲区

m=UsedRam[i].UsedStartAdd-1;

FreeWorkNumber=0;

CountFreeWorkNumber();

for(int j=0;j

{

if(m==FreeRam[j].FreeEndAdd)

{

break;

}

}

for(int j=UsedRam[i].UsedStartAdd;j<=UsedRam[i].UsedEndAdd;j++)

Ram[j].use=0;

WorkNumber=0;

CountWorkNumber();

FreeRam[n].FreeEndAdd=FreeRam[n+1].FreeEndAdd;

FreeRam[n].FreeRamSize=FreeRam[n].FreeEndAdd-FreeRam[n].FreeStartAdd+1;

for(int j=n+1;j

{

FreeRam[j].FreeNumber=FreeRam[j+1].FreeNumber-1;

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

for(int j=i;j

{

UsedRam[j].UsedRamSize=UsedRam[j+1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j+1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j+1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j+1].WorkName;

}

UsedRam[WorkNumber-1].UsedRamSize=0;

UsedRam[WorkNumber-1].UsedStartAdd=0;

UsedRam[WorkNumber-1].UsedEndAdd=0;

UsedRam[WorkNumber-1].WorkName="";

return ;

}

if(Ram[UsedRam[i].UsedStartAdd-1].use==1&&Ram[UsedRam[i].UsedEndAdd+1].use==1) { //此时作业区前后都没有空闲区

m=UsedRam[i].UsedEndAdd;

FreeWorkNumber=0;

CountFreeWorkNumber();

if(m

{

for(int j=FreeWorkNumber;j>0;j--)

{

FreeRam[j].FreeRamSize=FreeRam[j-1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j-1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j-1].FreeEndAdd;

}

FreeRam[0].FreeRamSize=UsedRam[i].UsedRamSize;

FreeRam[0].FreeEndAdd=UsedRam[i].UsedEndAdd;

FreeRam[FreeWorkNumber+1].FreeStartAdd=-1;

}

else if(UsedRam[i].UsedStartAdd>FreeRam[FreeWorkNumber-1].FreeEndAdd) {

FreeRam[FreeWorkNumber].FreeRamSize=UsedRam[i].UsedRamSize;

FreeRam[FreeWorkNumber].FreeStartAdd=UsedRam[i].UsedStartAdd;

FreeRam[FreeWorkNumber].FreeEndAdd=UsedRam[i].UsedEndAdd;

FreeRam[FreeWorkNumber+1].FreeStartAdd=-1;

}

else

{

for(int j=0;j

{

if(m>FreeRam[j].FreeEndAdd&&m

n=j+1;

}

for(int k=FreeWorkNumber;k>n;k--)

{

FreeRam[k].FreeRamSize=FreeRam[k-1].FreeRamSize;

FreeRam[k].FreeStartAdd=FreeRam[k-1].FreeStartAdd;

FreeRam[k].FreeEndAdd=FreeRam[k-1].FreeEndAdd;

}

FreeRam[FreeWorkNumber+1].FreeStartAdd=-1;

FreeRam[n].FreeStartAdd=UsedRam[i].UsedStartAdd;

FreeRam[n].FreeEndAdd=UsedRam[i].UsedEndAdd;

FreeRam[n].FreeRamSize=UsedRam[i].UsedRamSize;

}

for(int j=UsedRam[i].UsedStartAdd;j<=UsedRam[i].UsedEndAdd;j++) Ram[j].use=0;

WorkNumber=0;

CountWorkNumber();

for(int j=i;j

{

UsedRam[j].UsedRamSize=UsedRam[j+1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j+1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j+1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j+1].WorkName;

}

UsedRam[WorkNumber-1].UsedRamSize=0;

UsedRam[WorkNumber-1].UsedStartAdd=0;

UsedRam[WorkNumber-1].UsedEndAdd=0;

UsedRam[WorkNumber-1].WorkName="";

}

}

int main()

{

InitWorkName();

Init();

int a;

cout<<"Enter 1 to insert work"<

cout<<"Enter 2 to recycle work"<

cout<<"Enter 3 to show information"<

cout<<"Enter 0 to exit: ";

cin>>a;

cout<

while(a!=0)

{

if(a==1)

{

GetWork();

Insert();

}

if(a==2)

RecycleRam();

if(a==3)

{

ShowUsed();

ShowFree();

}

cout<<"Enter 1 to insert work"<

cout<<"Enter 2 to recycle work"<

cout<<"Enter 3 to show information"<

cout<<"Enter 0 to exit: ";

cin>>a;

cout<

}

return 0;

}

计算机原理实验二 静态随机存储器实验 操作步骤

2.1 静态随机存储器实验 2.1.1 实验目的 掌握静态随机存储器RAM工作特性及数据的读写方法。 2.1.2 实验设备 PC机一台,TD-CMA实验系统一套。 2.1.3 实验原理 实验原理图如图2-1-3所示,存储器数据线接至数据总线,数据总线上接有8个LED 灯显示D7…D0的内容。地址线接至地址总线,地址总线上接有8个LED灯显示A7…A0的内容,地址由地址锁存器(74LS273,位于PC&AR单元)给出。数据开关(位于IN单元)经一个三态门(74LS245)连至数据总线,分时给出地址和数据。地址寄存器为8位,接入6116的地址A7…A0,6116的高三位地址A10…A8接地,所以其实际容量为256字节。 RD WR 图2-1-3 存储器实验原理图 实验箱中所有单元的时序都连接至时序与操作台单元,CLR都连接至CON单元的CLR 按钮。实验时T3由时序单元给出,其余信号由CON单元的二进制开关模拟给出,其中IOM 应为低(即MEM操作),RD、WR高有效,MR和MW低有效,LDAR高有效。 2.1.4 实验步骤 (1) 关闭实验系统电源,按图2-1-4连接实验电路,并检查无误,图中将用户需要连接的信号用圆圈标明。 (2) 将时序与操作台单元的开关KK1、KK3臵为运行档、开关KK2臵为‘单步’档(时序单元的介绍见附录二)。 (3) 将CON单元的IOR开关臵为1(使IN单元无输出),打开电源开关,如果听到有

‘嘀’报警声,说明有总线竞争现象,应立即关闭电源,重新检查接线,直到错误排除。 图2-1-4 实验接线图 (4) 给存储器的00H、01H、02H、03H、04H地址单元中分别写入数据11H、12H、13H、14H、15H。由前面的存储器实验原理图(图2-1-3)可以看出,由于数据和地址由同一个数据开关给出,因此数据和地址要分时写入,先写地址,具体操作步骤为:先关掉存储器的读写(WR=0,RD=0),数据开关输出地址(IOR=0),然后打开地址寄存器门控信号(LDAR=1),按动ST产生T3脉冲,即将地址打入到AR中。再写数据,具体操作步骤为:先关掉存储器的读写(WR=0,RD=0)和地址寄存器门控信号(LDAR=0),数据开关输出要写入的数据,打开输入三态门(IOR=0),然后使存储器处于写状态(WR=1,RD=0,IOM=0),按动ST产生T3脉冲,即将数据打入到存储器中。写存储器的流程如图2-1-5所示(以向00地址单元写入11H为例): WR = 0 RD = 0 IOM = 0 IOR = 0 LDAR = 0 WR = 0 RD = 0 IOM = 0 IOR = 0 LDAR = 1 T3= WR = 0 RD = 0 IOM = 0 IOR = 0 LDAR = 0 WR = 1 RD = 0 IOM = 0 IOR = 0 LDAR = 0 T3= 图2-1-5 写存储器流程图 (5) 依次读出第00、01、02、03、04号单元中的内容,观察上述各单元中的内容是否与前面写入的一致。同写操作类似,也要先给出地址,然后进行读,地址的给出和前面一样,而在进行读操作时,应先关闭IN单元的输出(IOR=1),然后使存储器处于读状态(WR=0,RD=1,IOM=0),此时数据总线上的数即为从存储器当前地址中读出的数据内容。读存储器的流程如图2-1-6所示(以从00地址单元读出11H为例):

主存空间的分配与回收—首次适应法

主存空间的分配与回收— 首次适应法 This manuscript was revised by the office on December 10, 2020.

南通大学操作系统实验课 实验报告 学生姓名 所在院系 专业 学号 指导教师 南通大学 2014年 5 月 16 日主存空间的分配与回收 ——首次适应法 一、实验目的 主存是中央处理机能直接存取指令和数据的存储器,能否合理而有效地使用它,在很大程度上将影响整个计算机系统的性能。 本实验主要熟悉主存的管理方法以及相应的分配与回收算法。所谓分配,就是解决多道程序或多进程如何共享主存空间的问题,以便各个进程能获得所希望的主存空间,正确运行。所谓回收,就是当进程运行完成时,将其所占用的主存空间归还给系统。 二、实验要求 采用空闲区链法管理空闲区,并增加已分配区表。分配算法采用首次适应法。 三、设计思路: (1)采用空闲区链法管理空闲区,并增加已分配区表。分配算法采用首次适应法(内存空闲区的地址按照从小到大的自然顺序排列),实现内存的分配与回收。 (2)设计一个进程申请序列以及进程完成后的释放顺序,实现主存的分配与回收。

(3)进行分配时应该考虑这样3种情况:进程申请的空间小于、等于或大于系统空闲区的大小。回收时应该考虑这样4种情况:释放区上邻、下邻、上下都邻和都不邻接空闲区。 (4)每次的分配与回收都要求把记录内存使用情况的各种数据结构的变化情况以及各进程的申请、释放情况显示出来。 四、主要思想 (1)输入主存空间的最大长度n创建最大长度总和为n的若干空闲区的主存空闲区链; (2)输入待存作业的长度x,从链头开始找第一个合适作业的空闲区:分区长度小于x时,指针后移,继续寻找;分区长度等于x时,分配空间, 修改作业分区;分区长度大于x时,分配空间,修改分区数据。 五、流程图 1.空闲区链的首次适应算法分配流程图 2.空闲区链的首次适应算法回收流程图 六、调试结果 1.内存的分配 2.内存的回收 3.内存清空 七、总结与感悟 说实话我操作系统学得不是很好,一开始看到题目觉得自己要完成这个实验有些难度。好在老师提醒书上有另一道类似题目的程序代码,另外书上也有首次适应法的流程图,可以给我们一些提示。之后我也参考了网上的相关资料,看看别人是如何实现的,他们都是怎么样的思路和方法,与我一开始的想法相比,比我精妙在哪里。最后自己调试时,遇到了许许多多问题和错误,请教了学得比较好的同学、经过不断的修改和完善之后,终于做完实验。 这次的实验使我了解到,平时对知识的积累相当重要,同时也要注重课上老师的讲解,老师在课上的延伸是课本上所没有的,这些知识对于我们对程序的编写有很大的作用,同时,编程也要求我们有足够的耐心,细细推敲。越着急可能就越无法得到我们想要的结果,遇到不会的问题要多多请教,知识是在实践与向别人请教的过程中积累的,所以问是至关重要的,只要肯下功夫很多东西都是可以完成的。操作系统这门课不但重要而且十分有用,我一定要下功夫把这门课学好。

静态存储器-实验报告

计算机科学与技术系 实验报告 专业名称计算机科学与技术 课程名称计算机组成与结构 项目名称静态随机存储器实验 班级 学号 姓名 同组人员无 实验日期 2015-10-24

一、实验目的与要求 掌握静态随机存储器RAM 工作特性及数据的读写方法 二、实验逻辑原理图与分析 2.1 实验逻辑原理图及分析 实验所用的静态存储器由一片6116(2K ×8bit)构成(位于MEM 单元),如下 图所示。6116有三个控制线:CS(片选线)、OE(读线)、WE(写线),当片选有效(CS=0)时,OE=0时进行读操作,WE=0时进行写操作,本实验将CS 常接地线。 由于存储器(MEM)最终是要挂接到CPU 上,所以其还需要一个读写控制逻辑,使得CPU 能控制MEM 的读写,实验中的读写控制逻辑如下图所示,由于T3的参与,可以保证MEM 的写脉宽与T3一致,T3由时序单元的TS3给出。IOM 用来选择是对I/O 还是对MEM 进行读写操作,RD=1时为读,WR=1时为写。 XMRD XIOR XIOW XMWR RD IOM WE T3 读写控制逻辑 实验原理图如下如所示,存储器数据线接至数据总线,数据总线上接有8 个LED 灯显示D7…D0的内容。地址线接至地址总线,地址总线上接有8个LED 灯显示A7…A0的内容,地址由地址锁存器(74LS273,位于PC&AR 单元)给出。数据开关(位于IN 单元)经一个三态门(74LS245)连至数据总线,分时给出地址和数据。地址寄存器为8位,接入6116的地址A7…A0,6116的高三位地址A10…A8接地,所以其实际容量为256字节。

实验二 数据存储器和程序存储器实验

实验二数据存储器和程序存储器实验 实验目的: 了解DSP内部数据存储器和程序存储器的结构 了解DSP指令的几种寻址方式 实验要求: 主要是对外扩数据存储器进行数据的存储、移动。该实验所需要的硬件主要是DSP、CPLD、DRAM。实验过程是:让学生通过CCS5000的DSP仿真器对DSP 进行仿真,向DSP外扩DRAM写入数据、读数据、数据块的移动,其操作结果通过CCS5000仿真界面进行观察或通过发光二极管观察其正确性。 实验步骤: 经过了实验一以后,相信各位同学对于CCS的基本操作已经了解,故在此不再赘述。 1、以Simulator方式启动CCS,打开项目文件,编译程序,加载目标代码文件。 2、打开各个观察窗口,值得注意的是,本实验需要打开三个内存窗口:Data页的0x2000(.data段)起始处、Data页的0x3000(.stack段)起始处、以及Program页的0x1f00起始处 3、按照实验一的步骤设置断点,观察方法也基本相同,下面仅对各个小段程序进行简要说明: bk0: 通过对XF引脚的置位和复位实现发光二极管的闪烁 bk1: 立即数寻址方式 bk2: 绝对地址寻址方式-数据存储器地址寻址 bk3: 绝对地址寻址方式-程序存储器地址寻址 bk4: 累加器寻址方式 bk5: 直接寻址方式(DP为基准) bk6: 直接寻址方式(SP为基准) bk7: 间接寻址方式 bk8: 存储器映射寄存器寻址方式 bk9: 堆栈寻址方式 bk10: 将程序存储器0x2000为起始地址的0x100个字复制到数据存储器的0x4000为起始地址的空间中

************************************************ * FileName: ex2.asm * * Description: 数据存储器和程序存储器实验* ************************************************ CMD文件: MEMORY { PAGE 0: VECS: origin = 0xff80, length = 0x80 PROG: origin = 0x1000, length = 0x1000 PAGE 1: DATA: origin = 0x2000, length = 0x1000 STACK: origin = 0x3000, length = 0x1000 } SECTIONS { .vectors: {} > VECS PAGE 0 .text: {} > PROG PAGE 0 .data: {} > DATA PAGE 1 .stack: {} > STACK PAGE 1 } 5000系列DSP汇编语言: .title "ex2" ;在清单页头上打印标题 .global reset,_c_int00 ;定义reset和_c_int00两个全局(外部标号),_c_int00是C ; ;行环境的入口点,该入口点在连接的rtsxxx.lib库中,DSP ;复位后,首先跳到0地址,复位向量对应的代码必须跳转 ;到C运行环境的入口点_c_int00. .mmregs ;输入存储器映象寄存器进符号表 .def _c_int00 ;识别定义在当前模块和用在其它模块中的一个或多个符号DA T0 .set 00H ;给符号DAT0设置值为00H DA T1 .set 01H DA T2 .set 02H DA T3 .set 03H DDAT0 .set 2004H DDAT1 .set 2005H DDAT2 .set 2006H DDAT3 .set 2007H PDAT0 .set 1f00H PDAT1 .set 1f01H PDAT2 .set 1f02H PDAT3 .set 1f03H .sect ".vectors" ;中断向量表, 表示以下语句行汇编进名为.vectors的初始化段, ;若用户的程序是要写进EPROM并在上电之后直接运 ;行,则必须包含Vectors.asm文件,这个文件的代码将作为IST ;(中断服务表),并且必须被连接命令文件(.cmd)分配到0 ;地址,DSP复位后,首先跳到0地址,复位向量对应的代码

实验存储器部件实验(精品)

北京林业大学 11学年—12学年第 2 学期计算机组成原理实验任务书 专业名称:计算机科学与技术实验学时: 2 课程名称:计算机组成原理任课教师:张海燕 实验题目:实验四内存储器部件实验 实验环境:TEC-XP+教学实验系统、PC机 实验内容 1.设计扩展8K字存储器容量的线路图,标明数据线、地址线和控制信号的连接关系。 2.扩展教学机的存储器空间,为扩展存储器选择一个地址,并注意读写等控制信号的正确状态。 3.用监控程序的D、E命令对存储器进行读写,比较RAM(6116)、EEPROM (58C65)在读写上的异同。 4.用监控程序的A命令编写一段程序,对RAM(6116)进行读写,用D命令查看结果是否正确。 5.用监控程序的A命令编写一段程序,对扩展存储器EEPROM(58C65)进行读写,用D命令查看结果是否正确;如不正确,分析原因,改写程序,重新运行。 实验目的 1.熟悉ROM芯片和RAM芯片在功能和使用方法等方面的相同和差异之处。 2.理解并熟悉通过字、位扩展技术实现扩展存储器系统容量的方案。 3.了解如何通过读、写存储器的指令实现对58C65ROM芯片的读、写操作。 4.加深理解存储器部件在计算机整机系统中的作用。 实验要求 1.实验之前认真预习,明确实验的目的和具体实验内容,做好实验之前的

必要准备。 2.想好实验的操作步骤,明确通过实验到底可以学习哪些知识,想一想怎么样有意识地提高教学实验的真正效果; 3.在教学实验过程中,要爱护教学实验设备,记录实验步骤中的数据和运算结果,仔细分析遇到的现象与问题,找出解决问题的办法,有意识地提高自己创新思维能力。 4.实验之后认真写出实验报告,重点在于预习时准备的内容,实验数据,运算结果的分析讨论,实验过程、遇到的现象和解决问题的办法,自己的收获体会,对改进教学实验安排的建议等。善于总结和发现问题,写好实验报告是培养实际工作能力非常重要的一个环节,应给以足够的重视。 实验说明 内存储器是计算机中存放正在运行中的程序和相关数据的部件。在教学计算机存储器部件设计中,出于简化和容易实现的目的,选用静态存储器芯片实现内存储器的存储体,包括只读存储区(ROM、存放监控程序等)和随读写存储区(RAM)两部分,ROM存储区选用4片长度8位、容量8KB的58C65芯片实现,RAM存储区选用2片长度8位、容量2KB的6116芯片实现,每2个8位的芯片合成一组用于组成16位长度的内存字,6个芯片被分成3组,其地址空间分配关系是:0-1777H用于第一组ROM,固化监控程序,2000-2777H用于RAM,保存用户程序和用户数据,其高端的一些单元作为监控程序的数据区,第二组ROM的地址范围可以由用户选择,主要用于完成扩展内存容量(存储器的字、位扩展)的教学实验。 在这里还要说明如下两个问题。 第一,要扩展8K字的存储空间,需要使用2片(每一片有8KB容量,即芯片内由8K个单元、每个单元由8个二进制位组成)存储器芯片实现。 第二,当存储器选用58C65ROM芯片时,它属于电可擦除的EPROM器件,可以通过专用的编程器软件和设备向芯片的写入相应的内容,这是正常的操作方式。也可以通过写内存的指令向芯片的指定单元写入16位的数据,只是每一次的这种写操作需要占用长得多写入时间,例如几百个微秒,可以通过运行完成等待功能的子程序来加以保证。本次试验采用的是通过写内存的指令将数据写入芯片

操作系统实验四报告-主存空间分配和回收(含源码)分析

计算机学院计算机科学与技术专业班学号 姓名教师评定_________________ 实验题目主存空间的分配和回收 一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:IBM-PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理,在系统运行当然开始,假设初始状态下,可用的内存空间为640KB,存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后,分给作业1(130KB),随着作业1、2、3的进入,分别分配60KB、100KB,经过一段时间的运行后,作业2运行完毕,释放所占内存。此时,作业4进入系统,要求分配200KB内存。作业3、1运行完毕,释放所占内存。此时又有作业5申请140KB,作业6申请60KB,作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理,使用空闲分区链实现主存分配和回收。

计算机组成原理存储器读写和总线控制实验实验报告

信息与管理科学学院计算机科学与技术 实验报告 课程名称:计算机组成原理 实验名称:存储器读写和总线控制实验 姓名:班级:指导教师:学号: 实验室:组成原理实验室 日期: 2013-11-22

一、实验目的 1、掌握半导体静态随机存储器RAM的特性和使用方法。 2、掌握地址和数据在计算机总线的传送关系。 3、了解运算器和存储器如何协同工作。 二、实验环境 EL-JY-II型计算机组成原理实验系统一套,排线若干。 三、实验内容 学习静态RAM的存储方式,往RAM的任意地址里存放数据,然后读出并检查结果是否正确。 四、实验操作过程 开关控制操作方式实验 注:为了避免总线冲突,首先将控制开关电路的所有开关拨到输出高电平“1”状态,所有对应的指示灯亮。 本实验中所有控制开关拨动,相应指示灯亮代表高电平“1”,指示灯灭代表低电平“0”。连线时应注意:对于横排座,应使排线插头上的箭头面向自己插在横排座上;对于竖排座,应使排线插头上的箭头面向左边插在竖排座上。 1、按图3-1接线图接线: 2、拨动清零开关CLR,使其指示灯显示状态为亮—灭—亮。 3、往存储器写数据:

以往存储器的(FF ) 地址单元写入数据“AABB ”为例,操作过程如下: 4、按上述步骤按表3-2所列地址写入相应的数据 表3-2 5、从存储器里读数据: 以从存储器的(FF ) 地址单元读出数据“AABB ”为例,操作过程如下: (操作) (显示) (操作) (显示) (操作) (显6、按上述步骤读出表3-2数据,验证其正确性。 五、实验结果及结论 通过按照实验的要求以及具体步骤,对数据进行了严格的检验,结果是正确的,具体数据如图所示:

实验二 I2C存储器实验

I2C存储器实验 实验目的 1、了解I2C总线的工作原理 2、掌握I2C总线驱动程序的设计和调试方法 3、掌握I2C总线存储器的读写方法 实验仪器 单片机开发板、稳压电源、计算机 实验原理 1、 I2C总线常识 I2C总线采用一个双线式漏极开路接口,可在一根总线上支持多个器件和主控器。所连接的器件只会把总线拉至低电平,而决不会将其驱动至高电平。总线在外部通过一个电流源或上拉电阻器连接至一个正电源电压。当总线空闲时,两条线路均为高电平。在标准模式中,I2C 总线上的数据传输速率高达100kbit/s,而在快速模式中则高达400kbit/s。 I2C总线上的每个器件均由一个存储于该器件中的唯一地址来识别,并可被用作一个发送器或接收器(视其功能而定)。除了发送器和接收器之外,在执行数据传输时,还可把器件视作主控器或受控器。主控器是负责启动总线上的数据传输并生成时钟信号以允许执行该传输的器件。同时,任何被寻址的器件均被视作受控器。 CAT24WC01/02/04/08/16是一个1K/2K/4K/8K/16K位串行CMOS EEPROM,内部含有128/256/512/1024/2048个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗,CAT24WC01有一个8字节页写缓冲器,CAT24WC02/04/08/16有一个16字节页写缓冲器,该器件通过I2C总线接口进行操作,有一个专门的写保护功能,并且器件能与400KHzI2C 总线兼容。 引脚名称和功能如图1所示。 图1 24系例I2C存储器引脚说明 通过器件地址输入端A0、A1和A2可以实现将最多8个24WC01和24WC02器件4个24WC04器件,2个24WC08器件和1个24WC16器件连接到总线上。 2、I2C总线协议 (1)只有在总线空闲时才允许启动数据传送。 (2)在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变。时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。 (3)起始信号 时钟线保持高电平期间,数据线电平从高到低的跳变作为I2C 总线的起始信号。 (4) 停止信号 时钟线保持高电平期间,数据线电平从低到高的跳变作为I2C 总线的停止信号。I2C 总线时序:

动态内存分配和回收

实验五可变分区存储管理方式的内存分配和回收 一.实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。 二.实验属性 设计 三.实验内容 1.确定内存空间分配表; 2.采用最优适应算法完成内存空间的分配和回收; 3.编写主函数对所做工作进行测试。 四.实验背景材料 实现可变分区的分配和回收,主要考虑的问题有三个:第一,设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计内存分配算法;第三,在设计的数据表格基础上设计内存回收算法。 首先,考虑第一个问题,设计记录内存使用情况的数据表格,用来记录空间区和作业占用的区域。 由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在内存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收内存分区时,可能会合并空闲分区,这样如果整个内存采用一张表格记录己分分区和空闲区,就会使表格操作繁琐。分配内存时查找空闲区进行分配,然后填写己分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,内存的分配和回收主要是对空闲区的操作。这样为了便于对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张表格记录作业占用分区的“己分分区表”;一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种:一种是链表形式,一种是顺序表形式。在实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数。 “已分分区表”的结构定义 #define n 10 //假定系统允许的最大作业数量为n struct { float address; //已分分区起始地址 float length; //已分分区长度、单位为字节 int flag; //已分分区表登记栏标志,“0”表示空栏目,实验中只支持一个字符的作业名 }used_table[n]; //已分分区表 “空闲区表”的结构定义 #define m 10 //假定系统允许的空闲区最大为m struct

计算机组成原理实验报告二半导体存储器原理实验

半导体存储器原理实验 一、实验目的: 1、掌握静态存储器的工作特性及使用方法。 2、掌握半导体随机存储器如何存储和读取数据。 二、实验要求: 按练习一和练习二的要求完成相应的操作,并填写表2.1各控制端的状态及记录表2.2的写入和读出操作过程。 三、实验方案及步骤: 1、按实验连线图接线,检查正确与否,无误后接通电源。 2、根据存储器的读写原理,按表2.1的要求,将各控制端的状态填入相应的栏中以方便实验的进行。 3、根据实验指导书里面的例子练习,然后按要求做练习一、练习二的实验并记录相关实验结果。 4、比较实验结果和理论值是否一致,如果不一致,就分析原因, 然后重做。 四、实验结果与数据处理: (1)表2.1各控制端的状态

2)练习操作 数据1:(AA)16 =(10101010)2 写入操作过程: 1)写地址操作: ①应设置输入数据的开关状态:将试验仪左下方“ INPUT DEVICE ”中的8位数据开关D7-D0 设置为00000000 即可。 ②应设置有关控制端的开关状态:先在实验仪“SWITCH UNIT ”中打开输入三态门控制端,即SW-B=0 ,打开地址寄存器存数控制信号,即LDAR=1, 关闭片选信号(CE ),写命令信号(WE )任意,即CE=1,WE=0 或1。 ③应与T3 脉冲配合可将总线上的数据作为地址输入AR 地址寄存器中:按一下微动开关START 即可。 ④应关闭AR 地址寄存器的存数控制信号:LDAR=0 。 2)写内容操作: ①应设置输入数据的开关状态:将试验仪左下方“ INPUT DEVICE ”中的8位数据开关D7-D0 设置为10101010 。 ②应设置有关控制端的开关状态:在实验仪“SWITCH UNIT ”中打开输入三态门控制端, 即SW-B=O,关闭地址寄存器存数控制信号,即LDAR=O,打开片选信号(CE )和写命令 信号(WE),即CE=0,WE=1。 ③应与T3 脉冲配合可将总线上的数据写入存储器6116的00000000地址单元中:再按一下 微动开关START 即可。 ④应关闭片选信号和写命令信号:即CE=1,WE=0。 读出操作过程: 1 )写地址操作:参考写入操作的写地址操作 2)读内容操作: ①关闭输入三态门控制端,即SW-B=1。 ②地址寄存器存数控制信号(LDAR)任意,不过最好关闭,即LDAR=0 ,防止误按脉冲信号存入数据。 ③关闭写命令信号(WE),即WE=0,打开片选信号(CE),即CE=0,不需要T3脉冲,即 不要按微动开关START。此时00000000地址的内容通过“ BUS UNIT ”中数据显示灯B7-B0 显示出来。 数据2:(55)16 =(01010101)2 写入操作过程: 1)写地址操作: ①设置输入数据的开关状态:将试验仪左下方“ INPUT DEVICE ”中的8位数据开关D7-D0 设置为

静态存储器实验报告

静态随机存储器实验 组员: 组号:21组 日期:周二5、6节

【实验目的】 掌握静态随机存储器RAM工作特性及数据的读/写方法。 【实验设备】 实验仪一台、PC机一台(观察波形) 【实验原理】 由一片6116(2K x 8)芯片、一片8位锁存器(74LS273)、一片8位三态门(74LS245)构成存储器原理图。 存储器实验原理图 由于存储器地址是由数据开关(input device)锁存在(273),存储器写数据也是由数据开关提供的,因此要分时给出地址和写数据。 因地址寄存器为8 位,所以接入6116 的地址为A7~A0,而高三位A8~A10 接地,所以其实际容量为256 字节。6116 有三个控制线:CE(片选线)、OE(读线)、WE(写线)。当片选有效(CE=0)时,OE=0 时进行读操作,WE=0 时进行写操作。本实验中将OE 常接地,在此情况下,当CE=0、WE=0 时进行读操作,CE=0、WE=1 时进行写操作,其写时间与T3 脉冲宽度一致。 实验时将T3 脉冲接至实验板上时序电路模块的TS3 相应插孔中,其脉冲宽度可调,其它电平控制信号由“SWITCH UNIT”单元的二进制开关模拟,其中SW-B 为低电平有效,LDAR 为高电平有效。 【实验步骤】 (1) 形成时钟脉冲信号T3。具体接线方法和操作步骤如下: ①接通电源,用示波器接入方波信号源的输出插孔H23,调节电位器W1 及W2 ,使H23 端输出 实验所期望的频率及占空比的方波。 ②将时序电路模块(STATE UNIT)单元中的ф和信号源单元(SIGNAL UNIT)中的H23 排针相连。 ③在时序电路模块中有两个二进制开关“STOP”和“STEP”。将“STOP”开关置为“RUN”状

实验一 存储器实验

实验一存储器实验 1.FPGA中LPM_ROM定制与读出实验 一.实验目的 1、掌握FPGA中lpm_ROM的设置,作为只读存储器ROM的工作特性与配置方法。 2、用文本编辑器编辑mif文件配置ROM,学习将程序代码以mif格式文件加载于 lpm_ROM中; 3、在初始化存储器编辑窗口编辑mif文件配置ROM; 4、验证FPGA中mega_lpm_ROM的功能。 二.实验原理 ALTERA的FPGA中有许多可调用的LPM (Library Parameterized Modules)参数化的模块库,可构成如lpm_rom、lpm_ram_io、lpm_fifo、lpm_ram_dq的存储器结构。CPU 中的重要部件,如RAM、ROM可直接调用她们构成,因此在FPGA中利用嵌入式阵列块EAB 可以构成各种结构的存储器,lpm_ROM就是其中的一种。lpm_ROM有5组信号:地址信号address[ ]、数据信号q[ ]、时钟信号inclock、outclock、允许信号memenable,其参数都就是可以设定的。由于ROM就是只读存储器,所以它的数据口就是单向的输出端口,ROM中的数据就是在对FPGA现场配置时,通过配置文件一起写入存储单元的。图3-1-1中的lpm_ROM有3组信号:inclk——输入时钟脉冲;q[23、、0]——lpm_ROM的24位数据输出端;a[5、、0]——lpm_ROM的6位读出地址。 实验中主要应掌握以下三方面的内容: ⑴ lpm_ROM的参数设置; ⑵ lpm_ROM中数据的写入,即LPM_FILE初始化文件的编写; ⑶lpm_ROM的实际应用,在GW48_CP+实验台上的调试方法。 三.实验步骤 (1)用图形编辑,进入mega_lpm元件库,调用lpm_rom元件,设置地址总线宽度address[] 与数据总线宽度q[],分别为6位与24位,并添加输入输出引脚,如图3-1-1设置与连接。 (2)设置图3-1-1为工程。 (3)在设置lpm_rom数据参数选择项lpm_file的对应窗口中(图3-1-2),用键盘输入 lpm_ROM配置文件的路径(rom_a、mif),然后设置在系统ROM/RAM读写允许,以便能

主存空间的分配与回收实验报告

主存空间的分配与回收实验报告

实验报告 课程名称:操作系统 实验名称:主存空间的分配与回收学号: 110310014 学生姓名:于钊 班级:信管1101班 指导教师:吴联世 实验日期: 2013 年12月5日

3、采用最先适应算法(顺序分配算法)分配主存空间。 按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。 由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。 4、当一个作业执行完成撤离时,作业所占的分区应该归还给系统,归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在上述中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。 2)程序结构(流程图) 首次适应分配模拟算法

主存回收算法 3)实现步骤 实现动态分区的分配与回收,主要考虑三个问题:第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法;第三,在设计的数据表格基础上设计主存回收算法。 1.设计记录主存使用情况的数据表格 由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时,空闲区有时会变成两个分区:空闲区和已分分区,回收主存分区时,可能会合并空闲区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区贬词空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,主存的分配与回收主要时对空闲区的操作。这样为了便于对主存空间的分配与回收,就建立两张分区表记录主存的使用情况:“已分配区表”记录作业占用分区,“空闲区表”记录空闲区。 这两张表的实现方法一般由两种:链表形式、顺序表形式。在本实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因此在多数情况下,无论是“已分配表区”还是“空闲区表”都是空闲栏目。已分配区表中除了分区起始地址、长度

实验五存储器读写实验报告

实验五存储器读写实验报告 实验报告 课程名:《计算机组成原理》题目:实验五存储器读写班级:计算机+ 自动化0901班姓名:张哲玮,郑俊飞 《计算机组成原理》实验报告- 1 - 实验五、存储器读写实验 一、目的与要求 (1)掌握存储器的工作特性 (2)熟悉静态存储器的操作过程,验证存储器的读写方法 二、实验原理及原理图 (1)?静态存储器芯片6116的逻辑功能 6116是一种数据宽度为8位(8个二进制位),容量为2048字节的静态存储器芯片,封在24引脚的封装中,封装型式如图2-7所示。6116芯片有8根双向三态数据线D7-D0,所谓三态是指输入状态,输出状态和高阻状态,高阻状态数据线处于一种特殊的“断开”状态;11根地址线A10-A0,指示芯片内部2048个存储单元号;3根控制线CS片选控制信号,低电平时,芯片可进行读写操作,高电平时,芯片保存信息不能进行读写;WE 为写入控制信号,低电平时,把数据线上的信息存入地址线A10-A0指示的存储单元中;0E为输出使能控制信号,低电平时,把地址线A10-A0指示的存储单元中的数据读出送到数据线上。

6116芯片控制信号逻辑功能表 (2).存储器实验单元电路 因为在计算机组成原理实验中仅用了256个存储单元,所以6116芯片的3根地址线A11-A8接地也没有多片联用问题,片选信号CS接地使芯片总是处于被选中状态。芯片的WE和0E信号分别连接实验台的存储器写信号M-W和存储器读信号M-Ro这种简化了控制过程的实验电路可方便实验进行。 存储器部件电路图 (3)?存储器实验电路 存储器读\写实验需三部分电路共同完成:存储器单元(MEM UNIT),地址寄存器单元(ADDRESS UNIT)和输入,输出单元(INPUT/OUTPIT UNIT).存储器单元6116芯片为中心构成,地址寄存器单元主要由一片74LS273组成,控制信号B-AR的作用是把总线上的数据送入地址寄存器,向存储器单元电路提供地址信息,输入,输出单元作用与以前相同。

实验二:SRAM 静态随机存储器实验

《计算机组成原理》 实验报告 实验二:SRAM 静态随机存储器实验 学院: 专业: 班级学号: 学生姓名: 实验日期: 指导老师: 成绩评定: 计算机学院计算机组成原理实验室

实验二 一、实验名称:SRAM 静态随机存储器实验 二、实验目的: 掌握静态随机存储器RAM工作特性及数据的读写方法。 三、实验内容: 1、向存储器中指定的地址单元输入数据,地址先输入AR寄存器,在地址灯上显示;再将数据送入总线后,存到指定的存储单元,数据在数据显示灯显示。 2、从存储器中指定的地址单元读出数据, 地址先输入AR寄存器,在地址灯显示; 读出的数据送入总线, 通过数据显示灯显示。 四、实验设备: PC机一台,TD-CMA实验系统一套。 五、实验步骤: 1、关闭实验系统电源,按图2-4 连接实验电路,并检查无误,图中将用户需要连接的信号用圆圈标明。 2、将时序与操作台单元的开关KK1、KK3 置为运行档、开关KK2 置为…单步?档。 3、将CON 单元的IOR 开关置为1(使IN 单元无输出),打开电源开关,如果听到有…嘀?报警声,说明有总线竞争现象,应立即关闭电源,重新检查接线,直到错误排除。

图2-4 4、给存储器的00H、01H、02H、03H、04H 地址单元中分别写入数据11H、12H、13H、14H、15H。 由前面的存储器实验原理图(图2-1-3)可以看出,由于数据和地址由同一个数据开关给出,因此数据和地址要分时写入,先写地址,具体操作步骤为:先关掉存储器的读写(WR=0,RD=0),数据开关输出地址(IOR=0),然后打开地址寄存器门控信号(LDAR=1),按动ST 产生T3 脉冲,即将地址打入到AR 中。再写数据,具体操作步骤为:先关掉存储器的读写(WR=0,RD=0)和地址寄存器门控信号(LDAR=0),数据开关输出要写入的数据,

主存空间的分配与回收

新建云桂铁路 操作系统实验报告 实验三:主存空间的分配与回收 一、实验题目 采用可变式分区管理,使用首次或最佳适应算法实现主存的分配与回收 二、实验内容 主存是中央处理机能直接存取指令和数据的存储器。能否合理而有效地使用主存,在很大程度上将影响到整个计算机系统的性能。本实验采用可变式分区管理,使用首次或最佳适应算法实现主存空间的分配与回收。要求采用分区说明表进行。 三、实验目的 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收。 提示: (1)可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无,则作业等待。 随着作业的装入、完成,主存空间被分割成许多大大小小的分区。有的分区被作业占用,有的分区空闲。例如,某时刻主存空间占用情况如图1所示。 表1 空闲区说明表 10K 20K 45K 65K 110K 256K

所示。 其中,起始地址指出各空闲区的主存起始地址,长度指出空闲区大小。 状态栏未分配指该栏目是记录的有效空闲区,空表目指没有登记信息。 由于分区个数不定,所以空闲区说明表中应有足够的空表目项,否则造成溢出,无法登记。同样,再设一个已分配区表,记录作业或进城的主存占用情况。 (2)当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需求量,这时应该将空闲区一分为二。一个分给作业,另一个仍作为空闲区留在空闲区表中。为了尽量减少由于分割造成的碎片,尽可能分配低地址部分的空闲区,将较大空闲区留在高地址端,以利于大作业的装入。为此在空闲区表中,按空闲区首地址从低到高进行登记。为了便于快速查找,要不断地对表格进行紧缩,即让“空表目”项留在表的后部。其分配框图如图2所示。Array图2 首次适应算法分配框图 (3)当一个作业执行完时,作业所占用的分区应归还给系统。在归还时要考虑相邻空闲区

计算机组成原理实验五存储器读写实验

实验五 存储器读写实验实验目的 1. 掌握存储器的工作特性。 2. 熟悉静态存储器的操作过程,验证存储器的读写方法。 二、实验原理 表芯片控制信号逻辑功能表

2. 存储器实验单元电路 芯片状态 控制信号状态 DO-D7 数据状态 M-R M -W 保持 1 1 高阻抗 读出 0 1 6116-^总钱 写人 1 0 总线-*6116 无效 报警 ^2-10 D7—DO A7—A0

團2-8存储器实验电路逻辑图 三、实验过程 1. 连线 1) 连接实验一(输入、输出实验)的全部连线。 2) 按逻辑原理图连接M-W M-R 两根信号低电平有效信号线 3) 连接A7-A0 8根地址线。 4) 连接B-AR 正脉冲有效信号 2. 顺序写入存储器单元实验操作过程 1) 把有B-AR 控制开关全部拨到0,把有其他开关全部拨到1,使全部信号都处 于无效 状态。 2) 在输入数据开关拨一个实验数据,如“ 00000001”即16进制的01耳 把IO-R 控制开关拨下,把地址数据送到总线。 3) 拨动一下B-AR 开关,即实现“1-0-1 ”产生一个正脉冲,把地址数据送地 址寄存器保存。 4) 在输入数据开关拨一个实验数据,如“ 10000000',即16进制的80耳 把IO-R 控 制开关拨下,把实验数据送到总线。 3. 存储器实验电路 0 O O 0 0 olo O O O O 0 00 OUTPUT L/O :W 8-AR £ ■」2 ■七 ol^Fgr' L P O 74LS273 A7- AO vz 0 o|o 0 r 6116 A7 INPUT D7-O0 [olololololololol T2

实验二数据存储实验

实验二数据存储实验 一、实验目的 1、掌握TMS320C54的程序空间的分配; 2、掌握TMS320C54的数据空间的分配; 3、熟悉操作TMS320C54数据空间的指令。 二、实验设备 计算机,CCS 2.0版软件,DSP仿真器,实验箱。 三、实验原理 本实验指导书是以TMS320C5416为例,介绍相关的内部和外部存储器资源。对于其他类型的CPU请参考查阅相关的数据手册。 下面给出TMS320C5416的存储器分配表: 对于数据存储空间而言,映射表相对固定。值得注意的是内部寄存器都映射到数据存储空间内。因此在编程应用是这些特定的空间不能作其他用途。对于程序存储空间而言,其映射表和CPU的工作模式有关。当MP/MC引脚为高电平时,CPU工作在微处理器模式;当MP/MC引脚低电平时,CPU工作在为计算机模式。具体的存储器映射关系如上如所示。 存储器试验主要帮助用户了解存储器的操作和DSP的内部双总线结构。并熟悉相关的指令代码和操作等。 四、实验步骤与内容 1、连接好DSP开发系统,运行CCS软件;

2、在CCS的Memory窗口中查找C5416各个区段的数据存储器地址,在可以改变 的数据地址随意改变其中内容; 3、在CCS 中装载实验示范程序,单步执行程序,观察程序中写入和读出的数据存储地址的变化; 4、联系其他寻址方式的使用。 5、样例程序实验操作说明 启动CCS 2.0,并加载“exp02.out”; 图2.1 加载out文件 用“View”下拉菜单中的“Memory”查看内存单元;

图2.2 memory视图菜单 输入要查看的内存单元地址,本实验要查看0x1000H~0x100FH单元的数值变化,输 入地址0x1000H; 图2.3 memory 参数设置窗 查看0x1000H~0x100FH 单元的初始值,单击“Run”运行程序,也可以“单步”运 行程序;

相关文档