
STVD7的开发环境中提供了非常方便的手段,可以轻松的实现C语言程序的存储定位。以下说明以我另一个帖子的例子作为前提:( _; U8 @7 N3 E3 n; A ST7 16位通用定时器中的输出比较功能(Output Compare)详解 假定我有一个函数delay()需要定位到0x8000开始的区域;有三件事要做:9 h9 z( k0 i1 O4 \$ J1 Y9 r 1)原有的代码段是默认定位在从0x8000开始的区域,把默认代码段重定位到从0x9000开始的区域;4 P: Y% r* r- ~: l5 g- J5 n 2)在函数delay()前用#pragma定义一个新的代码段,命名为.delay_code,程序片断如下;3 A T+ t* `6 I, a 3)将新的代码段.delay_code定位在从0x8000开始到0x8FFF结束的区域。 程序片断: --------------------------------------------------------------------------------; }; y7 V" T9 e1 L #pragma section (delay_code) // 定义新代码段 void delay(void)/ P5 V# B; o U* E6 [% \( Q { j" c! e. B4 F8 M unsigned char counter; for (counter = 0; counter < 100; counter++)1 x6 u+ a" a. n! Q$ H$ J a" A- N _asm("nop");" V) S$ }# B7 s5 t% Y } #pragma section () // 以下代码恢复到默认代码段 -------------------------------------------------------------------------------- ; q# e% t" y, i; V: m 完成代码段的定位、重定位,请按Project/Settings...,按照下图配置就可完成: $ c2 w& c/ c+ e/ u n$ L 编译完后的.map文件显示定位成功:) z3 i$ S+ g2 Z p2 I -------- Segments -------- 6 d& X" c+ f& u" R5 B) a& U5 A start 00009000 end 000090da length 218 segment .text |