打印
[ARM程序分析与设计]

从头开始一个arm程序

[复制链接]
5753|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ruchong001|  楼主 | 2009-5-26 08:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
rj1985| | 2009-6-22 12:22 | 只看该作者

敢问LZ,这是双月刊吗?

使用特权

评论回复
板凳
笑语人生| | 2009-6-24 17:33 | 只看该作者

年刊

使用特权

评论回复
地板
lelee007| | 2009-6-27 12:38 | 只看该作者

世纪刊

哈哈哈哈哈

俺来给你开第一篇吧

中断向量表

@***************************************************************
@FILE:head.s
@功能:启动代码,初始化系统运行环境,包括设置C堆栈指针
@本程序是直接放在SDRAM中运行,通过uboot使用tftp直接down到SDRAM中0x3000 4000处,然后用uboot的go命令开始运行
@ARM中断向量表后续为外部中断向量表,运行时随同ARM中断向量表COPY高端地址,以使入口函数可以动态配置
@***************************************************************

.extern    main
.text
.global    _start


_start:                
@ 0x00: 
@Reset:
    b    Reset    

@ 0x04: Undefined instruction exception
HandleUndef:
    b    HandleUndef 
 
@ 0x08: Software interrupt exception  
HandleSWI:
    b    HandleSWI

@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)
HandlePrefetchAbort:
    b    HandlePrefetchAbort

@ 0x10: Data Access Memory Abort
HandleDataAbort:
    b    HandleDataAbort

@ 0x14: Not used
HandleNotUsed:
    b    HandleNotUsed

@ 0x18: IRQ(Interrupt Request) exception
    ldr    pc,HandleIRQAddr    @开启MMU后,由于此表被COPY到虚拟地址的最高端运行,FFFF0000,如果从那往回跳,跳不回来,MD,不知道为什么,shit!
@    ldr    pc,=HandleIRQ

@ 0x1c: FIQ(Fast Interrupt Request) exception
HandleFIQ:
    b    HandleFIQ

@ 0x20: 
HandleIRQAddr:    
    .long    HandleIRQ

@here,下面这个表将紧接上面的地址存放,每个标号所占长度都是long,通过连接设置的起始地址可以计算出此处存放的绝对地址,copy的起始地址和目标地址都使用绝对地址
    HandleEINT0:
    .long    0
    HandleEINT1:
    .long    0
    HandleEINT2:
    .long    0
    HandleEINT3:
    .long    0
    HandleEINT4_7:
    .long    0
    HandleEINT8_23:
    .long    0
    HandleRSV6:
    .long    0
    HandleBATFLT:
    .long    0
    HandleTICK:
    .long    0
    HandleWDT:
    .long    0
    HandleTIMER0:
@    .long    Timer0_Handle
    .long    0
    HandleTIMER1:
    .long    0
    HandleTIMER2:
    .long    0
    HandleTIMER3:
    .long    0
    HandleTIMER4:
    .long    0
    HandleUART2:
    .long    0
    HandleLCD:
    .long    0
    HandleDMA0:
    .long    0
    HandleDMA1:
    .long    0
    HandleDMA2:
    .long    0
    HandleDMA3:
    .long    0
    HandleMMC:
    .long    0
    HandleSPI0:
    .long    0
    HandleUART1:
    .long    0
    HandleRSV24:
    .long    0
    HandleUSBD:
    .long    0
    HandleUSBH:
    .long    0
    HandleIIC:
    .long    0
    HandleUART0:
    .long    0
    HandleSPI1:
    .long    0
    HandleRTC:
    .long    0
    HandleADC:
    .long    0


使用特权

评论回复
5
lelee007| | 2009-7-2 02:52 | 只看该作者

果真是世纪刊?

看来LZ的下文是遥遥无期阿,哈哈

使用特权

评论回复
6
sklar| | 2009-7-3 15:55 | 只看该作者

呵呵

这贴搞笑,留名,看谁猜中了。。。我赌:无期刊。下100块。。。

使用特权

评论回复
7
飞天电子| | 2009-7-4 11:16 | 只看该作者

F2313 GPRS DTU

