查看: 4384|回复: 9

[求助] 中断向量表的放置问题

[复制链接]
  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-6-11 11:25:45 | 显示全部楼层 |阅读模式
    用的是MDK,
    在startup_mk60.s中已经用DCD开辟了一段中断向量表,
    然后我打算再用const vector_entry  __vector_table[] __attribute__((at(0x00)))在.c文件中来覆盖.s文件中开辟的表,
    同时使用分散加载文件限定了中中断向量表的大小为1024字节;
    奇怪的是编译时中断向量表的大小被算成了2048字节,超过了分散加载文件中定义的,编译过不去;
    若把.s或.c中的一个表注释掉,就可以通过编译了!!!

    但是在官方的例程中同样在两个文件中都有表的定义,只是没有使用分散加载文件,却可以编译过!!!

    这是为什么???
    难道.c中的表不应该覆盖.s中的表吗???
    我知道答案 目前已有9人回答
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    24

    主题

    502

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1363
    最后登录
    1970-1-1
    发表于 2015-6-11 12:43:34 | 显示全部楼层
    字和字节一样,楼主没有弄错吗.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-6-11 14:16:15 | 显示全部楼层
    你分散加载限制怎么做的,发出来看看呢。
    如果不限制,你是否编译的过去?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    205

    帖子

    0

    高级会员

    Rank: 4

    积分
    516
    最后登录
    2016-2-16
    发表于 2015-6-11 20:54:01 | 显示全部楼层
    学习学习
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
     楼主| 发表于 2015-6-11 22:59:40 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2015-6-11 14:16
    你分散加载限制怎么做的,发出来看看呢。
    如果不限制,你是否编译的过去? ...

    其实就是官方例程给的:
    #! armcc -E
    #define __ram_vector_table__
    #if (defined(__ram_vector_table__))
      #define __ram_vector_table_size__    0x00000400
    #else
      #define __ram_vector_table_size__    0x00000000
    #endif

    #define m_interrupts_start             0x00000000
    #define m_interrupts_size              0x00000400
    #define m_flash_config_start           0x00000400
    #define m_flash_config_size            0x00000010
    #define m_text_start                   0x00000410
    #define m_text_size                    0x0007FBF0
    #define m_interrupts_ram_start         0x1FFF0000
    #define m_interrupts_ram_size          __ram_vector_table_size__
    #define m_data_start                   (m_interrupts_ram_start + m_interrupts_ram_size)
    #define m_data_size                    (0x00010000 - m_interrupts_ram_size)
    #define m_data_2_start                 0x20000000
    #define m_data_2_size                  0x00010000
    /* Size */
    #if (defined(__stack_size__))
      #define Stack_Size                   __stack_size__
    #else
      #define Stack_Size                   0x0400
    #endif

    #if (defined(__heap_size__))
      #define Heap_Size                    __heap_size_
    #else
      #define Heap_Size                    0x0400
    #endif

    LR_m_text m_text_start m_text_size{
        ER_m_text m_text_start m_text_size{
         *(InRoot$$Sections)
      .ANY (+RO)
    }
    RW_m_data m_data_start m_data_size{
         .ANY (+RW+ZI)
    }
      RW_m_data_2 m_data_2_start m_data_2_size-Stack_Size-Heap_Size { ; RW data
        .ANY (+RW +ZI)
       }
    ARM_LIB_HEAP ((ImageLimit(RW_m_data_2) == m_data_2_start) ? ImageLimit(RW_m_data) : +0) EMPTY Heap_Size {
    }
    ARM_LIB_STACK m_data_2_start+m_data_2_size EMPTY -Stack_Size{
    }
    }
    LR_m_interrupts m_interrupts_start m_interrupts_size{
    #if (!defined(__ram_vector_table__))
    VECTOR_RAM m_interrupts_start EMPTY 0 {
    }
    #endif
    VECTOR_ROM m_interrupts_start m_interrupts_size{
         * (RESET,+FIRST)
    }
    }
    LR_m_flash_config m_flash_config_start m_flash_config_size {
        ER_m_flash_config m_flash_config_start m_flash_config_size {
            * (FlashConfig)
        }
    }
    #if (defined(__ram_vector_table__))
    LR_m_interrupts_ram m_interrupts_ram_start m_interrupts_ram_size{
    VECTOR_RAM m_interrupts_ram_start EMPTY m_interrupts_ram_size{
    }
    }
    #endif

    如果不加限制的话,编译可以过,但是看.map发现向量表区域有0x0800字节(2048字节)

    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
     楼主| 发表于 2015-6-11 23:07:00 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2015-6-11 14:16
    你分散加载限制怎么做的,发出来看看呢。
    如果不限制,你是否编译的过去? ...

    我现在想知道,对于.c里定义的const vector_entry数组和.s里用DCD命令开辟的空间,谁更先执行?
    我看map文件好像DCD开辟的空间被排到const vector_entry数组后面去了,是不是该数组的分配更早?
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
    发表于 2015-6-11 23:18:45 | 显示全部楼层
    期待高手解决,我认真学习中……
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-10-30 22:37
  • 签到天数: 28 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    9

    主题

    435

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1107
    最后登录
    2020-8-28
    发表于 2015-6-12 09:55:26 | 显示全部楼层
    关键代码不帖,鬼知道你怎么错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-6-12 11:27:56 | 显示全部楼层
    .s编译的时候,已经把中断向量表放到flash的具体地址了。
    所以如果你再定义同样的地址,肯定会有问题,因为flash的操作就是,如果有数据,你要擦除之后才可以再写入。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    119

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    317
    最后登录
    2016-11-11
    发表于 2015-6-12 14:50:55 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-27 17:46 , Processed in 0.106740 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表