- 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功能,包含以下内容:
- 修改OpenOCD config文件从而打开OpenOCD RTOS Support功能
- 定义uxTopUsedPriority变量
- 修改LinkScript避免uxTopUsedPriority变量被优化掉
- VSCode Debug时查看FreeRTOS下各个task状况
修改OpenOCD config文件从而打开OpenOCD RTOS Support功能
GDB本身是Support Multi-threads Debug的(例如info threads)。为了实现FreeRTOS下的Multi-threads debug,我们需要首先打开OpenOCD的RTOS Support功能:
-
在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变量
-
在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变量被优化掉
-
在顶层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)
本章总结
至此,我们在VSCode下debug Freertos multi-threads又更加方便了一点:可以在debug的时候同时查看各个task callgraph了^_^。
整个工程我已经Upload到Github, 欢迎大家下载!
https://github.com/TuringChenChao/STM32-VSCode