关于MDK绝对定位问题

2019-12-21 12:11发布

哥哥最近在玩STM32,编译器呢,IAR和MDK同时用,一直在比较两个编译器的优缺点。
今天在做把数据绝对定位到Flash中的问题,IAR和MDK都定位成功,且都比较方便,如下:

#if defined ( __CC_ARM   )      // MDK
const uint8_t Test_flash[] __attribute__((at(0x08030000))) = "Test Flash";
const uint32_t Test_Addr __attribute__((at(0x08030010))) = 0x12345678;
#elif defined ( __ICCARM__ )    // IAR
const uint8_t Test_flash[] @ 0x08030000 = "Test Flash";
const uint32_t Test_Addr @ 0x08030010 = 0x12345678;
#else
const uint8_t Test_flash[] = "Test Flash";
const uint32_t Test_Addr = 0x12345678;
#endif

我用的STM32F107VC,有256K的flash,而现在的测试程序10K左右。
IAR会很干脆的将我要定位的数据放到指定的位置,中间空白的地方保持0xFF;
而MDK则不干脆,在0x08030000附近,还有程序的其它const数据放进去了。
这还不是最重要的,最重要的是主程序和0x08030000之间的数据都清成ix00了。
这会导致两个问题,第一个问题是:我编译完毕后看到的信息,flash是很大很大的(本质是包括了那些0x00);
第二个问题是,我下载程序需要的时间长很多。

我的问题是:有没有办法让MDK不做这个中间数据不清零的动作?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
28条回答
Louis_Bright
2019-12-22 04:38
xtx8962 发表于 2013-4-15 09:24
我对MDK的绝对定位也很恼火,可能是本人学艺不精,对MDK的绝对定位没理解。但你可以尝试下面的方法:
先cons ...

我自己找到了一个妥协的方法,虽然不是万能的,但很多情况可以解决:

#define SYS_SETTING_ADDR    0x0803F800

#if defined ( __CC_ARM   )      // MDK
volatile const SYS_FCT_SETTING SysFctSetting __attribute__((at(SYS_SETTING_ADDR))) =
#elif defined ( __ICCARM__ )    // IAR
__root const SYS_FCT_SETTING SysFctSetting @ SYS_SETTING_ADDR =
#else
const SYS_FCT_SETTING SysFctSetting =
#endif
{
    0x0FFF,
    9600,
};

然后在MDK中设置:
ROM1: 0x803F000    0x800
ROM2: 0x803F800    0x800

IROM1:0x8000000   0x3F000


这样我强制让MDK设别不到后面的Flash数据空间,可以解决我自己提出的问题,只是如果这种段特别多的时候就搞不定了。

另外注意在MDK中的定义我加了 volatile,在IAR中无法添加,所以在程序中使用这些数据的时候,主要函数要加:
#if defined ( __ICCARM__ )    // IAR
#pragma optimize=low
#endif
否则容易被优化掉(程序修改了Flash内容,但函数会强制返回默认值)。

一周热门 更多>