基于MDK Keil将中断及中断服务函数定位到RAM中的.sct文件

VectorTable_ROM 0x08000000 0x00000200
{
    VectorTable_RAM 0x20000000 0x00000200
    {
        *.o (RESET, +First)
    }
}

IntFunction_ROM 0x08000200 0x00001600
{
    IntFunction_RAM 0x20000200 0x00001600
    {
        *.o (IntFunction)
    }
}

LR_IROM1 0x08001800 0x0003E800
{
    ER_IROM1 0x08001800 0x0003E800
    {
        *(InRoot$$Sections)
        .ANY (+RO)
    }
    RW_IRAM1 0x20001800 0x0000D800    ; data bss
    {
        ;*(InRoot$$Sections)
        *.o (+RW +ZI)
    }
    RW_IRAM2 0x2000F000 0x00000C00    ; HEAP ADDRESS
    {
        *.o (HEAP)
    }
    RW_IRAM3 0x2000FC00 0x00000400    ; STACK ADDRESS
    {
        *.o (STACK)
    }
}

说明:

1、分散加载区域1

        VectorTable_ROM为中断向量表加载地址;

        VectorTable_RAM为中断向量表执行地址。

2、分散加载区域2

        IntFunction_ROM为中断服务函数加载地址;

        IntFunction_RAM为中断服务函数执行地址。

3、分散加载区域3

        LR_IROM1为剩余其他所有的(全局变量(data)、全局未初始化变量(.bss或.ZI)、只读变量(const、字符串)、代码(text、code))加载地址;

        ER_IRAM1为只读变量、代码执行地址,等于加载地址,其中*(InRoot$$Sections)表示的是外部加载的所必须的段,也就是c语言所必须的运行时环境(详情可通过在MDK中按F1键查找帮助手册);

        RW_IRAM2为堆区,通过这种方式可以将堆区定位到任意自己想要的位置,size(0x00000C00)必须要与startup文件中的大小一致;

        RW_IRAM3为栈区,通过这种方式可以将栈区定位到任意自己想要的位置,size(0x00000C00)必须要与startup文件中的大小一致。

4、其他

        此文章基于 MCU STM32F103RCT6,64K RAM,256K ROM

友情提示:

        1、具体的语法可以通过在 MDK 软件中按 F1键 来查找跟过详细的帮助。

        2、此文章的方式一般是做 bootloader 并且需要使用中断,才需要做此操作,因为在bootloader中需要擦除和写入 Flash,如果中断函数定义在 Flash 中,当正在擦除或写入 Flash 时,中断来了,中断将不能及时得到执行。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值