【转载】MDK环境下让STM32用上FreeRTOS v8.1.2和FreeRTOS+Trace v2.6.0全过程

【转载】https://www.amobbs.com/thread-5601460-1-2.html?_dsign=6a59067b

本人选择使用FreeRTOS的最大原因就是想使用FreeRTOS+Trace,这是一个图形化的Debug工具,利用这个工具,你可以看到各线程、中断、消息队列等的运行历史,对于新手来说,学习一个操作系统的运行原理是个好工具,而对于工程应用人员而言,它又是一个不可多得的辅助工具,它能让你获得一种“掌控”的感觉,实在是非常好用。现在我把我建立模板工程的整个过程分享给大家,希望大家也能用上这款神器。

FreeRTOS+Trace分为两部分,一部分是位于目标系统的C源码库,你需要将其加入到你的MCU项目中,另一部分是PC机上的软件。FreeRTOS+Trace的运行原理图如下,目标系统在RAM中建立一个缓冲区(大容量数组),目标系统的操作系统在运行的过程中,每次产生的系统事件都会保存到该缓冲区,调试人员可以在PC上利用任意调试工具将这个缓冲区dump出来存到一个文件,再使用PC的FreeRTOS+Trace软件打开这个文件分析,并且dump时你并不需要知道缓冲区的具体地址,而是可以直接把整个RAM都dump出来,软件会自动分析。值得一提的是FreeRTOS+Trace软件集成了Jlink菜单,可以直接读取RAM区。(我不知道怎样利用Jlink工具dump内存,只知道J-Link Commander里的mem命令可以读RAM,但是不能保存成文件,有谁知道的告诉我一声)

<ignore_js_op>

我有两个STM32的板,我准备选择STM32F103C8T6的这块板作为样板来作陈述,因为它的资源较少,能在其运行的程序在其它更大资源的芯片上肯定是可以运行的。

本次模板工程使用的是MDK4.23环境,目标芯片为STM32F103C8T6,外设标准库版本为3.5,FreeRTOS版本为8.1.2,FreeRTOS+Trace版本为2.6.0。FreeRTOS源码中有针对STM32的DEMO,大家可以用来参考,这样只要修修补补不用移植了。

提示:FreeRTOS+Trace是与FreeRTOS的源码包绑定的,下载任何一个FreeRTOS版本的源码包,里面都有FreeRTOS+Trace的源码,但是这个源码需要与PC的上位机配套,当前能够下载的上位机软件是2.6.0版,而FreeRTOS的最新版本是8.1.2,其配套的FreeRTOS+Trace的版本就是2.6.0。

建立过程如下:

一、建立MDK工程,加入官方3.5固件库和FreeRTOSv8.1.2源码,使其正常运行

1.从ST官网下载3.5版固件

2.从FreeRTOS官网下载FreeRTOS v8.1.2源码

3.建立一个目录,将代码组织起来,我的目录是下面这样的

<ignore_js_op>

4.打开MDK,建立工程,选择目标芯片为STM32F103C8,建立目录加进文件,我的目录是下面这样的。其中FreeRTOSConfig.h文件是从针对STM32的DEMO工程中复制出来的,port.c使用的是\FreeRTOS\Source\portable\RVDS\ARM_CM3目录下的,heap_2.c在\FreeRTOS\Source\portable\MemMang目录下

<ignore_js_op>

5.添加预编译定义和头文件包含目录

<ignore_js_op>

6.为操作系统修改中断入口名,我是直接修改了port.c文件,而没有修改startup_stm32f10x_md.s文件,因为修改port.c只需添加三条语句,如下

<ignore_js_op>

7.编写测试源码,我只做了任务切换的测试,源码如下,建立了三条闪灯的任务,任务优先级依次为3、4、5(注意FreeRTOS里的任务优先级与uCOS相反,即数字越大级别越高,IDLE任务优先级最低,则为0)

<ignore_js_op>

8.在编译之前,需要检查内存堆的范围是否过大,过大就放不进STM32F103C8的20K RAM了。查看FreeRTOSConfig.h中的configTOTAL_HEAP_SIZE定义,我定义了10K,这10K就是留给操作系统动态分配的,你可以根据需要把它设置得更大一点,只要保证编译完毕后RAM占用不超过20K即可。

<ignore_js_op>

9.编译、下载、测试,发现三个灯都在闪就对了,系统在调度任务了。

10.如果不想在Flash中调试,也可以在RAM中调试,具体可以百度或参考我上传的项目。

STM32 FreeRTOSv8.1.2 MDK工程模板: <ignore_js_op> STM32F10x_StdLibv3.5_FreeRTOSv8.1.2_Template.rar (1.51 MB, 下载次数: 440)

