
STVD7的开发环境中提供了非常方便的手段,可以轻松的实现C语言程序的存储定位。以下说明以我另一个帖子的例子作为前提: ST7 16位通用定时器中的输出比较功能(Output Compare)详解$ p7 }* K- q% m- m 假定我有一个函数delay()需要定位到0x8000开始的区域;有三件事要做:/ l# c3 I% E' o1 ^ 1)原有的代码段是默认定位在从0x8000开始的区域,把默认代码段重定位到从0x9000开始的区域;: a) J/ \2 _1 W 2)在函数delay()前用#pragma定义一个新的代码段,命名为.delay_code,程序片断如下;1 u9 h/ }" e r; I! } 3)将新的代码段.delay_code定位在从0x8000开始到0x8FFF结束的区域。 3 N7 W6 ?5 e8 s7 T& d 程序片断: -------------------------------------------------------------------------------- K2 P" {2 M" |# O- j #pragma section (delay_code) // 定义新代码段 3 O& h: S! p6 A$ \" w! y# V" A void delay(void) { unsigned char counter; for (counter = 0; counter < 100; counter++) _asm("nop");+ F3 f) w+ c1 v% j } , L+ K! g1 I- w1 }! H8 S* l) t. m7 o+ J* ] #pragma section () // 以下代码恢复到默认代码段 -------------------------------------------------------------------------------- ) h( |% s1 R: r, p8 H" W 完成代码段的定位、重定位,请按Project/Settings...,按照下图配置就可完成: " x. d' m5 u; y+ K 编译完后的.map文件显示定位成功: -------- Segments -------- start 00009000 end 000090da length 218 segment .text |