沉寂了数年,认为我们应该分享一下。前段时间通过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)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

openocd 如何支持FreeRTOS 8.1.2的更多相关文章

  1. 【安富莱】【RL-TCPnet网络教程】第10章 RL-TCPnet网络协议栈移植(FreeRTOS)

    第10章     RL-TCPnet网络协议栈移植(FreeRTOS) 本章教程为大家讲解RL-TCPnet网络协议栈的FreeRTOS操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就 ...

  2. 继续学习freertos消息队列

    写在前面:杰杰这个月很忙~所以并没有时间更新,现在健身房闭馆装修,晚上有空就更新一下!其实在公众号没更新的这段日子,每天都有兄弟在来关注我的公众号,这让我受宠若惊,在这里谢谢大家的支持啦!!谢谢^ 在 ...

  3. FreeRTOS相关转载-(朱工的专栏)

    FreeRTOS系列第1篇---为什么选择FreeRTOS? 1.为什么学习RTOS? 作为基于ARM7.Cortex-M3硬件开发的嵌入式工程师,我一直反对使用RTOS.不仅因为不恰当的使用RTOS ...

  4. 韦东山yy公开课笔记(2)--各种杂的问题

    1. 编译器的版本和glibc库有对应关系吗,如何查看glibc的版本(glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc),编译器是不是只带glibc被编译生成的 . ...

  5. mdk编译器学习笔记(1)——序

    这两天,学习了keil-mdk编译器的特性,这基本上独立于c语言语法,平时基本上都在强调c语言的学习,但是编译器的学习我们也要注重,类似于gcc一样,不也有很多网上的资料,讲述gcc的特性和用法吗.作 ...

  6. STM32CubeIDE下载安装-GPIO基本配置操作-Debug调试(基于CMSIS DAP Debug)

    1.在ST官网下载STM32CubeIDE而不是STM32CubeMX,并且STM32CubeIDE是免费的.(STM32CubeIDE不支持中文路径,不然编译会出错) 2.如果你用的是keil开发环 ...

  7. FreeRTOS操作系统教程发布,支持F103,F407和F429,配套145个例子,1200页教程

    前言说明:1. 首先感谢大家对我们安富莱电子的支持. 2. FreeRTOS最大的优势就是开源免费,商业使用的话不需要用户公开源代码,也不存在任何版权问题,是当前小型嵌入式操作系统   市场使用率最高 ...

  8. 【RTOS】基于V7开发板的最新版FreeRTOS V10.2.0程序模板,含MDK和IAR,支持串口打印任务执行情况

    模板下载: 链接:https://pan.baidu.com/s/1N32Hx7cTbDoRinuzTUB3zw   提取码:6aox 1.MDK使用MDK5.26及其以上版本. 2.IAR使用IAR ...

  9. FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅

    1.必要的准备工作 工欲善其事,必先利其器,在开始学习和移植之前,相应的准备工作必不可少.所以在开始我们写要准备如下: 测试环境:我准备在STM32F103平台上移植和测试FreeRTOS系统 准备F ...

随机推荐

  1. 我的EJB学习历程

    http://blog.csdn.net/sinapaper/archive/2004/06/28/28659.aspx http://blog.csdn.net/sinapaper/archive/ ...

  2. java单例模式(线程安全,效率高,双重推断)

    这样的方法,在获取单利的时候,避免了线程锁,导致訪问该方法速度非常慢, 同是,防止了多线程同事房屋该方法就会产生多个实例的问题. 效率高.线程安全. public class TestInstance ...

  3. 关于IE打印预览内容显示不全的问题解决

    眼下在调整一个页面打印功能的时候,发现多行文本框TextArea在页面显示的时候,多行文本能够正常显示,可是在打印页面的时候.部分内容就被遮挡住了, 苦思冥想不得其解,后来还是请教了美工. 首先查了下 ...

  4. SVN的revert和update命令的区别

    svn中的revert和update 今天有人问到revert和update的问题. 刚开始还真被问住了. 因为感觉revert和update都可以将本地的copy更新到以前的一个版本,会有什么不同呢 ...

  5. 【Android UI】案例03滑动切换效果的实现(ViewPager)

    本例使用ViewPager实现滑动切换的效果.本例涉及的ViewPager.为android.support.v4.view.ViewPager.所以须要在android项目中导入android-su ...

  6. mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry &#39;xxx&#39; for key &#39;PRIMARY&#39;

    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...

  7. WPF换肤之六:酷炫的时区浏览小精灵

    原文:WPF换肤之六:酷炫的时区浏览小精灵 由于工作需要,经常要查看到不同地区的 当前时间,以前总是对照着时区表来进行加减运算,现在有了这个小工具以后,感觉省心了不少.下面是软件的截图: 效果图赏析 ...

  8. sql server 常用语法

    --1 创建数据库 DROP DATABASE mydb1 CREATE DATABASE mydb1 ON ( NAME ='mydb1',FILENAME='D:\mydb1.mdf') LOG ...

  9. OUI-67076 : OracleHomeInventory was not able to create a lock file&quot; in Unix

    Symptoms The command "opatch lsinventory" reports the error: OUI-67076:OracleHomeInventory ...

  10. 10gocm-&gt;session5-&gt;数据库管理实验

    Oracle数据库管理实验 一 传输表空间 二 创建分区表和分区索引 三 FGA细粒度审计 四 监控索引使用情况 五 创建含特殊字段类型的表 六 Flashback闪回技术 一 传输表空间,将ocmd ...