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

创建一个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系统工程就创建完成了,我们这里用的是软件仿真。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于python的socket网络通信【1】

一、Socket原理 学习了大佬的知识,简单记一些笔记 https://www.jianshu.com/p/066d99da7cbd http://c.biancheng.net/view/2351.html 1.1什么是Socket 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种…

计算机网路常见面试题(上)

计算机网络基础 # 网络分层模型 # OSI 七层模型是什么?每一层的作用是什么? OSI 七层模型 是国际标准化组织提出一个网络分层模型,其大体结构以及每一层提供的功能如下图所示: 每一层都专注做一件事情,并且每一层都…

网络安全:namp扫描工具

-sP可以扫描一个网段ip以及状态和基本信息,10.1.1.2-3就是扫描2和3这两个ip的主机 -p可以扫描指定ip对应主机的端口号,可以是一个范围 nmap简单扫描:nmap 地址 检查地址是否在线以及open的端口号 在端口开放,不一定可以与对方正常…

Spring 依赖注入源码

文章目录 依赖注入原始依赖注入方式注解方式寻找注入点注入点进行注入 从BeanFactory中找注入对象总结 依赖注入 具体代码是在AbstractAutowireCapableBeanFactory类的populateBean()方法,此方法中主要做的事情如下: 实例化之后,调用Instan…

各大外卖平台占据共享经济市场主要份额,占比近50%

哈喽大家好,随着大量互联网用户和移动支付的普及、大量用户通过共享平台将闲置资源和服务与需求方进行匹配,实现了资源的高效利用和消费者福利的提升。在全球化驱动的新型消费需求以及政策支持下,共享经济正在向更加成熟和规范化的方向发展。…

瑞芯微RK3568智慧视频录像机NVR设备解决方案

NVR技术应用功能模式,较为灵活且能够在很大程度上满足当今视频监控系统功能需求。以NVR技术为核心的小型NVR方案,具有规模较小、操作灵活、使用方便、经济实用等优点,其前端主要配合高清视频摄像机支持8路720P的高清视频图像接入,…

13-NumPy

文章目录 一.基础1.Ndarray对象2.数据类型 二.数组1.数组属性(1)arange(2)shape(3)ndim(4)itemsize 2.创建数组(1)empty(2)zero&#…

Chat GPT在全球变暖中的潜在应用

01 摘要 气候变化是一个全球性的重大挑战,需要整合包括大气科学、海洋学和生态学在内的许多不同科学领域。解决这一问题的复杂性和规模需要利用先进的工具和技术来理解、建模和预测未来的气候状况。人工智能和自然语言处理技术,如Chat GPT,…

Maven 依赖下载失败解决方案——配置国内源 + 具体解决办法

目录 前言 一、配置 Maven 国内源 二、重新下载jar包 三、其他问题 前言 最近发现 spring-boot 框架更新到 2.7.11 了,由于以前一直使用的是 2.7.9 ,所以一直出现依赖下载失败的问题,实际上这是由于 IDEA 会先加载之前下载好的依赖&#xf…

Linux操作系统命令大全

Linux是一种操作系统 Operating System 简称 OS ,是软件的一部分,它是硬件基础上的第一层软件,是硬件和其它软件沟通的桥梁。 操作系统会控制其他程序运行,管理系统资源,提供最基本的计算功能,如管理及配置…

业内常用即时传输网盘

工具名称 业内常用即时传输网盘 功能简介 无需登录,短时间内有效,多用于传输小型敏感文件 外部链接 请见文内 内部网盘链接 在线站点,无网盘链接 使用说明 许多安全行内人士在团队内互传敏感文件时,为实现上传和下载文件…

现场工程师救火-UEFI(BIOS)节能设置导致金牌服务器只跑出龟速

近期协助出现场,解决了一个非常典型的UEFI 启动参数配置不当导致的服务器降效案例。错误的节能参数配置,导致价值几十万的服务器变成龟速服务器,并造成严重的生产事故。 1. 现象 朋友公司近期准备升级2010年就部署的服务器组,新…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 2 MapReduce and the New Software Stack

来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 2 MapReduce and the New Software Stack Computing cluster means large collections of commodity hardware, including conventional processors (“compute nodes”) connected by Ethernet …

centos8 mysql 主从复制

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 Linux centos8

使用D435i深度相机运行ORB-SLAM3

下载安装链接 下载ORB-SLAM3地址: git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git eigen3多版本安装:https://blog.csdn.net/weixin_41756645/article/details/129570141 ORB-SLAM2中eigen3版本为:3.2.10版本 ORB-SLAM3中eigen3版…

【分布式】一致性哈希和哈希槽

当我们拥有了多台存储服务器之后,现在有多个key,希望可以将这些个key均匀的缓存到这些服务器上,可以使用哪些方案呢? 1. 普通哈希取模法 1.1 直接哈希取模 这是一种最容易想到的方法,使用取模算法hash(k…

AI绘图实战(七):室内设计线稿渲染、景观设计手绘稿改动、建筑照片转线稿|Stable Diffusion成为设计师生产力工具

S:AI能取代设计师么? I :至少在设计行业,目前AI扮演的主要角色还是超级工具,要顶替?除非甲方对设计效果无所畏惧~~ 预先学习: 安装及其问题解决参考:《Windows安装Stable Diffusion …

javaScript:cropperjs是一款非常强大却又简单的图片裁剪工具

cropperjs是一款非常强大却又简单的图片裁剪工具,它可以进行非常灵活的配置,支持手机端使用,支持包括IE9以上的现代浏览器。(关键是使用方法简单,几行代码就可以搞定) 官方github文档:GitHub -…

流程图拖拽视觉编程-流程编辑器

目录 一、简介 二、流程编辑器-视图实现 三、参考资料 一、简介 前期文章: 流程图拖拽视觉编程--概述_Jason~shen的博客-CSDN博客 本期内容: 本期将介绍流程编辑器模块的实现方法,效果图如下所示。该模块基于QT Graphics/View实现&…

使用FFMPEG库封装264视频和acc音频数据到MP4文件中

准备 ffmepeg 4.4 一段H264的视频文件 一段acc格式的音频文件 封装流程 1.使用avformat_open_input分别打开视频和音频文件,初始化其AVFormatContext,使用avformat_find_stream_info获取编码器基本信息 2.使用avformat_alloc_output_context2初始化…