一:概述
printf C 语言中常用的输出函数,广泛应用于各种嵌入式、桌面应用程序和调试过程中。这些函数可以将格式化的数据输出到标准输出(如控制台)或存储到字符串中。在系统开发中,了解它们的底层实现不仅能够帮助优化性能,还能提高代码的可移植性和灵活性。
    通过之前的帖子已经使用串口1进行数据的传输过程,今天调试一下使用printf输出一些变量信息。
二:FSP的配置
2.1 增加堆栈大小:

printf函数通常需要设置堆栈大小。这是因为printf函数在运行时需要使用栈空间来存储临时变量和函数调用信息。如果堆栈大小不足,可能会导致程序崩溃或不可预期的行为。
printf函数使用了可变参数列表,它会在调用时使用栈来存储参数,在函数调用结束时再清除参数,这需要足够的栈空间。另外printf也会使用一些临时变量,如果栈空间不足,会导致程序崩溃。
因此,为了避免这类问题,应该根据程序的需求来合理设置堆栈大小。
2.2 在e2s 中重映射printf设置

三:软件增加重映射代码如下:
打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include <stdio.h>
#ifdef __GNUC__                                 //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
fsp_err_t err = FSP_SUCCESS;
err = R_UARTA_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(g_data_transmit_flag == false){}
g_data_transmit_flag = false;
return ch;
}
int _write(int fd,char *pBuffer,int size)
{
for(int i=0;i<size;i++)
{
__io_putchar(*pBuffer++);
}
return size;
}四:在定时器中,增加一条printf的调试信息输出:
void g_timer0_callback(timer_callback_args_t *p_args)
{
if (TIMER_EVENT_CYCLE_END == p_args->event)
{
/*        g_timer_flag [APP_TML_16_BIT] = true;
        g_number_cycles ++;*/
count0Point++ ;
if(count0Point>=1000)
{
count0Point = 0 ;
printf("EEPW world test printf!\n");
if(flag ==0)
{
flag =1 ;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW);
}
else
{
flag =0 ;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH);
}
}
}
}五:验证如下:

后记:
1:开始调试的时候,由于工具链创建工程的时候,选错了,导致程序代码编译不通过。
2:调用printf时候,堆栈大小使用的默认数值,导致程序堆栈溢出。
3:最重要的是代码工程的 项目中的设置,没有设置,导致程序编译不通过。

 
					
				 
						
 
			
			
			
						
			 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

