openocd 怎样能支持FreeRTOS 8.1.2

沉寂了几年了,觉得应该分享些什么了。前段时间用FreeRTOS做了些东西,陆续拿出来给大家拍砖。

应该说本人是Linux的粉丝吧,所以我业余时间分享的经验也多半是应用Linux作为桌面开发平台的。闲话少说,进入正题。

选用FreeRTOS绝对不是应为他的代码是如何的优秀,而是因为他在自由软件社区展现出的很强的生命力。要知道,如果一个自由软件社区足够的活跃,就意味着有更多的爱好者不停的解决和修正他运行的过程中遇到的诸多问题。

由于本人的工作中会采用STM32的CortexM的MCU,所以后续的调试方法会以STM32LDiscovery的开发板为例。

FreeRTOS 发布包中有针对不同平台的移植和实例,要想在Linux主机交叉编译需要选用arm-none-eabi-gcc这样的编译工具链,而选用ST的MCU后一个廉价的ST-Link可以作为调试工具,而STM32LDiscovery的板子上自带就有这样的工具。硬件调试工具提供的下载调试程序的通道,还需要一个能够支持GDB Server的服务程序才能用arm-none-eabi-gdb完成代码的调试。

下面的网站讲述了一个st-link的Linux工具可以支持下载调试你的二进制代码。

http://www.wolinlabs.com/blog/linux.stm32.discovery.gcc.html

我个人比较喜欢openocd,他有自己特有的telnet模式可以对目标板进行各种设置,他在支持标准GDB Server的同时还针对嵌入式系统提供RTOS的支持,很多人不太了解这对调试有何好处。如果用gdb调试Linux下的多线程程序可以用info thread这样的命令观察线程的运行状态,当然可以很容的检查线程栈溢出等情况。

准备资源

下载最新的openocd,系统自带的多半太陈旧,嵌入式系统的发展要比PC更快

git clone git://git.code.sf.net/p/openocd/code  openocd

FreeRTOS 8.1.2

为FreeRTOS 8.1.2打补丁

openocd对FreeRTOS的支持,需要在运行openocd的时候加入configure -rtos auto选项,下面是我修改过的openocd board 脚本文件

# This is an STM32L discovery board with a single STM32L152RBT6 chip.
# http://www.st.com/internet/evalboard/product/250990.jsp

source [find interface/stlink-v2.cfg]

transport select hla_swd

set WORKAREASIZE 0x4000
source [find target/stm32l.cfg]

# use hardware reset, connect under reset
reset_config srst_only srst_nogate

$_TARGETNAME configure -rtos auto

运行的时候只需要如下命令

openocd -f board/stm32ldiscovery.cfg

这时候如果你用arm-none-eabi-gdb通过target remote:3333 load代码的时候,会显示没有检测的RTOS。

网上找了些帖子,都没有解决,大概说明是openocd采用了7.6.2之前版本的一个优先级变量,但是如果你把FreeRTOS换成之前的版本仍旧不能成功检测。

我研究了以下FreeRTOS 8.1.2的代码,发现加回原来的这个全局优先级变量可以解决这个问题,而且只是两条语句对于FreeRTOS优先级调度应该没有什么影响

在task文件中寻找如下行,

PRIVILEGED_DATA static volatile TickType_t xTickCount                 = ( TickType_t ) 0U;

在下面加入这一行

PRIVILEGED_DATA static unsigned portBASE_TYPE uxTopUsedPriority         = tskIDLE_PRIORITY;

在函数xTaskGenericCreate中的如下代码

uxTaskNumber++;

#if ( configUSE_TRACE_FACILITY == 1 )

{

/* Add a counter into the TCB for tracing only. */

pxNewTCB->uxTCBNumber = uxTaskNumber;

}

#endif /* configUSE_TRACE_FACILITY */

的前面加入

#if ( configUSE_TRACE_FACILITY == 1 )

if( pxNewTCB->uxPriority > uxTopUsedPriority )

{

uxTopUsedPriority = pxNewTCB->uxPriority;

}

#endif /* configUSE_TRACE_FACILITY */

重新编译FreeRTOS的实例

