STM32 - const buffer cause sprintf can't format

试验原因

在作试验, 从一个已有第三方的例子工程上, 用sprintf格式化一段字符串,发现格式化之后的buffer为空。
将代码搬到自己干净的F4工程模板上,sprintf格式化缓冲区后,缓冲区还为空,好奇怪。
将代码搬到vs2017上,发现操作缓冲区时报错了, 才看到那个buffer是const修饰的。
原来,人家原始的demo中,那个缓冲区就是一个常量字符串。我改buffer为一个0x100长度的缓冲区后,没有去掉const修饰, 但是MDK没有任何警告…
看来下位机中遇到不能操作的内存, 就不操作了.

// const u8 TEXT_Buffer[0x100]={'\0'}; // 在MDK中, 带const修饰的buffer无法操作, 但是不报错. 编译也没警告
u8 TEXT_Buffer[0x100] = {'\0'}; // 必须非const的buffer才可以正常操作
int i = 0;

int main(void)
{
	// @note ls main_example_by_st() // ST官方的例子
	// @note ls 设置系统时钟, 否则进不了SysTick_Handler
	RCC_GetClocksFreq(&RCC_Clocks);
	SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); // @note ls 168000000(168MHZ) / 1000(微秒) = 1ms 发生一次tick
	// bsp_Init_led(); // 初始化外设 - LED指示灯
	printf(">> main\n");
	memset((void*)TEXT_Buffer, 0, sizeof(TEXT_Buffer)); // 在vs2017中, 只要操作const修饰的buffer, 就报错了.
	sprintf((char*)TEXT_Buffer, "%d : %s", i,
	        "test_24c02"); // 如果是const修饰的buffer, 执行这句后, 缓冲区内容还是初始化时的全0字节
	printf("%s\n", TEXT_Buffer);
	my_HW_Init();

	// 验证一下固件库是否能正常运行
	do {
		delay_ms(500);
		GPIO_ToggleBits(GPIOE, GPIO_Pin_3); // 将指示灯状态翻转, 形成闪烁
	} while (1);
}

你可能感兴趣的:(#,STM32)