一:概述
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:最重要的是代码工程的 项目中的设置,没有设置,导致程序编译不通过。