关于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条回答
pogulu
1楼-- · 2019-12-22 06:59
Louis_Bright 发表于 2013-4-15 13:42
我自己找到了一个妥协的方法,虽然不是万能的,但很多情况可以解决:

#define SYS_SETTING_ADDR    0x08 ...

找到了你设置ROM1 ROM2的标签页,但不太明白,ROM1,ROM2 设置的是什么。看说明是off-chip。结合你程序整个下来,理解的不太好,望解释~~多谢
pogulu
2楼-- · 2019-12-22 12:23
本帖最后由 pogulu 于 2013-8-5 14:34 编辑

完全被各种地址叠加和设置弄糊涂了
xiefy21
3楼-- · 2019-12-22 15:12
mark……
顶一个…
lwb807
4楼-- · 2019-12-22 17:54
volatile直接加在数据组前不知道可靠性如何? 没装IAR测试不了,只是一个想法,
volatile const SYS_FCT_SETTING SysFctSetting =
#endif
{
     0x0FFF,
     9600,
};
pogulu
5楼-- · 2019-12-22 22:54
 精彩回答 2  元偷偷看……
guowanling8061
6楼-- · 2019-12-23 02:56
还在学习中.........

一周热门 更多>