|
STVD7的开发环境中提供了非常方便的手段,可以轻松的实现C语言程序的存储定位。以下说明以我另一个帖子的例子作为前提: ST7 16位通用定时器中的输出比较功能(Output Compare)详解, v4 j0 E% w" q* s 假定我有一个函数delay()需要定位到0x8000开始的区域;有三件事要做:: W$ [/ o' E) j* m" y( U) @' R 1)原有的代码段是默认定位在从0x8000开始的区域,把默认代码段重定位到从0x9000开始的区域;5 D8 q3 f& d, _3 J# L3 z: V 2)在函数delay()前用#pragma定义一个新的代码段,命名为.delay_code,程序片断如下;, M# z0 J6 Y- F" k+ ? 3)将新的代码段.delay_code定位在从0x8000开始到0x8FFF结束的区域。 " m! Y c. ` u% f; A# l! s- f 程序片断: - e0 h5 M1 I# ` -------------------------------------------------------------------------------- #pragma section (delay_code) // 定义新代码段 void delay(void) {9 b8 c6 f7 K1 _/ t5 K6 T4 ?2 F unsigned char counter;- o0 e* P6 k. s for (counter = 0; counter < 100; counter++) _asm("nop"); } #pragma section () // 以下代码恢复到默认代码段 ) j9 `* l+ T Q& F- d -------------------------------------------------------------------------------- 完成代码段的定位、重定位,请按Project/Settings...,按照下图配置就可完成: ; I" P/ ] E1 M2 g1 e6 a3 \6 H; B 编译完后的.map文件显示定位成功: -------- Segments -------- / P2 |. Z( T$ a$ |5 z- k, z$ u 7 } @" Y& N2 B! b5 D1 z start 00009000 end 000090da length 218 segment .text |
微信公众号
手机版