二、在已有FreeRTOS的项目基础上加入FreeRTOSPlusTracev2.6.0源码,修改相应设置,使FreeRTOSPlusTrace能够正常Trace

1.从下载的FreeRTOS源码包中复制FreeRTOS-Plus-Trace目录到工程目录,现在我的目录如下

<ignore_js_op>

2. 把\FreeRTOS-Plus-Trace\ConfigurationTemplate\trcConfig.h复制到App目录下

3. 添加文件到MDK工程中,现在我的工程目录如下图

<ignore_js_op>

4.向包含目录中添加”..\FreeRTOS-Plus-Trace\Include”,如下图

<ignore_js_op>

5.在FreeRTOSConfig. h中,设置configUSE_TRACE_FACILITY为1,以保证打开FreeRTOS+Trace功能,并在末尾添加#include "trcKernelPort.h"来包含trace相关头文件

6.设置trcConfig.h中EVENT_BUFFER_SIZE项为一个适当值,它表示要记录多少条事件,一般一条事件占用4个字节,我将它设置为1024,则将占用4K的内存,能存大概1000条左右的事件。

7.在main.c中添加下列代码(68行~73行)

<ignore_js_op>

8.编译,发现一堆的语法错误,其它错误很好解决,除了trcHardwarePort.c中有四条在一起且类似的错误,错误信息是这样的:

..\FreeRTOS-Plus-Trace\trcHardwarePort.c(65): error:  #20: identifier "asm" is undefined

可能因为源码是针对IAR编写的,没有考虑到MDK的特殊性,我的作法是将原本代码注释掉替换为内联汇编代码

原来的代码:

<ignore_js_op>

替换后的代码:

<ignore_js_op>

9.编译、下载、调试。当灯在闪时,说明系统运行正常了,接下来终于可以请出我们的神器FreeRTOSplusTrace PC软件了。

加入FreeRTOSplusTrace的MDK工程模板: <ignore_js_op> STM32F10x_StdLibv3.5_FreeRTOSv8.1.2_PlusTracev2.6.0_Template.rar (1.62 MB, 下载次数: 351)

三、FreeRTOSplusTrace PC软件共分三个版本FreeEdition、Standard Edition、Pro. Edition,全功能高级版可以试用30天,30天后只能使用功能限制的免费版,为了能够不受限制,我把它装到了vmware虚拟机里面,并且在安装之前take snapshot一下,这样30天过后,将vmware退回到snapshot点,再安装一遍FreeRTOSplusTrace又可以试用30天了,当然如果有人破解了就不用这么麻烦了。FreeRTOSplusTrace PC软件有7M,我上传不了,大家去官网去下载吧。

1.下载页面在percepio.com可以找到,它依赖.net4.0运行,需要安装.net4.0库。

2.打开FreeRTOSplusTrace软件,欢迎界面如下图,点击右下角Evaluate ...按钮,进入主界面,如果你插入了Jlink,Jlink菜单下的选项是可选的。

<ignore_js_op>

<ignore_js_op>

3.点击菜单Jlink->Read Trace,填入RAM地址和大小(不知道RAM地址和大小?看MDK菜单Project->Options for xxx->Target选项卡->IRAM1),点击OK,读出来如果东西少或出错,说明时间太短,过一会再读试试。

<ignore_js_op>

4.软件结果如下图

<ignore_js_op>

FreeRTOS Trace.exe 模板测试1.png (36.8 KB, 下载次数: 2)

下载附件

2014-10-25 14:26 上传

5.勾选右下角的Kernel Notices和Kernel Service Calls,放大,就可以清晰的看到系统运行的过程了,三条LED线程,打开CPU Load Graph,可以看到CPU占用率目测不及0.1%。

<ignore_js_op>

<ignore_js_op>

四、模板只有三个闪灯任务,各位看官没看爽,没关系,下面承上官方Demo。其中Communication View便于理解官方Demo消息传递过程,我没详细研究,看起来很酷的样子。

加入官方Demo的MDK工程(内含dump文件,可直接用FreeRTOSplusTrace.exe打开): <ignore_js_op> STM32F10x_StdLibv3.5_FreeRTOSv8.1.2_PlusTracev2.6.0_Demo.rar (1.63 MB, 下载次数: 272)

<ignore_js_op>

<ignore_js_op>

<ignore_js_op>

<ignore_js_op>

时间: 2024-10-21 08:11:23

【转载】MDK环境下让STM32用上FreeRTOS v8.1.2和FreeRTOS+Trace v2.6.0全过程的相关文章

Windows环境下IOS APP打包上传AppStore详细流程

