C语言--单片机

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_28877125/article/details/85106141