打印

谁能讲讲,GNU ARM下,如下代码怎么实现?多谢了

[复制链接]
1997|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lelee007|  楼主 | 2009-6-20 19:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        ALIGN





        AREA RamData, DATA, READWRITE



        ^   _ISR_STARTADDRESS ;_ISR_STARTADDRESS    EQU 0x33ffff00,其中^为MAP伪指令,MAP指令是在教科书中数据定义伪操作中讲述
                    ;I该指令为定义一块结构华内存表的首地址,后面跟着该块内存表内容
                    ;问题:经过该定义的内存表,如何实际放到物理内存中去?
                    ;
                    ;
                    ;

HandleReset     #   4

HandleUndef     #   4

HandleSWI       #   4

HandlePabort    #   4

HandleDabort    #   4

HandleReserved  #   4

HandleIRQ       #   4

HandleFIQ       #   4

相关帖子

沙发
etual| | 2009-6-22 16:44 | 只看该作者

GCC的话你要折腾链接脚本了

这堆东西说到尾就是从地址 0x33ffff00 连续分配RAM空间
而且每个入口都有一个标号。

GCC处理的话基本思路是,这部分独立一个段,我叫 vector 段,然后在连接脚本的地方指定这个段的运行地址(gcc叫 virtual memory address)为 0x33ffff00 就OK了。

可能需要动手能力强一点,具体参考 ld 的文档学习 ld script 怎么用吧。

使用特权

评论回复
板凳
lelee007|  楼主 | 2009-6-23 03:31 | 只看该作者

能不能这样?

单独弄个段单独放这个vector,然后指定一个存储地址和一个运行地址

在初始化的时候,将这个段从存储地址直接copy放到运行地址了?

试试看

谢谢LS

使用特权

评论回复
地板
lelee007|  楼主 | 2009-6-23 03:35 | 只看该作者

前面试过将vector段直接存储在高地址,并在高地址运行

结果直接编译出个64M的东西来,当时就傻眼了,而且程序也有问题,跑不了

当时头脑热着,没仔细想,后来就放弃这个办法了

经你这么一提,哈哈,醍醐灌顶阿

不过行不行,还不知道

先试试看了

使用特权

评论回复
5
lelee007|  楼主 | 2009-6-26 09:38 | 只看该作者

试了,用数据段不行,还是用text段

才开始的时候把堆栈设置错了,没发现,也没有仿真,直接DOWN到SDRAM里边去跑

结果miicom里边显示个STARTING APPLICATION什么的,然后就不动了,郁闷坏了

还没跑到main就停了,反汇编的开始是正确的,后面的也没仔细分析到底跑哪儿了

今天回头来检查head.s时看到堆栈设置的时候,才发现,不知道什么时候原来正确的堆栈设置被改过了,而且改的莫名其妙,感觉不是我改的,因为设置的空间就不在SDRAM的映射空间内,崩溃阿

改过来后试用数据段定义表,没进中断,而且程序开**不久便停下来,很明显中断来了,但是没找到入口

然后还是放到text段里边,然后copy到高端地址,结果居然可以动态配置。

前面堆栈设错的时候,用动态配置,就没进main,才开始,第一反应是,text段是不能写的,由于往里边写了,导致程序出错。这下知道了,是可以写的,哈哈

现在外部中断入口可以动态配置了,想怎么玩都可以了

使用特权

评论回复
6
Fe_ARM| | 2009-6-26 22:44 | 只看该作者

上面的代码不全吧

请参考下面的内容:

.macro HANDLER HandleLabel
    sub        sp,sp,#4        
    stmfd   sp!,{r0}                
    ldr        r0,=HandleLabel        
    ldr        r0,[r0]                    
    str        r0,[sp,#4]                
    ldmfd   sp!,{r0,pc}                
.endm


.align   
HandlerFIQ:      HANDLER HandleFIQ
HandlerIRQ:      HANDLER HandleIRQ
HandlerUndef:    HANDLER HandleUndef
HandlerSWI:      HANDLER HandleSWI
HandlerDabort:   HANDLER HandleDabort
HandlerPabort:   HANDLER HandlePabort

....
    .align
.equ    HandleReset,    _ISR_STARTADDRESS
.equ    HandleUndef,    _ISR_STARTADDRESS+4
.equ    HandleSWI,        _ISR_STARTADDRESS+4*2
.equ    HandlePabort,    _ISR_STARTADDRESS+4*3
.equ    HandleDabort,    _ISR_STARTADDRESS+4*4
.equ    HandleReserved,    _ISR_STARTADDRESS+4*5
.equ    HandleIRQ,        _ISR_STARTADDRESS+4*6
.equ    HandleFIQ,        _ISR_STARTADDRESS+4*7
.............

使用特权

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

本版积分规则

170

主题

8560

帖子

3

粉丝