【转载】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中调试,具体可以百度或参考我上传的项目。
二、在已有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 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消息传递过程,我没详细研究,看起来很酷的样子。
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

- KEIL MDK环境下uCOS-II在LPC17xx上的移植实例
1. 知识准备 要想对ucos-ii的移植有较深的理解,需要两方面知识: (1)目标芯片,这里是lpc17xx系列芯片,它们都是基于ARMv7 Cortex-M3内核,所以这一类芯片的ucos-ii移 ...
- Windows环境下IOS APP打包上传AppStore详细流程
我们知道在上架苹果应用过程中,申请发布证书需要用到钥匙串,上传ipa需要用到xcode或Application loader提交构建版本,这都需要Mac苹果机. 本文介绍如何在Windows环境下申请 ...
- [转载]Ubuntu环境下检查CPU 的温度
原文地址:https://www.linuxprobe.com/ubuntu-cpu-temperature.html 我们将使用一个GUI工具Psensor,它允许你在Linux中监控硬件温度.用P ...
- [转载]SELinux 环境下网络服务设置,配置 Apache 、Samba、NFS
原文地址:http://www.ibm.com/developerworks/cn/linux/l-cn-selinux-services1/index.html?ca=drs- 引言 SELinux ...
- [Docker] Windows 宿主环境下,共享或上传文件到容器的方法
需求如题. 解决方案1 - 挂载目录(适用于创建新的容器) 格式-v 容器目录 或 -v 本地目录:容器目录 范例Linux宿主环境下:使用镜像 nginx:latest,以后台模式启动一个容器,将容 ...
- Windows环境下启动Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。(已解决)
问题描述: 今天在windows环境下启动Redis时启动失败报错: 解决方案: ①运行命令:redis-cli.exe ②退出Redis ③运行命令:redis-server.exe redis.w ...
- STM32 ~ MDK环境下调试程序 HardFault_Handler 相关
STM32出现HardFault_Handler故障的原因主要有两个方面: 1.内存溢出或者访问越界.这个需要自己写程序的时候规范代码,遇到了需要慢慢排查. 2.堆栈溢出.增加堆栈的大小. 出现问题时 ...
- [转载]Windows环境下 Hadoop Error: JAVA_HOME is incorrectly set. 问题
最近尝试在windows开发MR程序并且提交Job,在解压缩好hadoop,配置好环境变量后, 打开cmd 输入hadoop version 的时候出现以下错误: Error: JAVA_HOME i ...
- [转载]Linux 环境下编译 0.11版本内核 kernel
最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...
随机推荐
- CountDownLatch、CyclicBarrier和Semaphore 使用示例及原理
备注:博客园的markDown格式支持的特别不友好.也欢迎查看我的csdn的此篇文章链接:CountDownLatch.CyclicBarrier和Semaphore 使用示例及原理 CountDow ...
- 查看哪个用户登录过服务器 记录 时间 和 ip
who /var/log/wtmp 1>wtmp 一个用户每次登录进入和退出时间的永久纪录
- Java自定义注解的使用
什么是注解? #============================================================================================ ...
- 数据仓库:Mysql大量数据快速导出
背景 写这篇文章主要是介绍一下我做数据仓库ETL同步的过程中遇到的一些有意思的内容和提升程序运行效率的过程. 关系型数据库: 项目初期:游戏的运营数据比较轻量,相关的运营数据是通过Java后台程序聚合 ...
- Mysql优化-大数据量下的分页策略
一.前言 通常,我们分页时怎么实现呢? 1 SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但是,数据量猛增以后呢? 1 SELECT * FROM t ...
- Houdini技术体系 基础管线(三) :UE4 Landscape Component的多选支持 下篇
背景 上篇中,我们介绍了如何修改Houdini Enigne来设置单个Landscape Compnent的Height和Layer的数据,但原生Houdini Engine并不支持多选Compone ...
- 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库03 —— 安装HAWQ 2.3.0.0
一. HAWQ2.3.0环境准备[全部主机节点]: 1, vim /etc/sysctl.conf,编辑如下内容: kernel.shmmax= kernel.shmmni= kernel.shmal ...
- java,php,js;AES 互通加解密
1,Java端(依赖 common-codec jar) package com.jiaMi; import javax.crypto.Cipher; import javax.crypto.sp ...
- Java开发中的23种设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- iOS 库操作
目录 库操作 主工程和子工程的引用关系 库之间的引用关系 ar命令 nm命令 库操作 主工程和子工程的引用关系 子工程引用主工程中的文件需要在子工程的search path中加入头文件的目录 子工程引 ...