当前位置:文档之家› 单片机实验二

单片机实验二

实验二一、实验目的(1)阅读S3C44B0X启动代码,观察处理器启动过程(2)学会使用ADS辅助信息窗口分析判断调试过程和结果(3)学会在ADS环境中编写、编译与调试汇编和C语言相互调用的程序。

二、实验设备PC机、ADS1.2集成开发环境三、实验内容使用汇编语言完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,存放到数组中。

四、实验代码(1)randomtest.c参考源代码/**************************************************************************;* File:randtest.c;* Author:;* Desc:Random number generator demo program;* Calls assembler function 'randomnumber' defined in random.s;* History:;***********************************************************************//*------------------------------------------------------------------------------------------*//* extern function*//*------------------------------------------------------------------------------------------*/extern unsigned int randomnumber( void );/************************************************************************;* name: main;* func: c code entry;* para: none;* ret: none;* modify:;* comment:;********************************************************************/;C语言程序int Main(){unsigned int i,nTemp;unsigned int unRandom[10];for( i = 0; i < 10; i++ ){nTemp = randomnumber();unRandom[i] = nTemp;}return(0);}(2)unit.s参考源代码;/***********************************************************************;# File:init.s*;# Author: embest*;# Desc: C start up codes.Configure memory, Initialize ISR ,stacks,*;# initialize C-variables*;# Fill zeros into zero-initialized C-variables*;# History:*;#***************************************************************************/;/*------------------------------------------------------------------------------------------*/;/* global symbol define*/;/*------------------------------------------------------------------------------------------*/AREA start,CODE,READONL Y;/*.global __gccmain */;/*------------------------------------------------------------------------------------------*/;/* code*/;/*------------------------------------------------------------------------------------------*/ENTRY;设置中断/异常向量b Reset_HandlerUndefined_Handlerb Undefined_HandlerSWI_Handlerb SWI_HandlerPrefetch_Handlerb Prefetch_HandlerAbort_Handlerb Abort_Handlernop ; /* Reserved vector */IRQ_Handlerb IRQ_HandlerFIQ_Handlerb FIQ_HandlerReset_Handlerldr sp, =0x00002000;/ ***************************************************************************** ;该段代码实现:从汇编调用C函数;重点关注IMPORT伪操作*****************************************************************************/ IMPORT Main;引用外部程序Mainldr r0, = Main;将Mian函数的地址加载到R0中mov lr, pc ;将pc指向子程序bx r0;/ ***************************************************************************** ;无限循环;应用结束,通常情况下不会再产生;能调转到软件复位(B0x0)*****************************************************************************/Endb End; AREA gccmain,CODE,READONLY__gccmainmov pc, lrEND(3)Random.s参考源代码;/***************************************************************************** ****************;产生随机数;使用33位的反馈转换寄存器,产生一伪随机数序列;在循环中重复,有2^33-1长;注意:随机种子不能设置为0,否则0将会不断地产生(不是显著的随机数);这是说明ARM汇编程序的一个很好的应用,因为33位的转换寄存器能够执行RRX操作* ;#********************************************************************/;/*------------------------------------------------------------------------------------------*/;/* global symbol define*/;/*------------------------------------------------------------------------------------------*/ EXPORT randomnumber ;可以被外部函数引用AREA randomnumberSS,CODE,READONL Y;// ENTRY;/*------------------------------------------------------------------------------------------*/;/* code*/;/*------------------------------------------------------------------------------------------*/;//randomnumber;//# on exit:;//# a1 = low 32-bits of pseudo-random number;//# a2 = high bit (if you want to know it)randomnumberldr ip, seedpointer ;加载种子指针ldmia ip, {a1, a2}tst a2, a2, lsr#1movs a3, a1, rrx ;33字节循环右移adc a2, a2, a2 ;带进位加,a2=2×a2eor a3, a3, a1, lsl#12eor a1, a3, a3, lsr#20stmia ip, {a1, a2}mov pc, lrseedpointerDCD seed;分配一段字区域给seedAREA seed, DATA, READWRITEDCD 0x55555555DCD 0x55555555END五、实验总结本次实验使用汇编语言完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,并存放到了数组中。

在C语言程序中不需要使用任何关键字来声明将汇编语言调用的C语言程序,但是在汇编语言程序调用该C语言程序之前,需要在汇编语言程序中使用IMPORT伪操作来声明该C语言程序。

相关主题