STVD7的开发环境中提供了非常方便的手段,可以轻松的实现C语言程序的存储定位。以下说明以我另一个帖子的例子作为前提:7 i+ L8 z5 G$ Y" U$ X7 \0 } ST7 16位通用定时器中的输出比较功能(Output Compare)详解# D3 [4 j0 M' z7 @; ]' p o 假定我有一个函数delay()需要定位到0x8000开始的区域;有三件事要做: 1)原有的代码段是默认定位在从0x8000开始的区域,把默认代码段重定位到从0x9000开始的区域; 2)在函数delay()前用#pragma定义一个新的代码段,命名为.delay_code,程序片断如下;# ]) L. \) @2 s% G& ]; i/ N& j" F 3)将新的代码段.delay_code定位在从0x8000开始到0x8FFF结束的区域。 程序片断: ! B) T# b' g+ k0 p, S# W --------------------------------------------------------------------------------/ K: l1 x0 T' Y3 L. W4 i7 p #pragma section (delay_code) // 定义新代码段 4 D+ R' f; I& \9 E0 k/ y) e( b void delay(void)* u/ F0 n0 N, B7 _+ T { unsigned char counter; for (counter = 0; counter < 100; counter++) _asm("nop");% L$ g- N: n* V! h# [8 W } #pragma section () // 以下代码恢复到默认代码段 -------------------------------------------------------------------------------- 2 A ~6 M. d) V! C* S# b. Y 完成代码段的定位、重定位,请按Project/Settings...,按照下图配置就可完成: 3 d5 V. G5 ~0 [# Z 编译完后的.map文件显示定位成功: --------& \6 F$ F0 v! E$ _* Z Segments -------- start 00009000 end 000090da length 218 segment .text |