版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28877125/article/details/85106141
https://blog.csdn.net/xwt321/article/details/79370066
51单片机采用哈佛结构。内存空间编址有重叠。可以在不同总线上定义不同的变量。在KEIL C51中定义了xdata、idata、xdata、code几种域修饰符。这些修饰符决定了变量访问方式。
data:固定指前面0x00-0x7F的128个RAM,可以用acc直接读写,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xFF的256个RAM,其中前128和data的128完全相同,只是访问的方式不同。
xdata:外部扩展RAM。
code:ROM
神奇的代码
说出来你可能不信,这段代码占单片机的代码段达到了850byte.
void scs_pwm_output(uint16_t fcpu, uint8_t coe, uint16_t freq, uint8_t duty)
{
uint16_t cycle = ((float)1 / freq) * 1000000;
uint16_t var = (uint16_t)cycle / 2;
float varl = (float)coe / fcpu;
float varc = (float)duty / 100;
uint16_t t1 = var * varc;
uint16_t t0 = var - t1;
uint16_t varlong = (uint16_t)t1 / varl;
uint16_t varshort = (uint16_t)t0 / varl;
uint16_t th2_t1 = 65536 - varlong;
uint16_t th2_t0 = 65536 - varshort;
}
如下优化之后,代码居然就只剩下344Byte
void scs_pwm_output(uint16_t fcpu, uint8_t coe, uint16_t freq, uint8_t duty)
{
uint16_t cycle = (uint16_t)1000000 / freq;
uint16_t var = cycle >> 1;
uint16_t varl = (uint16_t)(coe*1000) / fcpu;
uint16_t varc = (uint16_t)(duty*10) / 100;
uint16_t t1 = var * varc;
uint16_t t0 = (var*10) - t1;
uint16_t varlong = (uint16_t)(t1*100) / varl;
uint16_t varshort = (uint16_t)(t0*100) / varl;
uint16_t th2_t1 = 65536 - varlong;
uint16_t th2_t0 = 65536 - varshort;
}