F2313GPRS DTU(简称DTU),是一款使用GPRS进行无线数据传输的设备。支持PPP、TCP、UDP、DNS等众多复杂网络协议和SOCKET插口标准,为用户提供全透明数据传输和用户自定义协议传输两种模式。
同时支持点对点、点对多点、设备间、设备与中心间等各种不同的通讯模式。
用户不用关心 复杂的网络通信协议、通过串行口,就可以进行无线数据收发,让你的设备随时随地接入Internet。
本DTU产品支持TCP和UDP两种报文格式,用户可以自由选择。产品已广泛应用于电力监控、数据采集/传输、水污染监控、森林防火、气象数据采集、远程抄表、ATM机、彩票投注机、油田等领域。无需任何布线就可以解决野外数据传输的难题。只要有GPRS网络的地方、F2313 DTU就可以为你提供无线数据传输服务。

关键词:透明收发。所谓透明收发就是数据所见即所得,发送的数据和接收的数据完全一样,你不必关心中间环节;类似于一条透明管道,只不过这条管道你看不见、摸不着,通过gprs网络无限延伸到世界各地。

使用特权

评论回复
8
huangqi412| | 2009-7-24 17:16 | 只看该作者

靠,关高都来了,这刊还来广告收入了

使用特权

评论回复
9
leolle| | 2009-7-30 21:16 | 只看该作者

一月一更新哪

使用特权

评论回复
10
lelee007| | 2009-8-2 22:39 | 只看该作者
这样的刊物也有人投广告?!

估计这个上面贴广告是不收费的,哈哈

贴广告的很幽默,俺觉得是托,有人故意的吧,嘿嘿

使用特权

评论回复
11
小鸟will| | 2009-8-27 14:38 | 只看该作者
飘过~

使用特权

评论回复
12
vagrantman| | 2009-11-8 13:03 | 只看该作者
这帖笑喷我了,等待lz复活啊哈哈

使用特权

评论回复
13
mark0908| | 2009-11-11 10:51 | 只看该作者
楼主闭关了

出关时linux已精通

使用特权

评论回复
14
itelectron| | 2009-11-14 15:00 | 只看该作者

使用特权

评论回复
15
itelectron| | 2009-11-14 15:18 | 只看该作者
我 当初以为 QQ2440的代码 完全是 QQ2440本人 自己写的
后来 看了 三星的资料包才知道
英特陪 油龙  MDK  等等 都是 移植 人家三星的 代码?
那代码偶看的也有很多不明白的地方!!!!

使用特权

评论回复
16
itelectron| | 2009-11-14 15:19 | 只看该作者
/*----------------------------------------------------------------------------

*---------------------------------------------------------------------------*/
#include "shell.h"
#include "2440addr.h"                    /* S3C2440 definitions               */
//#include "S3C2440.h"                    /* S3C2440 definitions               */

/*******************************************************
【函数功能】
********************************************************/
int main (void)
{  
         led_text();
         uartSendString("测试按键K1,K2,K3,K4!\n");
         key_text();
}

/*----------------------------------------------------------------------------
* end of file
*---------------------------------------------------------------------------*/

使用特权

评论回复
17
itelectron| | 2009-11-14 15:19 | 只看该作者
#include "shell.h"
#include "2440addr.h"                    /* S3C2440 definitions               */



/*******************************************************
【函数功能】
********************************************************/                    
void led_text(void)
{       
        unsigned char i,j;
        rGPBCON = 0x15400;//io init
        for (i=0;i<4;i++)
        {
                rGPBDAT = LED_k;
                Led_Delay();
                rGPBDAT |= LED_MSK;
                Led_Delay();
        }
        uartini(); //串口初始化
        uartSendString("启动代码ok!\n");
        uartSendString("请按PC任意键!\n");
        uartGetChar();//读取键盘

        for(j=0;j<4;j++)
        {
                uartSendString("LED测试OK!\n");
                rGPBDAT |= LED_MSK;
                rGPBDAT &= ~LED1;
                Led_Delay();
                rGPBDAT |= LED_MSK;
                rGPBDAT &= ~LED2;
                Led_Delay();
                rGPBDAT |= LED_MSK;                         
                rGPBDAT &= ~LED3;
                Led_Delay();
                rGPBDAT |= LED_MSK;
                rGPBDAT &= ~LED4;
                Led_Delay();
        }

//        return 0;

}