现在很多伙伴跨平台开发应用,有些童鞋没有准备苹果机,本文将介绍,如何在Windows系统环境下直接上架APP,不用去搞虚拟机,搞黑苹果等等了,Windows下照样轻轻松松上架iOS APP,没Mac的小伙伴有福了. 下面从七个步骤进行详细介绍! 1.创建唯一标示符App IDs 2.申请发布证书 3.申请发布描述文件 4.iTunes Connect创建App并填写信息 5.选择证书编译打包6.Windows下上传IPA到App Store 7.上传好IPA回到iTunes Connect提交审

[转载]SELinux 环境下网络服务设置,配置 Apache 、Samba、NFS

原文地址:http://www.ibm.com/developerworks/cn/linux/l-cn-selinux-services1/index.html?ca=drs- 引言 SELinux 的安全防护措施主要集中在各种网络服务的访问控制.对于像 Apache .Samba.NFS.vsftp .MySQL.Bind dns 等服务来说,SELinux 仅仅开放了最基本的运行需求.至于连接外部网络.运行脚本.访问用户目录.共享文件等,必须经过一定的 SELinux 策略调整才能充分发挥

nginx+tomcat环境下,web项目文件上传问题(未完待续)

最近我把自己的服务器换成centos,利用nginx做服务器实现动静分离,觉得项目响应的速度明显提高了(一周之前还是Windows服务器+纯tomcat结构,慢惨了T_T),以前都是用tomcat做服务器,用了nginx之后,处理文件上传及访问时就出了问题--因为我之前都是把文件保存到该web项目的目录(tomcat中)下,而nginx访问的是自己的目录(我的是/data/wwwroot/default/),所以文件可以上传但是无法通过nginx访问,因为tomcat与nginx是两台不同的服务

[Docker] Windows 宿主环境下,共享或上传文件到容器的方法

需求如题. 解决方案1 - 挂载目录(适用于创建新的容器) 格式-v 容器目录 或 -v 本地目录:容器目录 范例Linux宿主环境下:使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data. docker run -p 80:80 -v /data:/data -d nginx:latest Windows宿主环境下: docker run -it -v /d/WindowsFolder:/de

STM32 ~ MDK环境下调试程序 HardFault_Handler 相关

STM32出现HardFault_Handler故障的原因主要有两个方面: 1.内存溢出或者访问越界.这个需要自己写程序的时候规范代码,遇到了需要慢慢排查. 2.堆栈溢出.增加堆栈的大小. 出现问题时排查的方法: 1.添加软件断点,一旦在调试过程中出现Hard Fault 则会停在__breakpoint(0)处. void HardFault_Handler(void) { if (CoreDebug->DHCSR & 1) { //check C_DEBUGEN == 1 -> D

ubnutu 环境下 在APACHE服务器上的访问方式上去除index.php

1.在APACHE里面去配置 ,将里面的AllowOverride None都改为AllowOverride All 在这里我用的是 Apache2.4.7版本.其实下面红色框中在Apache2.4.7中是没有的,直接添加上就行了. /etc/apache2/sites-enabled/000-default.conf 中 <Directory /var/www/payserver/ > Options FollowSymLinks AllowOverride All Order deny,a

Swift环境下实现UILabel居上 居中 居下对齐

首先在Xcode中新建.h文件,将下面代码复制进去 // // myUILabel.h // // // Created by yexiaozi_007 on 3/4/13. // Copyright (c) 2013 yexiaozi_007. All rights reserved. // #import <UIKit/UIKit.h> typedef enum { VerticalAlignmentTop = 0, // default VerticalAlignmentMiddle,

[转载]Linux 环境下编译 0.11版本内核 kernel

最近在看<linux内 核0.11完全注释>一书,由于书中涉及汇编语言的地方众多,本人在大学时汇编语言学得一塌糊涂,所以实在看不下去了,头都大了只好匆匆看了个头尾(前面 几章和最后一章).看来即使有<九阴真经>这样的武功秘籍,内功不够也是修炼不出来神马来的.于是索性下了个0.11版本的kernel下来尝试编译一 把. linux-0.11.tar.gz 下载地址: 下面开始工作: 1. tar xvfz linux-0.11.tar.gz 2. cd linux-0.11 3. m

linux环境下nginx链接不上fpm

背景: nginx是通过源码安装,php环境和php-fpm是通过apt-get自动安装. 以下记录下出现的几个问题及方法 一.访问php文件无法识别 安装nginx和fpm完成之后,通过在nginx的容器中添加一个php的测试页面为test.php,代码只写 <?phpphpinfo();?> 其中通过页面访问方式如图所示 解决办法: 找到nginx的安装路径,找到nginx.conf,每个人的nginx安装目录位置不一样,我的nginx.conf在/usr/local/nginx/conf