本帖最后由 okwh 于 2019-3-23 18:00 编辑
IRDLPC1768 使用Event Recorder调试 ---- 5
1 调试工具
调试是开发的关键,中间关系已发成败。 优秀的调试工具 帮助编程者迅速确定错误定位、评估代码表现,对研发有举足轻重的影响。 长期以来,我们基本的调试方法是单步执行。 但随着嵌入系统的大量使用、开发复杂度的增加,单步执行调试效率不高,对多线程下的调试力有不逮。 IDE同时提供丰富先进的调试方法非常重要,keil大约从5.22版以编译器扩展方式开始增加Event Recorder做为调试工具,后有增加component Viewer, 至5.26可用的编译器扩展v1.6,两个新工具已经有了出色表现,成为调试利器。以完全可以和Seagger的RTT、System Viewer相媲美甚至超越。更可贵的是这两个新工具是编译器扩展、可用户配置,几乎任何下载调试硬件都支持,不象RTT、System Viewer只能配合那个Jlink才能用。
CMSIS-DAP已功能完备,支持丰富的功能,至少在市场最广泛的Cortex-M上已充分够用,DAP调试器越来越多。
使用RTOS时,调试尤其艰难,过去的Event Viewer不支持Keil RTX 5,System and Thread Viewer也只支持到Keil RTX 4.82。 许多RTOS自己内含了一些调试手段,但这增加了学习难度、和开发成本。 Event Recorde和component Viewer给人眼前一亮的感觉。有此利器,传统的裸机开发者可以转入RTOS下的开发,降低了自己的劳动强度、或扩展了自己处理复杂系统的能力。
2 keil uVision 的编译扩展 ARM Compiler Software Extensions 安装在Keil/ARM/PACK/Keil/ARM_Compiler/1.6.0/Doc/General/html/index.html 包括:Event Recorder 和各种I/O Retargeting指 STDIN、STDOUT、STDERR、TTY、File等,通常它们是用于调试的,并且不再象以前那样需要物理串口,现在它们可以各个方式重定向包括重定向到Event Recorder。 Event Recorde和component Viewer在不同版本下有些不同,建议使用最新版uVision v5.26, 不然有时还是或出些莫名其妙的问题,比如至今仍让我感觉来无踪去无影、时有时无的memory mismatch错误。
3 使用EventRecorder 说明http://www.keil.com/pack/doc/compiler/EventRecorder/html/er_use.html
可以在运行环境选择插入Event Recorder。
可选分配指定Event Recorder使用争用内存,但这是可选的,可以不指定。
CMSIS-RTOS2 + Keil RTX5自动支持 使用Event Recorder和componentViewer,在运行时环境选择加入RTOS RTX 源文件后,可在RTX配置指轻松配置。开发完成,可改选库方式非源文件加入,即可用于发布,不再调试。
4 例程
- #include "EventRecorder.h" ////////////////////////////////////////////////////
- ...........参前文例子工程
- int main (void) {
- SystemCoreClockUpdate (); /* Update system core clock 100MHz */
- // SysTick_Config(SystemCoreClock/10); /* SysTick 中断 each 100 ms */
- // 不需要了, RTX 做系统初始化, SysTick被用于RTOS的调度计时,不得再它用
- LED_Initialize(); /* Initialize the LEDs */
- EventRecorderInitialize (EventRecordAll, 1); ////////////////////////////////////////////////////
- EventRecorderStart(); ////////////////////////////////////////////////////
- osKernelInitialize();
- tid_phaseA = osThreadNew(phaseA, NULL, NULL); //创建线程
- tid_phaseB = osThreadNew(phaseB, NULL, NULL);
- tid_phaseC = osThreadNew(phaseC, NULL, NULL);
- tid_phaseD = osThreadNew(phaseD, NULL, NULL);
- tid_Other = osThreadNew(Other, NULL, NULL);
- // printf("456");
- // printf("123");
- osThreadFlagsSet(tid_phaseA, 0x0001); /* set signal to phaseA thread 触发第一个线程 */
- osKernelStart();
- //osDelay(osWaitForever);
- while(1);
- }
[color=rgb(51, 102, 153) !important]复制代码
debug下打开看到:这里显示的是RTOS的事件,对于分析RTOS行为极其有用。
并且EventRecorder 可选设定配置显示那些事件及详细程度。
debug下打开systrm analyizer 还看到:对于理解各线程极其状态变化和事件顺序极其有用
5 使用ComponentViewer Event Recorder和Component Viewer是同一软件包。
关于Component Viewer
debug下可打开看到:RTX5组件的各种关键信息,对于分析程序设计行为、资源占用 极其有用。
参考: 更多调试信息: http://www2.keil.com/mdk5/debug/?_ga=2.182893862.187618891.1553330228-952045664.1550065544 http://developer.arm.com/products/software-development-tools/arm-development-studio/components/keil-uvision-debugger http://www.arm.com/products/development-tools/embedded-and-software/rtx5-rtos
|