【转载】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之前的冒号(:) ...
随机推荐
- php中urlencode与rawurlencode的区别
前段时间说自己遇到了个<URL加号引发错误>的BUG,引起这个bug的原因就是自己在URL中使用了 urlencode 函数,该函数会把空格转换成加号,这样就导致URL解析出错,而空格只有 ...
- 你可能不知道的IDEA高级调试技巧
一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图,在断点的位置,右击断点旁边的小红点,会出来一个界面,在Condition这里填入断点条件即可 ...
- 【iCore4 双核心板_uC/OS-II】例程九:消息队列
一.实验说明: 前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需 ...
- SAP S4HANA1610/Fiori安装过程全记录
经历各种坑,从硬件到文件,终于安装成功. 有需要安装或使用S4HANA(含Fiori)的同学可以参考. 安装文件分享给大家 链接:http://pan.baidu.com/s/1mi7LfIS 密码: ...
- WebSphere MQ中的CCSID
CCSID是一个字符集的标识.作为unicode标准通过定义一个字符集内每个字符要对应那个数字值的方式定义了一个字符集.这说明CCSID就是一个定义字符集顺序的标识数码罢了.IBM的字符标识架构在文档 ...
- python定义函数时,形参前加*和**的意义
转发:https://blog.csdn.net/qq_34806812/article/details/82017839 1.加*表示接受一个tuple类型(元组),如: 2.加**表示接受一个di ...
- 自己动手实现RPC
一.需求:用户管理系统(UMS),仓库管理系统(WMS),订单管理系统(OMS) 现在OMS有一张订单表:[订单id,用户id,商品id,订单状态,订单时间],需要在客户端展示此订单对应的用户详情和商 ...
- Day8 函数指针做函数参数
课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...
- 理解面向过程(OPP)、面向对象(OOP)、面向切面(AOP)
概念 面向过程编程OPP:Procedure Oriented Programming,是一种以事物为中心的编程思想.主要关注“怎么做”,即完成任务的具体细节. 面向对象编程OOP:Object Or ...
- kafka---->kafka stream的使用(一)
kafka stream的简单使用,这里是官方文档上面的例子. kafka的简单使用 一.启动Kafka server huhx@gohuhx:~/server/kafka_2.11-1.1.0$ b ...