
STVD7的开发环境中提供了非常方便的手段,可以轻松的实现C语言程序的存储定位。以下说明以我另一个帖子的例子作为前提: ST7 16位通用定时器中的输出比较功能(Output Compare)详解: u/ I5 k2 m9 [7 k: A 假定我有一个函数delay()需要定位到0x8000开始的区域;有三件事要做: 1)原有的代码段是默认定位在从0x8000开始的区域,把默认代码段重定位到从0x9000开始的区域;$ Z+ B$ k" H+ }$ m" d4 N: k# h" g 2)在函数delay()前用#pragma定义一个新的代码段,命名为.delay_code,程序片断如下; 3)将新的代码段.delay_code定位在从0x8000开始到0x8FFF结束的区域。 $ ~# u9 j) V4 [6 h7 C2 v$ g 程序片断: 1 p+ w/ k* l9 V6 K) c/ B5 m -------------------------------------------------------------------------------- #pragma section (delay_code) // 定义新代码段 - G1 i, U7 z# j. J; i' c3 G# Z void delay(void)& h' B! ?: ?+ ~$ I. R+ L {1 u( W. \3 k. p( Y% a1 T( R unsigned char counter; for (counter = 0; counter < 100; counter++) _asm("nop"); \3 h+ k; _2 m& P C, T } / k$ i( B2 p S! C) N* s; {- D' f7 W #pragma section () // 以下代码恢复到默认代码段 -------------------------------------------------------------------------------- " |/ c+ G4 C7 q. S o$ f; I 完成代码段的定位、重定位,请按Project/Settings...,按照下图配置就可完成: ) b, u) `# L4 r6 m, M- { 编译完后的.map文件显示定位成功: --------. N( T3 A* R+ s+ O' K' c& z Segments# L* X, Q4 }! E1 h -------- 4 u( U2 d" U8 Q- U3 ? start 00009000 end 000090da length 218 segment .text |