FreeRTOS系统学习第一步:新建 FreeRTOS 工程—软件仿真

news2024/11/15 7:51:27

创建一个FreeRTOS系统工程

  • 1.新建工程文件夹
  • 2.Keil新建工程
    • 2.1 New Project
    • 2.2 Select Device For Target
    • 2.3 Manage Run-Time Environment
  • 3. 在 KEIL 工程里面新建文件组
    • 3.1在 KEIL 工程里面添加文件
  • 4. 编写 main 函数
  • 5. 调试配置
    • 5.1 设置软件仿真
    • 5.2 修改时钟大小在时钟相关文件
    • 5.3 添加头文件路径

在开始写 FreeRTOS 内核之前,我们先新建一个 FreeRTOS 的工程,Device 选择Cortex-M3(Cortex-M4 或 Cortex-M7)内核的处理器,调试方式选择软件仿真,为什么选择软件仿真呢? 因为我们在学习FreeRTOS内核过程中呢,有些代码逻辑是没有实验现象的,我们通过软件仿真来观察过程现象,通过Debug方式,借助逻辑分析仪,查看一些实验现象。

然后我们再开始一步一步地学习把 FreeRTOS 内核从 0 到 1 写出来,让大家彻底搞懂 FreeRTOS 的内部实现和设计的哲学思想。最后我们再把 FreeRTOS 移植到 开发板上,到了最后的移植其实已经非常简单,只需要换一下启动文件和添加 bsp驱动就行。
我用的是野火的STM32Ff103vet6指南者开发板。

1.新建工程文件夹

在开始新建工程之前,我们先在本地电脑端新建一个文件夹用于存放工程。文件夹名字我们取为“新建 FreeRTOS 工程—软件仿真”(名字可以随意取),然后再在该文件夹
下面新建各个文件夹和文件:
在这里插入图片描述
以上就是我们创建新工程的第一步,不用多说吧。

2.Keil新建工程

使用 KEIL 新建工程开发环境我们使用 KEIL5,版本为 5.23,高于或者低于 5.23 都行,只要是版本 5 就行。

2.1 New Project

首先打开 KEIL5 软件,新建一个工程,工程文件放在目录 Project 下面,名称命名为Fire_FreeRTOS,名称可以随便取,但是必须是英文,不能是中文,切记。

2.2 Select Device For Target

当命名好工程名称,点击确定之后会弹出 Select Device for Target 的选项框,让我们选择处理器,这里我们选择 ARMCM3(ARMCM4 或 ARMCM7)具体见图 4-1 Select Device(ARMCM3) For Target
在这里插入图片描述

下图 4-2 Select Device(ARMCM4) For Target
在这里插入图片描述

下图 4-3 Select Device(ARMCM7) For Target

在这里插入图片描述

2.3 Manage Run-Time Environment

选择好处理器,点击 OK 按钮后会弹出 Manage Run-Time Environment 选项框。这里我们在 CMSIS 栏选中 CORE 和 Device 栏选中 Startup 这两个文件即可,具体见图4-4。
在这里插入图片描述

图 4-4Manage Run-Time Environment
点击 OK,关闭 Manage Run-Time Environment 选项框之后,刚刚我们选择的 CORE 和Startup 这两个文件就会添加到我们的工程组里面,具体见图4-5。
在这里插入图片描述

图 4-5CORE 和 Startup 文件
其实这两个文件刚开始都是存放在 KEIL 的安装目录下,当我们配置 Manage RunTime Environment 选项框之后,软件就会把选中好的文件从 KEIL 的安装目录拷贝到我们的工 程 目 录 : Project\RTE\Device\ARMCM3 ( ARMCM4 或 ARMCM7 ) 下 面 。 其 中startup_ARMCM3.s(startup_ARMCM4.s 或 startup_ARMCM7.s)是汇编编写的启动文件,system_ARMCM3.c(startup_ARMCM4.c 或 startup_ARMCM7.c)是 C 语言编写的跟时钟相关的文件。更加具体的可直接阅读这两个文件的源码。只要是 Cortex-M3(ARMCM4 或ARMCM7)内核的单片机,这两个文件都适用。

3. 在 KEIL 工程里面新建文件组

在工程里面添加 user、rtt/ports、rtt/source 和 doc 这几个文件组,用于管理文件,具体见图 4-6。
在这里插入图片描述
图 4-6 新添加的文件组

对于新手,这里有个问题就是如何添加文件组?具体的方法为鼠标右键 Target1,在弹出的选项里面选择 Add Group…即可,具体见图 4-7,需要多少个组就鼠标右击多少次Target1。
在这里插入图片描述

图 4-7 如何添加组

3.1在 KEIL 工程里面添加文件

在工程里面添加好组之后,我们需要把本地工程里面新建好的文件添加到工程里面。
具体为把 readme.txt 文件添加到 doc 组,main.c 添加到 user 组,至于 FreeRTOS 相关的文件
我们还没有编写,那么 FreeRTOS 相关的组就暂时为空,具体见图 4-8。
在这里插入图片描述

