VSCode下 搭建 ARM Cortex-M 开发环境 -- Part 3 FreeRTOS Multi-threads Debug

  • Part 0 开发工具安装
  • Part 1 编译环境搭建
  • Part 2 调试环境搭建
  • Part 3 FreeRTOS Mulit-threads Debug

VSCode下 搭建 ARM Cortex-M 开发环境 -- Part 3 FreeRTOS Multi-threads Debug

前言

本章旨在记录如何在VSCode Debug环境下打开FreeRTOS Multi-threads Debug功能,包含以下内容:

  1. 修改OpenOCD config文件从而打开OpenOCD RTOS Support功能
  2. 定义uxTopUsedPriority变量
  3. 修改LinkScript避免uxTopUsedPriority变量被优化掉
  4. VSCode Debug时查看FreeRTOS下各个task状况

修改OpenOCD config文件从而打开OpenOCD RTOS Support功能

GDB本身是Support Multi-threads Debug的(例如info threads)。为了实现FreeRTOS下的Multi-threads debug,我们需要首先打开OpenOCD的RTOS Support功能:

  1. 在OpenOCD Config文件-rtos FreeRTOS Option
    该步要做的事情很简单:只需要在openocd config文件中增加“-rtos FreeRTOS”即可(如下代码)
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap

$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 -rtos FreeRTOS

set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME stm32f2x 0 0 0 0 $_TARGETNAME

定义uxTopUsedPriority变量

  1. 在Kernel/FreeRTOS/portable/GCC/ARM_CM4F/port.c中定义uxTopUsedPriority变量
    该步要做的事情也很简单:只需要在Kernel/FreeRTOS/portable/GCC/ARM_CM4F/port.c中定义uxTopUsedPriority变量(如下代码)
    要注意的是:uxTopUsedPriority变量 一定需要用 __attribute__((used))修饰,从而避免uxTopUsedPriority变量在编译阶段就被优化掉了
/* Each task maintains its own interrupt status in the critical nesting
variable. */
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
__attribute__((used)) const UBaseType_t uxTopUsedPriority = configMAX_PRIORITIES - 1;

修改LinkScript避免uxTopUsedPriority变量被优化掉

  1. 在顶层Makefile文件中增加--undefined=uxTopUsedPriority
    该步要做的事情也很简单:只需要在在顶层Makefile文件中增加--undefined=uxTopUsedPriority(如下代码)
    该步的作用是避免uxTopUsedPriority变量在Link阶段被优化掉
# LDFLAGS = --specs=nano.specs -lnosys -nostartfiles
# LDFLAGS += -Wl,-wrap=malloc -Wl,-wrap=calloc -Wl,-wrap=realloc -Wl,-wrap=free
# LDFLAGS += -Wl,-T./LinkerScripts/STM32F429ZI_FLASH.ld -Wl,--gc-sections
LDFLAGS += -nostartfiles --gc-sections
LDFLAGS += --undefined=uxTopUsedPriority

VSCode Debug时查看FreeRTOS下各个task状况

以上步骤完成后,我们再按照Part3的内容Debug时就会发现:暂停Target后,在VSCode Debug界面的调用堆栈下可以显示该Project中各个Tasks的callgraph可
需要注意的时,Multi-Thread debug下第一次按“开始调试”会连上后自动断开。遇到这个状况不用担心,只需要再按一次“开始调试”即可。(这个现象是VSCode已知bug:https://github.com/Microsoft/vscode-cpptools/issues/1075

Screenshot from 2019-08-17 10-32-31.png

本章总结

至此,我们在VSCode下debug Freertos multi-threads又更加方便了一点:可以在debug的时候同时查看各个task callgraph了^_^。
整个工程我已经Upload到Github, 欢迎大家下载!
https://github.com/TuringChenChao/STM32-VSCode

推荐阅读更多精彩内容