[ARM程序分析与设计] 从头开始一个arm程序

[复制链接]
 楼主| ruchong001 发表于 2009-5-26 08:34 | 显示全部楼层 |阅读模式
基于mini2440从头写一个程序,连载!
rj1985 发表于 2009-6-22 12:22 | 显示全部楼层

敢问LZ,这是双月刊吗?

  
笑语人生 发表于 2009-6-24 17:33 | 显示全部楼层

年刊

  
lelee007 发表于 2009-6-27 12:38 | 显示全部楼层

世纪刊

哈哈哈哈哈<br /><br />俺来给你开第一篇吧<br /><br />中断向量表<br /><br />@***************************************************************<br />@FILE:head.s<br />@功能:启动代码,初始化系统运行环境,包括设置C堆栈指针<br />@本程序是直接放在SDRAM中运行,通过uboot使用tftp直接down到SDRAM中0x3000&nbsp;4000处,然后用uboot的go命令开始运行<br />@ARM中断向量表后续为外部中断向量表,运行时随同ARM中断向量表COPY高端地址,以使入口函数可以动态配置<br />@***************************************************************<br /><br />.extern&nbsp;&nbsp;&nbsp;&nbsp;main<br />.text<br />.global&nbsp;&nbsp;&nbsp;&nbsp;_start<br /><br /><br />_start:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />@&nbsp;0x00:&nbsp;<br />@Reset:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;Reset&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />@&nbsp;0x04:&nbsp;Undefined&nbsp;instruction&nbsp;exception<br />HandleUndef:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleUndef&nbsp;<br />&nbsp;<br />@&nbsp;0x08:&nbsp;Software&nbsp;interrupt&nbsp;exception&nbsp;&nbsp;<br />HandleSWI:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleSWI<br /><br />@&nbsp;0x0c:&nbsp;Prefetch&nbsp;Abort&nbsp;(Instruction&nbsp;Fetch&nbsp;Memory&nbsp;Abort)<br />HandlePrefetchAbort:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandlePrefetchAbort<br /><br />@&nbsp;0x10:&nbsp;Data&nbsp;Access&nbsp;Memory&nbsp;Abort<br />HandleDataAbort:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleDataAbort<br /><br />@&nbsp;0x14:&nbsp;Not&nbsp;used<br />HandleNotUsed:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleNotUsed<br /><br />@&nbsp;0x18:&nbsp;IRQ(Interrupt&nbsp;Request)&nbsp;exception<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,HandleIRQAddr&nbsp;&nbsp;&nbsp;&nbsp;@开启MMU后,由于此表被COPY到虚拟地址的最高端运行,FFFF0000,如果从那往回跳,跳不回来,MD,不知道为什么,shit!<br />@&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,=HandleIRQ<br /><br />@&nbsp;0x1c:&nbsp;FIQ(Fast&nbsp;Interrupt&nbsp;Request)&nbsp;exception<br />HandleFIQ:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;HandleFIQ<br /><br />@&nbsp;0x20:&nbsp;<br />HandleIRQAddr:&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;HandleIRQ<br /><br />@here,下面这个表将紧接上面的地址存放,每个标号所占长度都是long,通过连接设置的起始地址可以计算出此处存放的绝对地址,copy的起始地址和目标地址都使用绝对地址<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleEINT0:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleEINT1:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleEINT2:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleEINT3:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleEINT4_7:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleEINT8_23:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleRSV6:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleBATFLT:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleTICK:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleWDT:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleTIMER0:<br />@&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;Timer0_Handle<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleTIMER1:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleTIMER2:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleTIMER3:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleTIMER4:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleUART2:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleLCD:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleDMA0:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleDMA1:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleDMA2:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleDMA3:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleMMC:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleSPI0:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleUART1:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleRSV24:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleUSBD:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleUSBH:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleIIC:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleUART0:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleSPI1:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleRTC:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;HandleADC:<br />&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;0<br /><br /><br />
lelee007 发表于 2009-7-2 02:52 | 显示全部楼层

果真是世纪刊?

看来LZ的下文是遥遥无期阿,哈哈
sklar 发表于 2009-7-3 15:55 | 显示全部楼层

呵呵

这贴搞笑,留名,看谁猜中了。。。我赌:无期刊。下100块。。。
飞天电子 发表于 2009-7-4 11:16 | 显示全部楼层

F2313 GPRS DTU

F2313GPRS&nbsp;DTU(简称DTU),是一款使用GPRS进行无线数据传输的设备。支持PPP、TCP、UDP、DNS等众多复杂网络协议和SOCKET插口标准,为用户提供全透明数据传输和用户自定义协议传输两种模式。<br />同时支持点对点、点对多点、设备间、设备与中心间等各种不同的通讯模式。<br />用户不用关心&nbsp;复杂的网络通信协议、通过串行口,就可以进行无线数据收发,让你的设备随时随地接入Internet。<br />本DTU产品支持TCP和UDP两种报文格式,用户可以自由选择。产品已广泛应用于电力监控、数据采集/传输、水污染监控、森林防火、气象数据采集、远程抄表、ATM机、彩票投注机、油田等领域。无需任何布线就可以解决野外数据传输的难题。只要有GPRS网络的地方、F2313&nbsp;DTU就可以为你提供无线数据传输服务。<br /><br />关键词:透明收发。所谓透明收发就是数据所见即所得,发送的数据和接收的数据完全一样,你不必关心中间环节;类似于一条透明管道,只不过这条管道你看不见、摸不着,通过gprs网络无限延伸到世界各地。<br /><br />
huangqi412 发表于 2009-7-24 17:16 | 显示全部楼层

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

  
leolle 发表于 2009-7-30 21:16 | 显示全部楼层

一月一更新哪

  
lelee007 发表于 2009-8-2 22:39 | 显示全部楼层
这样的刊物也有人投广告?!

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

贴广告的很幽默,俺觉得是托,有人故意的吧,嘿嘿
小鸟will 发表于 2009-8-27 14:38 | 显示全部楼层
飘过~
vagrantman 发表于 2009-11-8 13:03 | 显示全部楼层
这帖笑喷我了,等待lz复活啊哈哈
mark0908 发表于 2009-11-11 10:51 | 显示全部楼层
楼主闭关了

出关时linux已精通
itelectron 发表于 2009-11-14 15:00 | 显示全部楼层
itelectron 发表于 2009-11-14 15:18 | 显示全部楼层
我 当初以为 QQ2440的代码 完全是 QQ2440本人 自己写的
后来 看了 三星的资料包才知道
英特陪 油龙  MDK  等等 都是 移植 人家三星的 代码?
那代码偶看的也有很多不明白的地方!!!!
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
*---------------------------------------------------------------------------*/
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;

}
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;
       
}
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;
}
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

粉丝
快速回复 在线客服 返回列表 返回顶部