(原创文章请著名出处http://blog.csdn.net/rickleaf)

openocd FreeRTOS 调试

开启gdb server

openocd -f board/stm32ldiscovery.cfg

调试下载代码

arm-none-eabi-gdb stm32l1xx_freertos.elf

load

这时候server端显示如下信息

Open On-Chip Debugger 0.9.0-dev-00186-g30203b3-dirty (2014-11-05-23:00)

Licensed under GNU GPL v2

For bug reports, read

http://openocd.sourceforge.net/doc/doxygen/bugs.html

adapter speed: 300 kHz

adapter_nsrst_delay: 100

Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD

srst_only separate srst_nogate srst_open_drain connect_deassert_srst

Info : clock speed 300 kHz

Info : STLINK v2 JTAG v23 API v2 SWIM v0 VID 0x0483 PID 0x3748

Info : using stlink api v2

Info : Target voltage: 2.918068

Info : stm32l.cpu: hardware has 6 breakpoints, 4 watchpoints

Info : accepting ‘gdb‘ connection on tcp/3333

Info : STM32L flash size is 128kb, base address is 0x8000000

undefined debug reason 7 - target needs reset

Info : Auto-detected RTOS: FreeRTOS

adapter speed: 300 kHz

target state: halted

target halted due to debug-request, current mode: Thread

xPSR: 0x01000000 pc: 0x0800021c msp: 0x20004000

STM32L: Enabling HSI

adapter speed: 2000 kHz

Info : Padding image section 0 with 3 bytes

target state: halted

target halted due to breakpoint, current mode: Thread

xPSR: 0x61000000 pc: 0x20000012 msp: 0x20004000

target state: halted

target halted due to breakpoint, current mode: Thread

xPSR: 0x61000000 pc: 0x20000012 msp: 0x20004000

adapter speed: 300 kHz

target state: halted

target halted due to debug-request, current mode: Thread

xPSR: 0x01000000 pc: 0x0800021c msp: 0x20004000

在调试端,通过info thread来查看FreeRTOS的运行状况

GNU gdb (GNU Tools for ARM Embedded Processors) 7.6.0.20140529-cvs

Copyright (C) 2013 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "--host=i686-linux-gnu --target=arm-none-eabi".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from /home/ricky/workspace/stm32/stm32l1xx_freertos/Debug/stm32l1xx_freertos.elf...done.

(gdb) tar rem:3333

Remote debugging using :3333

0x00000000 in ?? ()

(gdb) load

Loading section .isr_vector, size 0x24c lma 0x8000000

Loading section .text, size 0x3df9 lma 0x800024c

Loading section .data, size 0xa4 lma 0x8004048

Start address 0x800010c, load size 16617

Transfer rate: 4 KB/sec, 5539 bytes/write.

(gdb) c

Continuing.

^C

Program received signal SIGINT, Interrupt.

[Switching to Thread 536872480]

0x08002b78 in prvCheckTasksWaitingTermination ()

at ../system/src/FreeRTOS/Source/tasks.c:2859

2859            while( uxTasksDeleted > ( UBaseType_t ) 0U )

(gdb) info thread

[New Thread 536871864]

[New Thread 536873328]

[New Thread 536871248]

Id   Target Id         Frame

4    Thread 536871248 (LED3) 0x08001b90 in vPortYield ()

at ../system/src/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c:371

3    Thread 536873328 (Tmr Svc) 0x08001b90 in vPortYield ()

at ../system/src/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c:371

2    Thread 536871864 (LED4) 0x08001b90 in vPortYield ()

at ../system/src/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c:371

* 1    Thread 536872480 (IDLE :  : Running) 0x08002b78 in prvCheckTasksWaitingTermination () at ../system/src/FreeRTOS/Source/tasks.c:2859

(gdb)

至此我们可以用openocd做一些和FreeRTOS更紧密的调试了。

关于笔者是如何构建stm32的freertos的编译环境的,我会在后面的文章讲述。

(原创文章请著名出处http://blog.csdn.net/rickleaf)

时间: 2024-10-30 01:37:28

openocd 怎样能支持FreeRTOS 8.1.2的相关文章

cmsis-rtos v1.02不支持Mail Queue?

STM32CubeMX默认支持Freertos. /* USER CODE BEGIN Variables */ osMailQDef(mail, 6, uint8_t); /* USER CODE END Variables */ cmsis-rtos文档中有对邮件队列管理的描述,按照定义后,编译总是报错: ..\Src\freertos.c(52): error:  #151: a typedef name may not be redeclared as a parameter osMai

视频直播的发展趋势分析

视频直播的分析与发展 在讲视频直播之前,先讲一讲直播.直播是怎么来的呢?从传播消息的角度上来说,视频和文字.图片.音乐一样都是传播消息的手段,古时以文字传播消息,之后出现了图片和音乐,再之后视频开始流行.出现这种演变的原因是什么呢?我想主要是由于读者的需求日益提高和传播技术的不断发展.读者不满足于当前的文字阅读,由此出现了图片与音乐,到后来图片与音乐也无法满足日益增长的需求,则出现了视频.视频具有文字.图片.音乐不具有的优势:传递的信息多,更让人有代入感,给观众更综合的体验.虽然视频有着无可比拟

FreeRTOS 任务栈大小确定及其溢出检测

FreeRTOS 的任务栈设置不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要. 局部变量,函数调用时的现场保护和返回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃.裸机的情况下,用户可以在这里配置栈大小: 为什么是堆中的?因为我们采用的就是动态创建任务的方式.如果静态创建,就和我们自己开辟的空间有关,通常静态创建任务用数组作为容器,但是通常静态创建的方式我们都不使用. FreeRTOS 的系统栈设置上面跟大家讲解了什么是任务栈,这里的系统栈又是

轻量级操作系统FreeRTOS的内存管理机制(一)

本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu) 近几年来,FreeRTOS在嵌入式操作系统排行榜中一直位居前列,作为开源的嵌入式操作系统之一,它支持许多不同架构的处理器以及多种编译工具链,具有轻量级.容易移植和使用的特点.本篇文章将会对FreeRTOS提供的几种内存分配策略进行介绍,FreeRTOS允许开发者根据自己的项目实际需要选择不同的内存分配策略或者自定义分配内存策略. 一.FreeRTOS内存分配源码 FreeRTOS在创建任务.队列.互斥量.信号量.软件定时以及事件组的时

FreeRTOS 特性简介

FreeRTOS 由 Richard Barry 开发,是一个开源的.可移植的.小型的嵌入式实时操作系统内核.FreeRTOS 既支持抢占式多任务,也支持协作式多任务.FreeRTOS的主要特性如下: 实时性:FreeRTOS “可以”配置成为一个硬(Hard)实时操作系统内核.要注意这里用的是“可以”,FreeRTOS 也可以配置为非实时型内核,甚至于部分任务是实时性的,部分不是.这一点比uC/OS-II 要灵活. 任务数量:FreeRTOS对任务数没有限制,同一优先级也可以有多个任务.这点上

openocd+jlink为mini2440调试u-boot

需要安装openocd,如果已经安装了系统默认的openocd(默认是0.5.0,版本太低),需要先卸载掉. 在安装前需要安装必需的一些库文件: sudo apt-get install libusb-1.0-0-dev libusb-1.0-0 automake autconf libtool pkg-config 然后执行安装: git clone git://git.code.sf.net/p/openocd/code openocd cd openocd ./bootstrap ./co

轻量级操作系统FreeRTOS的内存管理机制(三)

本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿. 轻量级操作系统FreeRTOS的内存管理机制(二)中讲到,heap2.c的内存管理机制会导致内存碎片的问题,系统运行久后会出现无法分配大块内存的情况,heap4.c中的管理机制提供了解决方法,它是在heap2.c的基础上添加了地址相邻空闲块间合并的功能,而heap5.c是对heap4.c的进一步扩展,它能够支持多块不连续分布的RAM空间作为堆使用,本篇将对heap4.c.heap5.c中的管理机制进行分析. 一.heap4.c

轻量级操作系统FreeRTOS的内存管理机制(二)

本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿. 上一篇文章中介绍了FreeRTOS多种内存管理机制中最简单的一种:全局声明一个静态数组ucHeap,然后通过指针偏移记录空间的分配情况,在这种内存机制下无法对内存进行释放.同时也介绍了内存操作过程中字节对齐的细节,本篇文章将会对FreeRTOS源码中第二种内存管理机制heap2.c进行讲解,在heap2.c中同样使用一个全局静态数组ucHeap来表示内存,heap2.c内存管理机制较heap1.c而言增加了内存释放的功能,通过使

STM32与FreeRTOS实现低功耗

在工作过程中,遇到这样一个产品,它基于 Cortex-M7 内核的 STM32F769 芯片,同时使用了 FreeRTOS 实时操作系统. 由于该产品使用电池供电,因此有着低功耗的需求. 接下来,我将简单描述一下 STM32 与 FreeRTOS 各自的低功耗特性,以及在配合使用时如何去实现产品的低功耗.     一.STM32F769 芯片的三种低功耗模式[1] STM32F769 支持三种低功耗模式,它们分别是:SLEEP.STOP和STANDBY,其省电能力依次增强. SLEEP 在 SL