图 4-8 往组里面添加好的文件

对于新手,这里有个问题就是如何将本地工程里面的文件添加到工程组里里面?具体的方法为鼠标左键双击相应的组,在弹出的文件选择框中找到要添加的文件,默认的文件类型是 C 文件,如果要添加的是文本或者汇编文件,那么此时将看不到,这个时候就需要把文件类型选择为 All Files,最后点击 Add 按钮即可,具体见图 4-9。
在这里插入图片描述
图 4-9 如何往组里面添加文件

4. 编写 main 函数

一个工程如果没有 main 函数是编译不成功的,会出错。因为系统在开始执行的时候先执行启动文件里面的复位程序,复位程序里面会调用 C 库函数__main,__main 的作用是初始化好系统变量,如全局变量,只读的,可读可写的等等。__main 最后会调用__rtentry,
再由__rtentry 调用 main 函数,从而由汇编跳入到 C 的世界,这里面的 main 函数就需要我们手动编写,如果没有编写 main 函数,就会出现 main 函数没有定义的错误,具体见图4-10。
在这里插入图片描述

图 4-10 没定义 main 函数的错误
main 函数我们写在 main.c 文件里面,因为是刚刚新建工程,所以 main 函数暂时为空,
具体见代码清单4-1。
代码清单 4-1main 函数

/*
 ************************************************************************
 * main 函数
************************************************************************
 */
 int main(void)
 {
for (;;)
 {
 /* 啥事不干 */
 }
 }

5. 调试配置

5.1 设置软件仿真

最后,我们再配置下调试相关的配置即可。为了方便,我们全部代码都用软件仿真,
不需要开发板也不需要仿真器,只需要一个 KEIL 软件即可,有关软件仿真的配置具体见图 4-11。使用simulator仿真。图 4-11 软件仿真的配置

5.2 修改时钟大小在时钟相关文件

system_ARMCM3.c(system_ARMCM4.c 或 system_ARMCM7.c)的开头,有一段代码定义了系统时钟的大小为 25M,具体见代码清单 4-2。在软件仿真的时候,确保时间的准确性,代码里面的系统时钟跟软件仿真的时钟必须一致,所以 Options for Target->Target 的时钟应该由默认的 12M 改成 25M,具体见图4-12
在这里插入图片描述
图 4-12 软件仿真时钟配置

代码清单 4-2时钟相关宏定义1 #define __HSI ( 8000000UL)2 #define __XTAL ( 5000000UL) 3 4 #define __SYSTEM_CLOCK (5*__XTAL)

5.3 添加头文件路径

在 C/C++选项卡里面指定工程头文件的路径,不然编译会出错,头文件路径的具体指
定方法见图 4-13。
在这里插入图片描述

图 4-13 指定头文件的路径
至此,一个完整的基于 Cortex-M3(Cortex-M4 或 Cortex-M7)内核的 FreeRTOS 软件仿真的工程就建立完毕。

FreeRTOS系统工程就创建完成了,我们这里用的是软件仿真。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你是否线上有使用ThreadLocal,如果结合多线程,请慎用

随着业务的增加,数据量的增加,多线程的使用会越来越频繁,提升单机的处理能力。 前些日子我们线上出现了一个比较严重的故障,这个故障是多线程使用不当引起的,挺有代表性的,所以分享给大家,希望…

前端学习笔记:CSS的引入,元素选择器

这是本人学习的总结,主要学习资料如下 马士兵教育 目录 1、引入CSS1.1、引入CSS的方式1.2、优先级 2、元素选择器2.1、基本选择器2.1.1、选择器2.1.2、优先级 2.2、关系选择器2.2.1、优先级 2.3、属性选择器2.4、伪类选择器 1、引入CSS 1.1、引入CSS的方式 第一个…

互斥锁深度理解与使用

大家好,我是易安! 我们知道一个或者多个操作在CPU执行的过程中不被中断的特性,称为“原子性”。理解这个特性有助于你分析并发编程Bug出现的原因,例如利用它可以分析出long型变量在32位机器上读写可能出现的诡异Bug,明明已经把变量…

SpringCloud--gateway 网关

在Spring Cloud中,使用Gateway网关访问服务可以有多种好处,包括但不限于以下几点: 统一入口管理:Gateway作为统一的服务入口,可以对所有的请求进行统一管理和控制,实现微服务集中管理。 动态路由&#xff…

056:cesium 七种方法设置颜色

第056个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置颜色,这里用到了7种方法,查看API,还有很多种方法 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共115行)相关API参考:专栏目标示例效果 配置…

深入理解Go语言中的接口编程【17】

