打印
[ZLG-ARM]

lpc2132 remap的不解

[复制链接]
2013|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
randomkuan|  楼主 | 2008-3-12 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#define VECTOR_RAM ((unsigned int *)0x40000000)
#define VECTOR_ROM ((unsigned int *)0x00000000)

__swi(0x00) void SWI_Task(void);

void SWI_Exception(void)
{
    while(1);
}
int main()
{
    volatile unsigned int *RamAddr,*RomAddr;
    int i;
    RamAddr = VECTOR_RAM;
    RomAddr = VECTOR_ROM;
    
    for(i=0;i<16;i++)//拷贝中断向量表
    {
        *RamAddr = *RomAddr;
        RamAddr++;
        RomAddr++;
    }
    
    
    MEMMAP = 0x2;
    
    RamAddr = (unsigned int *)0x40000028;
    *RamAddr = (unsigned int )SWI_Exception;//修改SWI中断向量
    
    SWI_Task();//执行SWI中断
    while(1);
}
  AREA    vectors,CODE,READONLY
        ENTRY
;interrupt vectors
;中断向量表
Reset
    LDR     PC, ResetAddress
    LDR     PC, UndefineAddress
    LDR     PC, SWI_Address
    LDR        PC, PrefetchAddress
    LDR        PC, AbortAddress
    NOP
    LDR        PC, [PC,#-0xFF0]    
    LDR        PC, FIQ_Address

ResetAddress    DCD Reset_Handler
UndefineAddress    DCD    Undefine_Handler
SWI_Address        DCD    SWI_Handler 
PrefetchAddress    DCD    Prefetch_Handler
AbortAddress    DCD    Abort_Handler
FIQ_Address        DCD    FIQ_Handler


SWI_Handler 
        B    SWI_Handler


RO_base =0
RW_base=0x40000000

问题:为什么remap 之后执行SWI软件指令,还是跳转到SWI_Handler,而不是到SWI_Exception()呢?

相关帖子

沙发
zlgarm| | 2008-3-12 18:06 | 只看该作者

程序问题

randomkuan  您好:
 
    这个是您程序的问题,请看下面,

  SWI_Handler 
            B    SWI_Handler         //程序一直在这里执行
                                   
                                   by zlgarm_zhanghuping

使用特权

评论回复
板凳
randomkuan|  楼主 | 2008-3-12 21:22 | 只看该作者

to zlgarm ,我已经改了中断向量啊!

感谢zlgarm!
     但是你看我的程序
     RamAddr = (unsigned int *)0x40000028;
    *RamAddr = (unsigned int )SWI_Exception;//修改SWI中断向量
    已经修改了SWI的中断向量啊,按理来说不是执行新的函数吗?

使用特权

评论回复
地板
randomkuan|  楼主 | 2008-3-13 13:32 | 只看该作者

问题困扰很久了,希望有人能指点迷津

问题困扰很久了,希望有人能指点迷津

使用特权

评论回复
5
zlgarm| | 2008-3-13 13:56 | 只看该作者

函数

randomkuan  您好:
    如果您的意图是通过指针来调用函数,应该用函数指针来操作。
                        By zlgarm_lijintao

使用特权

评论回复
6
randomkuan|  楼主 | 2008-3-13 14:26 | 只看该作者

remap后是否从0X40000000开始中断?

ram的0x40000000~0x40000003F拷贝了ROM的0x00000000~0x0000003F的,也就是说40000028存放的是原来SWI_Handler 的地址,经过
     RamAddr = (unsigned int *)0x40000028;
    *RamAddr = (unsigned int )SWI_Exception;//修改SWI中断向量
0x40000028存放的是SWI_Exception的地址,看汇编也看到0x40000028的数据已经变成SWI_Exception的地址了,remap后中断应该从0x40000000开始啊,甘SWI软中断应该从0x40000008开始,读取0X40000028单元所存放的数据啊,请ZLGARM再教导教导!

使用特权

评论回复
7
armfan| | 2008-3-14 12:56 | 只看该作者

re

帮你顶,希望工程师能给我们一个满意的答复

使用特权

评论回复
8
zlgarm| | 2008-3-14 13:18 | 只看该作者

中断

randomkuan  您好!
    1、首先设置映射寄存器MEMMAP = 0x02
    2、如果RIQ中断则跳到40000018处执行指令
                   On duty zlgarm_lijintao

使用特权

评论回复
9
ZlGaRm| | 2008-3-14 14:04 | 只看该作者

楼主

您好!
  有点看不明白您的意思。您一发帖,一上来就是一堆代码,然后是一个有点让人摸不着头脑的问题。
  您最关心的问题究竟是什么呢?建议您将您的问题简化成概念问题。大多数问题都可以转化成概念问题的。
  将具体的问题转化成抽象的概念问题很有好处,避免被提问者还要耗费很多时间和精力看代码、学习和理解代码相关的背景知识、细枝末节,问题也能得到更快的解决。
  所以,我想请您梳理一下思路,然后重新提问,告诉大家您到底想问什么。问题的形式,最好能是和您的代码没有关系。
  例如:“remap后是否从0X40000000开始中断?”的表达形式就好回答得多了:
  “remap到内存后,真正被执行的异常向量表就是位于内存的起始地址了”。 
                                                         By zlgarm_ltt
  
  
相关链接:https://bbs.21ic.com/upfiles/img/20083/200831414333886.pdf

使用特权

评论回复
10
armfan| | 2008-3-14 15:01 | 只看该作者

re

ZlGaRm:
      您好
  
      首先声明randomkuan是问题的作者,不是我。
      其次您所说“randomkuan问了一个摸不着头脑的问题”,我所理解他的意思应该是问“我把软中断的从新定义了函数进行了处理,及《《《        *RamAddr = (unsigned int )SWI_Exception    》》》,但是为什么还执行 

  SWI_Handler 
          B    SWI_Handler         ”

我也是一名初学者,我之所以花费10分钟的时间来回贴,是想解除心中的疑惑。

使用特权

评论回复
11
ZlGaRm| | 2008-3-14 16:08 | 只看该作者

Re

    就这个问题而言,我想先看一看楼主是否能将问题转化一下。
    说实话,我们的精力确实有限(每天要处理多达30个以上的帖子),既无能力也无义务帮客户看客户的代码。其实就代码而言,我们是只对光盘例程进行技术支持的。
    很多时候,在论坛上,我们之所以帮客户费力看他的代码,只是出于当事工程师的善意和热心,这只是个人行为,但公司并不提倡这类个人行为。希望客户在我们不能仔细看您的代码时,给予一点理解。更希望大家能体谅一下回答者,费点心思把问题转化一下。不要问“为什么我的程序这里有问题、那里有问题”之类的问题了,毕竟您的程序并不是别人的产品,而且别人不是您,也不容易理解您的思路,别人回答起来真地很费力,呵呵。
                                           By zlgarm_ltt

使用特权

评论回复
12
armfan| | 2008-3-14 16:50 | 只看该作者

re

感谢zlg的工程师们的无私的奉献,祝工作顺利,天天开心。

使用特权

评论回复
13
randomkuan|  楼主 | 2008-3-17 16:37 | 只看该作者

我想知道我的思路错在哪里!

我也是用ZLG的光盘的例程,但Remap的例程只是叫人看数据的变化而没有真正的应用,所以我想自己能够真正的理解和应用Remap,我的程序的意思是这样的:

ARM上电复位后,执行的是ZLG提供的启动代码,然后跳到main()函数,在main()函数里面,拷贝FLASH的0x00000000~0x0000003F的代码到RAM的0x40000000~0x4000003F,然后执行MEMMAP = 0x2,remap到内存后,真正被执行的异常向量表就是位于内存的起始地址了(0x40000000),然后我改变内存单元(0x40000028)的内容,原来的是指向SWI_Handler()函数,改变后指向SWI_Exception()函数,最后执行SWI软中断.(在编译器ADS设置RO_base =0
RW_base=0x40000000)

问题是:1.remap后是否从0X40000000开始中断?
       2.remap后SWI软中断是否从0x40000008开始,读取0X40000028单元所存放的数据(LDR PC, SWI_Address ..... SWI_Address DCD SWI_Handler)也就是SWI中断函数的地址,赋给PC,然后执行SWI中断函数?
       3.改变0X40000028的数据,是否可以改变SWI中断的指向?
我遇到的情况就是我改变了0X40000028的内容,SWI中断还是指向原来的地址,而不是指向修改后的地址,我想知道我的思路错在哪里!
感谢zlg的工程师们的无私的奉献!

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