keil printf小技巧
keil添加组件 下载后,自行安装https://i-blog.csdnimg.cn/blog_migrate/becc4b28f0bb14fdfe9873f34c075f9d.png工程添加组件并开启 fputc 重定向至EVRhttps://i-blog.csdnimg.cn/blog_migrate/ef970e1da13a70c431b4683317760ab8.png同时记得勾选使用微库
https://i-blog.csdnimg.cn/blog_migrate/76cda5cfd428256d343950a26f5fd9be.png
Event Recorder中间件的 fputc 使用了关键字weak,因此不要在工程中定义自己的 fputc函数,否则会覆盖 Event Recorder中间件的 fputchttps://i-blog.csdnimg.cn/blog_migrate/6a7addf9dacd2fb7f37b2956a1e655c9.png初始化组件https://i-blog.csdnimg.cn/blog_migrate/571abbf741cf013d6f0f79722f8bf44e.png
并添加一下代码进行初始化组件#include "EventRecorder.h"/* 初始化 EventRecorder 并开启 */EventRecorderInitialize(EventRecordAll, 1U);使用printf打印这里顺带测量了打印耗时,可以发现使用Event Recorder中间件的printf打印耗时是us级的(和单片机有关,这里使用的是72MHz的stm32f105)https://i-blog.csdnimg.cn/blog_migrate/658c8eeea010e7c5c6fcb18c1466acdb.png
仿真中可以调用printf么 中断多的时候,调试方便吗?总感觉容易出问题。 印象里实现printf不是要实现putc函数吗? Keil MDK(Microcontroller Development Kit)是一款广泛使用的ARM Cortex-M微控制器开发工具。在使用Keil MDK进行嵌入式开发时,printf函数是一个非常有用的调试工具,但由于嵌入式系统通常没有标准输出,因此需要重定向printf函数到串口或其他输出设备 通过重定义_write函数,可以将printf输出重定向到串口。例如:#include <stdio.h>
int _write(int file, char *ptr, int len) { for (int i = 0; i < len; i++) {ITM_SendChar((*ptr++));// 假设使用ITM(Instrumentation Trace Macrocell)
}
return len;
}
半主机模式允许嵌入式应用程序使用主机PC的输入输出功能。在Keil中启用半主机模式后,printf可以直接输出到调试器的控制台。需要在项目选项中启用半主机模式,并在代码中包含相应的库 printf支持多种格式化选项,如%d(十进制整数)、%x(十六进制整数)、%f(浮点数)、%s(字符串)等。可以使用这些格式化选项来输出不同类型的数据,便于调试和查看 如果串口速度较慢,可以使用sprintf将输出缓存到一个字符串中,然后一次性发送,减少串口通信的开销 在嵌入式系统中,printf的开销可能较大,特别是在中断服务例程(ISR)中使用时 可以使用简单的字符串发送函数替代printf,或者在调试完成后移除所有printf调用,以提高性能 SEGGER的Real-Time Transfer(RTT)技术允许通过J-Link调试器进行高速的终端I/O操作。可以在Keil中集成SEGGER RTT库,使用SEGGER_RTT_printf函数进行输出 可以根据调试信息的紧急程度进行分级,例如使用宏定义来控制不同级别的调试信息输出 通过microlib可以在Keil MDK中更有效地使用printf进行嵌入式系统的调试和开发 Event Recorder中间件的 fputc 使用了关键字weak 一般就是通过重定向fputc函数来实现,也可以自己使用格式化字符串函数来实现。
页:
[1]