文章目录 接口接口接口类型为什么要使用接口接口的定义实现接口的条件接口类型变量值接收者和指针接收者实现接口的区别值接收者实现接口指针接收者实现接口下面的代码是一个比较好的面试题 类型与接口的关系一个类型实现多个接口多个类型实现同一接口接口嵌套 空接口空接口的定…

TCP教程:详解TCP连接过程

目录标题 一 、简述二 、TCP建立连接协议(三次握手)2.1 概述及目的2.2 第一次握手:客户端发送SYN报文2.3 第二次握手:服务器回应SYN-ACK报文2.4 第三次握手:客户端回应ACK报文2.5 顾客预定座位场景2.6底层原理2.7 TCP …

嵌入式之Samba服务器搭建

在嵌入式系统开发应用平台中,tftp、nfs和samba服务器是最常用的文件传输工具 tftp和nfs是在嵌入式Linux开发环境中经常使用的传输工具 samba则是Linux和Windows之间的文件传输工具。 下面演示在linux上搭建Samba服务器 sudo apt-get install samba chmod -R 77…

会场安排问题——算法实现(C实现)

问题描述:加入要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若每个活动作为图的一个顶点,不相容活动之间用边相连。使相连顶点着有不同颜色的…

数据库原理容易出错的点

一个数据库只存在一个内模式和一个模式,可以存在多个外模式除了删除表或视图的使用的是DELETE以外其他数据库对象均是使用DROP遵守两段封锁的协议的并发事务一定是可串行化的哪些情况下不适合创建索引: 对于查询过程中很少使用或参考的列对于那些只有很少…

【无人车】用于无人地面车辆的路径跟踪算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

CMIP6数据处理:WRF模式动力降尺度、单点降尺度、统计方法区域降尺度、SWAT数据、Biome-BGC数据制备

查看原文>>>WRF模式、CMIP6数据处理、机器学习气象海洋水文应用、python地球科学 目录 CMIP6月数据、日数据、全球VIPPHEN物候数据、ERA5数据 一、CMIP6中的模式比较计划 二、数据下载 三、基础知识 四、单点降尺度 五、统计方法的区域降尺度 六、基于WRF模式…

助力低碳出行 | 基于ACM32 MCU的电动滑板车方案

前言 随着智能科技的快速发展,电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中,传统的刷式电机已经逐渐被无刷电机所取代,无刷电机的性能和寿命都更出色,已…

STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

1.总体逻辑 按下STM32F4的KEY0按键,通过外部中断的方式对按键进行检测,然后开启一次带DMA的固定点数的ADC采集,采集完成后在DMA的中断发送采集到的数据,然后清空数据区准备下一次的按键中断。电脑接受到串口数据后对数据进行简单…

大厂齐出海:字节忙种草,网易爱社交

配图来自Canva可画 随着国内移动互联网红利逐渐触顶,互联网市场日趋饱和,国内各互联网企业之间的竞争便愈发激烈起来。在此背景下,广阔的海外市场就成为了腾讯、阿里、字节、京东、拼多多、百度、网易、快手、B站等互联网公司关注和争夺的重…

算法--前缀和技巧 (蓝桥杯123-灵能传输--求和)

文章目录 什么是前缀和用途什么时候用java的前缀和例题[蓝桥杯 2022 省 A] 求和题目描述思路代码 [蓝桥杯 2021 国 ABC] 123题目描述思路代码 [蓝桥杯 2019 省 B] 灵能传输(蓝桥杯96%,洛谷ac)题目描述思路代码 什么是前缀和 如果一个数组a的元素为 a 1 , a 2 , a 3…

Springboot +Flowable,详细解释啥叫流程实例(一)

一.简介 上一篇中学习了Flowable 中的流程模板(流程定义)的部署问题,这一篇来学习什么叫流程实例。 部署之后的流程模板,还不能直接运行,例如我们部署了一个请假流程,现在 张三想要请假,他就需…

WhatsApp多开攻略,低成本高效率多开账号聊单的方法献上~

WhatsApp多开攻略!低成本高效率多开账号聊单的方法献上~ WhatsApp多开是指在同一台设备上同时登录多个WhatsApp账号,这种技术通常被跨境电商从业者用于在不同的WhatsApp账号之间切换,以便更好地管理跨境电商业务。 图中工具: ss客…

lazada按关键字搜索商品API接口

lazada按关键字搜索商品 API接口,在 lazada上搜索产品,如果只需要搜索单个产品的话,那么直接在搜索框输入“关键字”即可,如果需要多个产品,那么则需要进行关键字扩展。 lazada按关键字搜索商品 API接口分为两部分&am…

AI 这是要杀疯啦!

ChatGPT 是基于 GPT 系列大模型开发出来的一个对话场景的 Demo,它已经让我们见识到了大模型的威力。 但有些开发者的胃口不满足于此,已经开始尝试“突破” AI 的边界了,本文推荐 5 个人工智能的开源项目。其中前两个项目,让人细思…