IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 00_FreeRTOS内核实现---前期准备 -> 正文阅读

[嵌入式]00_FreeRTOS内核实现---前期准备


前言

为了对FreeRTOS有一个深入的了解,参照野火的《FreeRTOS内核实现与应用开发实战指南》一书实现一个精简版的内核,之前用的比较多的单片机是STM32,所以和芯片内核架构相关的以cortex-M4F来实现,前期的所有验证在keil5上实现,最后才在STM32F4上进行验证。学习FreeRTOS内核并跟着教程写一遍代码,能够深入的理解RTOS的原理,同时能够学习C语言的高级编程方法和思想,对软件编程能力也有很大的帮助,也算是对C语言的一个进阶学习。先对FreeRTOS的编程风格有一定了解,并建立Keil工程,下一篇文章再真正进入FreeRTOS的实现。


一、FreeRTOS的编程风格

1.数据类型

为了适配不同的处理器,FreeRTOS对C语言中的基本数据类型进行了重定义,且不使用int型(个人猜测是在不同位宽处理器上int型所占位宽可能会不同的原因),使用short型和long型。数据类型重定义的具体实现如下(在portmacro.h头文件中):

/* 数据类型重定义 */
#define portCHAR        char
#define portFLOAT       float
#define portDOUBLE      double
#define portLONG        long
#define portSHOrt       short
#define portSTACK_TYPE  uint32_t
#define portBASE_TYPE   long

typedef portSTACK_TYPE  StackType_t;
typedef long            BaseType_t;
typedef unsigned long   UBaseType_t;

#if(configUSE_16_BIT_TICKS == 1)
typedef uint16_t TickType_t;
#define portMAX_DELAY   (TickType_t)0xffff
#else
typedef uint32_t    TickType_t;
#define portMAX_DELAY   (TickType_t)0xffffffffUL
#endif

基本数据类型BaseType_t用long来实现,configUSE_16_BIT_TICKS 是在FreeRTOSConfig中的宏定义,定义是否使用16位位宽,这里默认是设置为0。


2.变量名

在FreeRTOS中,定义变量是会把变量的类型当作前缀加到变量上,这样做的好处是看到变量名就能知道该变量的类型。不同的数据类型的前缀如下:

数据类型前缀
charc
shorts
longl
portBASE_TYPE、数据结构、任务句柄、队列句柄等x
无符号类型u
指针p
voidv

3.函数名

函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有函数,则会在加一个prv(private)前缀,具体举例如下:

  1. vTaskPrioritySet()函数的返回值是void,在Task.c中定义,功能是设置优先级。
  2. xQueueReceive()函数的返回值是portBASE_TYPE类型,在queue.c中定义,功能是从一个队列中接收消息(并把接收的消息从队列中删除)。
  3. vSemaphoreCreateBinary()函数的返回值是void类型,在semphr.h中定义,功能是创建二至信号量。

4.宏

宏均有大写字母构成,比配有小写字母的前缀,前缀用于表示该宏在哪个头文件中定义,举例如下:

前缀宏定义所在的头文件
port,如portMAX_DELAYportable.h
task,如taskENTRY_CRITICAL()task.h
pd,如pdTRUEprojdefs.h
config,如configUSE_PREEMPTIONFreeRTOSConfig.h
err,如errQUEUE_FULLprojdefs.h

二、建立FreeRTOS工程

1.新建文件夹

(1)Doc:用于存放对整个工程文件的说明文件
(2)Project:存放新建的工程文件
(3)freertos:

  • Demo:存放板级支持包
  • License:存放FreeRTOS组件
  • Source:内核源码
    • include:存放头文件
    • portable:
      • RVDS:
        • ARM_CM3:M3内核的接口文件
        • ARM_CM4:M4内核的接口文件
        • ARM_CM7:M7内核的接口文件

(4)User:存放用户程序代码

2.建立Keil工程

(1)由于后面使用STM32F4进行验证,在Select Device for Target处选择"ARM Cortex M4 —> ARMCM4F"。
(2)在Manage Run-Time Enviroment界面点击CMSIS,勾选CORE;点击Device,勾选Startup。

其他按照常规设置即可。

3.新建文件组

在这里插入图片描述
并在user中添加main.c文件,编写最基本的main.c文件,此时编译不再会报错。

4.调试设置

  1. 设置软件仿真:Project —> Options for Target —> Debug —> 勾选"Use Simulator"
  2. 修改时钟:Project —> Options for Target —> Target —> 修改时钟为25MHz(因为在sytem_ARMCM4.c中定义的时钟频率为25MHz)。
  3. 添加头文件路径:Project —> Options for Target —> C/C++ —> Include Paths —> 选择"include"文件夹。

至此,前期的准备工作完成,接下里就可以进入FreeRTOS的实现了。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:39:38  更:2022-07-17 16:42:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:50:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码