通过JLink的SW实现printf函数

来源:互联网 发布:日本电影推荐知乎 编辑:程序博客网 时间:2024/05/22 13:59

  标准库函数printf需要调用fputc函数来实现间字符输出,所以重写fputc函数可以实现将字符输出到ITM跟踪端口,从而在MDK的Debug (printf) Viewer得到打印信息。
keil官网有关于实现的详细步骤
http://www.keil.com/support/man/docs/jlink/jlink_trace_itm_viewer.htm

根据官网说明先创建了一个文件重写了fputc函数,如下:

#include <stdio.h>#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))#define ITM_Port16(n)   (*((volatile unsigned short *)(0xE0000000+4*n)))#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))#define DEMCR   (*((volatile unsigned long *)(0xE000EDFC)))#define TRCENA  0x01000000struct __FILE { int handle; };FILE __stdout;FILE __stdin;int fputc(int ch, FILE *f){    if (DEMCR & TRCENA) {        while(ITM_Port32(0) == 0);        ITM_Port8(0) = ch;    }    return (ch);}

  想要使用ITM功能,必须把DEMCR.TRCENA位置位,否则ITM处于除能状态,无法使用。FILE类型在stdio.h头文件中定义,所以要包含stdio.h头文件。
  之后再这里写图片描述->Debug->Settings进行MDK调试相应设置:
 这里写图片描述
 port位置一定选择SW模式,不能为JTAG。
 这里写图片描述
 在1处打勾,2处将时钟设置为当执行到printf时的CPU时钟,3处如图设置。
 设置完成后就可以通过printf打印信息了,进入调试模式后打开View - Serial Windows - Debug (printf) Viewer窗口可以看到打印信息。
 当如果代码中有printf函数时如果没有重写fputc函数,当程序开始运行时就会死在BKPT 0xAB处。
 
  

0 0
原创粉丝点击