使用特权

评论回复
18
itelectron| | 2009-11-14 15:20 | 只看该作者
#include "shell.h"
#include "2440addr.h"                    /* S3C2440 definitions               */

/*******************************************************
【函数功能】
********************************************************/
void key_text(void)
{
        unsigned char k;
        while(1)
        {
                 k=Key_Scan();
                 if (k==1)
                {
                        led_flash();
                        uartSendString("k4以按下!\n");               
                }
                else if (k==2)
                {
                        led_flash();
                        uartSendString("k3以按下!\n");               
                }
                else if (k==3)
                {
                        led_flash();
                        uartSendString("k2以按下!\n");               
                }
                else if (k==4)
                {
                        led_flash();
                        uartSendString("k1以按下!\n");               
                }
                else
                {
                        rGPBDAT = LED_k;
                }   
          
        }   
}
/*******************************************************
【函数功能】
********************************************************/
void led_flash(void)
{
        rGPBDAT = LED_MSK;
        Led_Delay();
        rGPBDAT = LED_k;
        Led_Delay();
}


/*******************************************************
【函数功能】
********************************************************/
unsigned char Key_Scan(void)
{
        Led_Delay();
        if(      (rGPFDAT&(1<< 0)) == 0 )       
                return 1 ;
        else if( (rGPFDAT&(1<< 2)) == 0 )
                return 2;
        else if( (rGPGDAT&(1<< 3)) == 0 )
                return 3 ;
        else if( (rGPGDAT&(1<<11)) == 0 )
                return 4 ;
        else
                return 0xff;
       
}

使用特权

评论回复
19
itelectron| | 2009-11-14 15:20 | 只看该作者
/*----------------------------------------------------------------------------

*---------------------------------------------------------------------------*/
#include "shell.h"
#include "2440addr.h"                    /* S3C2440 definitions               */
#define LED_SPARK_TIME_DELAY 400000

/* LED: PB5678 low light        */
// 01 01010100 00000000
/*******************************************************
【函数功能】        串口初始化
********************************************************/
void uartini(void)
{
        rGPHCON = 0xaa;
    rGPHUP  = 0x0f;
    rUFCON0 = 0x0;
    rUMCON0 = 0x0;
    rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits
    rUCON0  = 0x05;   // Control register
    rUBRDIV0=( (int)(304000000/6/16./115200+0.5) -1 );
}

/*******************************************************
【函数功能】        发送字符
********************************************************/
void uartSendByte(char data)
{
        if(data=='\n')
        {
            while(!(rUTRSTAT0 & 0x2));
           // Delay(1);                 //because the slow response of hyper_terminal
            rUTXH0 = '\r';
        }
          while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
      //  Delay(1);
        rUTXH0 = data;
}

/*******************************************************
【函数功能】        发送字符串
********************************************************/
void uartSendString(char *pt)
{
    while(*pt)
        uartSendByte(*pt++);
}

/*******************************************************
【函数功能】        读取串口
********************************************************/
char uartGetChar(void)
{
        while(!(rUTRSTAT0 & 0x1)); //Receive data ready
        return rURXH0;
}

/*******************************************************
【函数功能】        延时
********************************************************/   
void Led_Delay(void)
{
        long i=0;
        for(i=0; i<LED_SPARK_TIME_DELAY; i++);
        return;
}

使用特权

评论回复
20
itelectron| | 2009-11-14 15:20 | 只看该作者
#ifndef __shell_h__
#define __shell_h__

#ifdef __cplusplus
extern "C" {
#endif


#define LED_MSK                0x1E0
#define LED_k                0x00
#define        LED1                0x20
#define        LED2                0x40
#define        LED3                0x80
#define        LED4                0x100

void key_text(void);

void Led_Delay(void);
void led_text(void);
char uartGetChar(void);
void uartini(void);
void uartSendByte(char data);
void uartSendString(char *pt);

unsigned char Key_Scan(void);
void led_flash(void);






#ifdef __cplusplus
}
#endif

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