哥哥最近在玩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不做这个中间数据不清零的动作?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我自己找到了一个妥协的方法,虽然不是万能的,但很多情况可以解决:
#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内容,但函数会强制返回默认值)。
一周热门 更多>