CCS中如何打开swo打印打开的几份文档

亦舒说: 人们日常所犯最大的错误,是对陌生人太客气,而对亲密的人太苛刻,把这个坏习惯改过来,天下太平。 ...
使用 Printf via SWO/SWV 输出调试信息
Stdout and stderr of the application can be redirected to ITM stimulus port #0.
It means that stdout/stderr messages (e.g. strings sent by printf) can be transferred
from the target application to the C-SPY Terminal I/O window via SWD.SWO pin &JTAG.TDO pin&.
Requirements:
Cortex-M3/M4 J-Link/J-T
IAR Embedded Workbench for ARM, V5.50.5 or later.
1. plus rerouting stdout/stderr messages via SWO (library low-level interface implementation, see the figure below).
2. except for enabling ITM stimulus port #0 and using it for routing data to the C-SPY Terminal I/O window.
3. Open the Terminal I/O window from the View menu.
Start executing the application to collect Software Trace information.
Stdout messages sent by printf( ) in the application will be displayed here via SWO Trace.
Semihosting技术
将应用程序中的IO请求通过一定的通道传送到主机(host),由主机上的资源响应应用程序的IO请求,而不是像在主机上执行本地应用程序一样,由应用程序所在的计算机响应应用程序IO请求,也就是将目标板的输入/输出请求从应用程序代码传递到远程运行调试器的主机的一种机制。
简单来说,目标开发板上通常不会有输入/输出这些外设,开发板运行的代码想要将结果打印出来,或者获得用户的输入,可以通过请求远程主机IO设备来实现,如:显示器,键盘等。
目标开发板执行代码中加入对输入/输出设备进行访问函数,如:printf,scanf等,这些函数并不是目标开发板的库函数,而是远程主机交叉编译器中带有的库函数,这些库函数被编译时,编译成一条软件中断指令。
当目标开发板上电运行之后,执行到请求访问输入/输出设备指令时,产生特定中断号的软件中断SWI,与开发板相连的调试器会先截获目标板SWI请求,由于开发板程序中也可能存在用户自定义软件中断,为了区分二者,调试器会根据SWI的软中断号来判断是不是semihosting模式IO请求,如果是,则取出R0寄存器里代表的具体请求号,然后使用远程主机来响应目标板具体IO请求,而不是开发板本身去处理setmihosting请求。
semihosting仅仅是一种调试手段,它的工作原理就是利用调试器捕捉目标环境运行过程中产生SWI中断,然后向远程主机调试环境发送对应的调试信息。
也就是说目标开发板通过特定的软件中断指令,借用了远程主机的输入输出设备实现IO请求的访问。
Semihosting半主机调试模式,只能使用在开发板和调试主机通过仿真器连接的情况下,也就是说脱离了主机调试环境上述代码不能正常运行。
目标开发板上执行的IO实际上是交给了远程主机来处理实现,正是因为如此,这种方式只适合在调试模式下,真正的嵌入式系统不可能依赖于主机实现IO处理的,嵌入式系统要想独立出来实现IO请求的处理,这就需要将输入输出库函数的底层相关硬件实现重定向。
新一代调试机制
使用ITM机制实现调试,实现printf与scanf, ITM是ARM在推出semihosting之后推出的新一代调试机制。ITM机制要求使用SWD方式接口,并需要连接SWO线。
It is only TX and not RX but most people just use printf for tracing
If you have a USB serial adapter, you can also use it as a SWO viewer, SWO is actually very similar to UART except using a much faster speed,
for example, with JLink, I can push it to 6MHz, which most USB serial adapters do not support.
The speed is incredibly important in timing critical debugging.
Remember, SWO is not just an application software printf
style debugging, it is tied to ITM (instrumentation trace macrocell)
which enables software & hardware trace with timestamp. i.e it allows you to debug OS and application events.
It's not a problem to use SWO out in production code.
The SWO is separate from the debugger.
You can even run the SWO console w/o the debugger connected.
Target 使用 SWO 的条件
硬件条件:你得把芯片的SWO脚接到调试口上,按JTAG接线的话,这个默认已经接上了.代码条件:你得把Printf的输出函数,替换成SWO输出函数,其实这个函数在CMSIS库里已经提供了,就在core_cm4.h里面,如下:
/** \brief
ITM Send Character
This function transmits a character via the ITM channel 0.
It just returns when no debugger is connected that has booked the output.
It is blocking when a debugger is connected, but the previous character send is not transmitted.
\param [in]
Character to transmit
Character to transmit
static __INLINE uint32_t ITM_SendChar (uint32_t ch)
if ((CoreDebug-&DEMCR & CoreDebug_DEMCR_TRCENA_Msk)
/* Trace enabled */
(ITM-&TCR & ITM_TCR_ITMENA_Msk)
/* ITM enabled */
(ITM-&TER & (1UL && 0)
/* ITM Port #0 enabled */
while (ITM-&PORT[0].u32 == 0);
ITM-&PORT[0].u8 = (uint8_t)
return (ch);
Redirecting/retargeting printf()
#include &stdio.h&
#include &stm32f4xx.h&
int fputc(int c, FILE *stream)
return(ITM_SendChar(c);
SWO printf in IAR
The following steps demonstrate how to configure the SWO pin to output printf() statements in IAR.
1) Add #include to the beginning of the file where you want to write your printf statement.
2) Enable SWO Output.
The simplest way of enabling the SWO line in the EFM32 is by using the setupSWO function.
You can find this function in the energyAware Profiler, in the left pane, when you open up the program.
Once this is run, the SWO output will be enabled to the correct pin on the Development Kit or the Starter Kit.
3) Configure the project in IAR to send printf statements through SWO:
4) Write printf('Hello world'); in your code after
you have enabled the SWO output.
5) Compile the code and download it to the Starter Kit/Development Kit. Enter a debug session.
6) Once you are in debug mode, you should set the correct SWO clock speed (14 MHz) in J-link-&SWO Configuration...:
(The SWO output is clocked by the auxiliary HFRCO oscillator which is running at 14MHz regardless of the chosen system clock frequency.)
7) Open up View-&Terminal I/O.
8) When you hit Go you should see the printf statement show up as below:
#ifndef LOG_LEVEL_LOWEST
#define LOG_LEVEL_LOWEST
_LOG_LEVEL_DEBUG
* Defines the default log level.
#ifndef LOG_LEVEL_DEFAULT
#define LOG_LEVEL_DEFAULT
_LOG_LEVEL_INFO
#if LOG_LEVEL_LOWEST &= _LOG_LEVEL_TRACE
#define logTrace(MSG, ...)
__logLine(&_log, LOG_LEVEL_TRACE, MSG, ##__VA_ARGS__)
#define logTrace(MSG, ...)
#if LOG_LEVEL_LOWEST &= _LOG_LEVEL_DEBUG
#define logDebug(MSG, ...)
__logLine(&_log, LOG_LEVEL_DEBUG, MSG, ##__VA_ARGS__)
#define logDebug(MSG, ...)
#if LOG_LEVEL_LOWEST &= _LOG_LEVEL_INFO
#define logInfo(MSG, ...)
__logLine(&_log, LOG_LEVEL_INFO, MSG, ##__VA_ARGS__)
#define logInfo(MSG, ...)
#if LOG_LEVEL_LOWEST &= _LOG_LEVEL_WARN
#define logWarn(MSG, ...)
__logLine(&_log, LOG_LEVEL_WARN, MSG, ##__VA_ARGS__)
#define logWarn(MSG, ...)
#if LOG_LEVEL_LOWEST &= _LOG_LEVEL_ERROR
#define logError(MSG, ...)
__logLine(&_log, LOG_LEVEL_ERROR, MSG, ##__VA_ARGS__)
#define logError(MSG, ...)
#ifdef DEBUG
dbgPrintf(MSG, ...)
printf(MSG, ##__VA_ARGS__)
dbgPrintf(MSG, ...)
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!printf通过SWO在IAR的View->Teminal I/O 打印输出
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
printf通过SWO在IAR的View->Teminal I/O 打印输出
操作方面见下面的图片:
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved浅谈工程师的调试法宝(三)---SWO引脚的巧妙应用
我的图书馆
浅谈工程师的调试法宝(三)---SWO引脚的巧妙应用
摘要 在Cortex-M3\M4系列MCU中,内核的调试组件都有一个仪器化跟踪单元(ITM)。ITM的一个主要的用途,就是支持调试信息的输出(例如,printf格式输出)。ITM包含了32个刺激端口,允许不同的软件把数据输出到不同的端口,从而让调试主机可以把它们的信息分离开。每个端口都可以独立的使能/除能,还可以允许或禁止用户进程对它执行写操作。那么这些与MCU的SWO引脚有什么关系呢?刚才我们有说ITM包含了32个端口,其中SWO引脚,就是ITM模块的端口0,我们可以直接用它来输出一些调试信息。那么现在就看看如何使用它吧。 这次我们测试是基于飞思卡尔的FRDM-K64开发板,如图 1所示。关于飞思卡尔系列更多的开发板资料请访问http://www.zlgmcu.com/Freescale/。 图 1 K64开发板 把MCU的SWO引脚同J-link等调试工具连接在一起,因为K64开发板已经直接引出SWD接口了,所以我们就直接连接了J-Link。如图 2所示,第6脚就是SWO引脚。图 2 SWD接口 当MCU连接好J-link之后,我们在工程中的主函数起始处添加stdio.h文件,如下所示。#include
接下来为了能直接调用printf函数格式化输出,又需要用到我们之前提到的重定向技术了,只是这次不是重定向到串口,而是ITM模块的0通道,即SWO引脚。如程序清单 1所示。程序清单 1 重定向代码int fputc(int ch, FILE *f) { ITM_SendChar(ch); return(ch);} 其中ITM_SengChar函数是core_cm4.h内核文件里定义的内联函数,我们可以直接调用。 完成重定向之后,我们写了个定时打印HelloWorld的程序。打开Keil工程的【Options for Target】-&【debug】-&【settings】-&【Trace】,对Trace选项卡进行如图 3所示的配置。 图 3 Trace选项卡配置 点击确定之后,进入调试模式,打开【View】-&【Serial Windows】-&【Debug(printf) Viewer】,这时我们就可以看到MCU通过J-link向编译器输出的打印信息了,如图 4所示。打印速度还很快哦。 图 4 Debug Viewer窗口 到此我们算是学会了使用SWO引脚来调试输出了,是不是很酷哦。细心的网友可能会发现为什么Cortex-M0\M0+内核的MCU没有找到SWO引脚呢?这是因为它们采用的还是ARM-V6的老架构,内核的调试组件没有ITM模块。 又是一个遗憾,本来以为找到了最合适的调试方法,却对MCU的内核有限制。那么有没有一种调试方同时具有SWO的优点,并同时能在Cortex系列内核的MCU中使用呢?当然这些是难不住调试经验非常丰富的ZLG工程师的,敬请大家关注下一篇文档《浅谈工程师的调试法宝(4)之RTT的使用》。
喜欢该文的人也喜欢德州仪器 (TI) 是一家跨国性的半导体设计与制造公司。因具有100,000+个以上模拟IC和嵌入式处理器而独树一帜、同时兼备软件、工具以及业界最大的销售团队/技术支持团队。
Texas Instruments Incorporated. 版权所有.M4刚入门,使用Tiva评估板,用CCS5.5调试时出现如下截图显示的问题是怎么回事?? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。11被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答ti.com/cn/lit/pdf/spmu298-- 这个文档非常重要视频教程:3.
Tivaware例程Tivaware里边带有多例程,也是一个很不错的参考资料。4.
TI Wiki网页:5.
杭州艾研基于Tiva LaunchPad开发了模拟教学套件,代码是开放下载的,也可以参考下模拟教学套件的代码。具体可到网站上下载:
参考书籍:《TM4C123微处理器原理与实践》
清华大学出版社 叶朝辉书籍配套有光盘资料,里边有一部分代码;7.
如果在学习过程中,碰到问题,可到TI官方论坛发帖询问。论坛链接:5
常见问题解决把一些常见问题汇总如下,欢迎大家继续补充。5.1
找不到Tivaware请先到官网下载Tivaware软件包,下载完成后安装到电脑上;最后,要记得把Tivaware导入到CCS。具体参考章节2.4;5.2
TivaWare的函数定义Tivaware外设驱动库有哪些函数可以调用,每个函数的输入输出参数等说明,都可以参考Tivaware外设驱动库用户指南
TivaWare(TM) Peripheral Driver Library for C Series User's Guide()同时,外设驱动库DriverLib的函数实现(即源代码)导入CCS中也可以直接查看。5.3
编译时提示找不到头文件在编译工程时,经常会出现找不到头文件的错误情形。错误现象描述:(1)
Problem窗口提示: #1965
cannot open source file "inc/hw_memmap.h"(2)
在源代码也会提示x 或者有问号提示;解决方法请参考章节3.3.2中的描述添加头文件路径;如果头文件路径均包含正确:(1)工程目录Include下包含有自己添加的文件路径:(2)源代码包含头文件的地方,前边不带问号;5.4
找不到变量也是常见的问题,一般是因为没有包含头文件。具体要包含哪些头文件,要靠自己多练习了。5.5
unresolved symbol错误错误现象描述:unresolved symbol GPIOPinWrite, first referenced in ./main.obj
unresolved symbol GPIOPinTypeGPIOOutput, first referenced in ./main.obj
解决方法:只申明了函数,找不到原型。引用了Tivaware的DriverLib库函数,但是工程里边没有把函数库添加进来。使用的是其它函数的头文件,该函数原型并不在driverlib这边:只是添加tiva的driverlib库文件是不行的;6
附录本文档只是解决基本的环境搭建以及代码下载的问题,更多的Tiva功能模块请自行参考用户手册等资料。详见。如果描述不当,欢迎批评指正,xie_版本时间修改描述草稿版将多个分散的文档整理成一个较完整的文档,半成品;V1.0内容初步修改完成;71 条评论分享收藏感谢收起添加评论分享收藏感谢收起写回答

我要回帖

更多关于 打开打印机时出现错误 的文章

 

随机推荐