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

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS系统学习第一步:新建 FreeRTOS 工程—软件仿真 的相关文章

随机推荐

  • MySQL数据库备份与恢复

    在项目的开发过程中数据库的备份是非常重要的 xff0c 为了防止数据库受到破坏 xff0c 造成不可估量的损失 xff0c 所以一定要进行数据库的备份 xff0c 并且需要掌握数据库恢复方法 xff0c 在发生数据库损坏的时候 xff0c
  • Linux设备驱动基础知识

    一 认识驱动 1 什么是驱动 不知道的情况下 xff0c 我们一般会去问度娘 xff0c 但是度娘的这个回答比较专业化 xff0c 对小白来说并不容易理解 xff0c 依旧不明白驱动到底是个啥 度娘 xff1a 驱动 xff0c 计算机软件
  • 接口及实现方法

    什么是接口 接口 xff08 英文 xff1a Interface xff09 xff0c 在JAVA编程语言中是一个抽象类型 xff0c 是抽象方法的集合 xff08 接口中的所有的方法都是抽象方法 xff09 xff0c 接口通常以in
  • JS中Document对象

    Document对象 Document对象就是一个标记性文档对象 它就是HTML文件本身 当浏览器把一个html文件加载到内存中之后 xff0c 在内存中就会形成这个document对象 document URL xff1a 返回当前页面的
  • Sphinx环境配置以及VScode编写Rst文档转html

    Sphinx环境配置 安装python3通过python3安装sphinx sphinx官方网站 xff1a Installing Sphinx Sphinx documentation python官方网站 xff1a Welcome t
  • js实现防抖和节流

    防抖 xff1a 防抖就是在连续多次触发该事件 xff0c 事件触发间隔小于设定的事件 xff0c 事件只会执行最后一次 节流 xff1a 规定的时间内 xff0c 只能触发一次该事件 接下来看代码 xff1a lt DOCTYPE htm
  • 树莓派系统镜像一键瘦身备份脚本, 生成最小化镜像img(一)

    开发 测试环境 树莓派 xff1a Raspberry Pi 3b 43 TF 存储卡 xff1a 32GB操作系统 xff1a 2020 05 27 raspios buster full armhf xff08 官方版本 xff09 程
  • 分享——网页上的虚拟机

    大家还记得之前的Windows系统吗 xff1f 相信大家一定想要重温或体验以前Windows的系统吧 xff0c 可有些朋友想体验但又嫌装虚拟机太麻烦 xff0c 怎么办呢 其实 xff0c 还有 网上的虚拟机 现在 xff0c 我就给大
  • 单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

    单片机编程中的裸机系统和多任务系统 学习了那么久的stm32还停留在裸机 xff1f xff1f xff1f 单片机编程中的裸机系统和多任务系统 1 裸机系统1 1轮询系统1 2 前后台系统 2 多任务操作系统3 为什么要学习多任务操作系统
  • Selenium+Pytest自动化测试框架实战,还不会点这里一清二楚,全网最细教程!

    如果下方文字内容没有看明白的话 xff0c 我推荐大家看一套视频 xff0c 比文字内容讲的更加详细 xff01 在华为工作了10年的大佬出的Web自动化测试教程 xff0c 华为现用技术教程 xff01 哔哩哔哩 bilibili 在华为
  • Firewalld防火墙基础

    目录 前言 一 概述 2 Firewalld和iptables的关系 2 1 Firewalld和iptables的关系 3 Firewalld区域 3 1 firewalld区域的概念 3 2 firewalld防火墙定义了9个区域 3
  • Matlab/simulink控制,遗传pid,模糊pid,滑模控制,自抗扰ADRC控制

    Matlab simulink控制 xff0c 遗传pid 模糊pid xff0c 滑模控制 xff0c 自抗扰ADRC控制 xff0c 鲁棒控制 xff0c LADRC控制等 xff0c 以上控制均已封装为simulink模块 xff0c
  • USB串口转CAN通讯盒资料

    公司开发低成本USB串口转CAN通讯盒 xff0c 其他项目优先 xff0c 停止开发 xff0c 自己闲暇时间继续开发而成 出资料 主控是stm32f103c8t6 整套资料 xff0c 很适合初学者学习上下位机通讯控制入门 xff0c
  • I2C读取IST8310

    文章目录 I2C简介I2C传输过程I2C仲裁IST8310磁力计Cube配置相关函数HAL I2C Mem Read函数HAL I2C Mem Write函数IST8310的初始化 程序流程代码编写 I2C简介 2C是一种半双工双向二线制的
  • 开发型C板IST8310磁力计的读写过程

    文章目录 读取单字节过程读取多字节过程写入单字节过程写入多字节过程 对于开发板C型的IST8310 xff0c I2C的地址是0x0E xff0c 读取0x00寄存器的值 读取单字节过程 发送一个起始信号 xff08 如图一 xff09 发
  • 嵌入式学习——I2C总线通信协议

    目录 1 I2C协议简介 I2C协议概述 I2C协议的物理层 I2C协议层 硬件I2C 软件模式的I2C协议 2 编程例题 题目要求 代码以及运行效果 3 总结 1 I2C协议简介 I2C协议概述 I2C通讯协议 Inter xff0d I
  • 善用 $ROS_DISTRO 简化ros程序安装

    查看ros版本信息 xff1a echo ROS DISTRO 在我的环境下 xff0c ROS DISTRO 61 foxy xff0c 可以把 ROS DISTRO就当成foxy字符串来用 我们在安装ros程序的时候 xff0c 很多时
  • grpc面试题

    1 什么是gRPC xff1f gRPC是一个高性能 开源 通用的RPC框架 它基于HTTP 2协议 xff0c 使用protobuf作为数据传输格式 xff0c 支持多种语言 xff08 Java Python C 43 43 等 xff
  • ROS系统下gazebo环境中,无人机结合目标跟踪算法(SiamCar),完成对物体的跟踪(可以是小车或者其他的)

    ROS系统下gazebo环境中 xff0c 无人机结合目标跟踪算法 xff08 SiamCar xff09 xff0c 完成对物体的跟踪 xff08 可以是小车或者其他的 xff09 xff0c 然后给出轨迹对比图等评估指标 开发语言 xf
  • FreeRTOS系统学习第一步:新建 FreeRTOS 工程—软件仿真

    创建一个FreeRTOS系统工程 1 新建工程文件夹2 Keil新建工程2 1 New Project2 2 Select Device For Target2 3 Manage Run Time Environment 3 在 KEIL