目录

关于

先贴一下已经集成好的项目地址, 如果对如何集成不感兴趣, 想直接使用的, 可以跳过这部分, 直接看使用部分

AIR32F103CBT6的存储是128K Flash + 32K RAM, CCT6是256K Flash + 64K RAM, 大容量加上206MHz的工作频率, 跑FreeRTOS是非常合适的. 关于FreeRTOS的介绍和集成, 网络上已经有不少文章, 可以直接百度搜索查看, 这里主要介绍一下项目中的FreeRTOS集成步骤和代码说明.

集成步骤

添加 FreeRTOS 核心库文件

参考之前的文章 STM32F10x SPL 集成 FreeRTOS, 因为 AIR32F103 和 STM32 基本上是兼容的, 低位的中断定义一样, 直接套用就可以.

https://www.freertos.org/下载 FreeRTOS 202112.00 , 解开后到 FreeRTOS/Source 目录下, 复制以下的文件到项目目录下

  • FreeRTOS/Source/include 整个目录, 这些是头文件
  • FreeRTOS/Source 下的所有C文件
  • FreeRTOS/Source/portable/GCC/ARM_CM3 目录, 这是针对 STM32F103 的适配文件
  • FreeRTOS/Source/portable/MemMang 目录, 里面包含一些现成的内存管理实现

只需要保留这些文件

FreeRTOS
├── include
│ ├── atomic.h
│ ├── croutine.h
│ ├── deprecated_definitions.h
│ ├── event_groups.h
│ ├── FreeRTOS.h
│ ├── list.h
│ ├── message_buffer.h
│ ├── mpu_prototypes.h
│ ├── mpu_wrappers.h
│ ├── portable.h
│ ├── projdefs.h
│ ├── queue.h
│ ├── semphr.h
│ ├── stack_macros.h
│ ├── StackMacros.h
│ ├── stdint.readme
│ ├── stream_buffer.h
│ ├── task.h
│ └── timers.h
├── portable
│ ├── GCC
│ │ └── ARM_CM3
│ │ ├── port.c
│ │ └── portmacro.h
│ └── MemMang
│ ├── heap_1.c
│ ├── heap_2.c
│ ├── heap_3.c
│ ├── heap_4.c
│ └── heap_5.c
├── croutine.c
├── event_groups.c
├── list.c
├── queue.c
├── stream_buffer.c
├── tasks.c
└── timers.c

然后准备 FreeRTOSConfig.h

编辑 FreeRTOSConfig.h

下面是一个完整的例子, 说明写到了注释里, 可以删掉

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H // [重要]开启抢占模式, 大部分组件会默认FreeRTOS是开启抢占模式的, 否则不能保障其实时性
#define configUSE_PREEMPTION 1
/* 不使用 idle task hook. RTOS的调度器在启动时会自动创建一个idle task, 这样保证在没有任务执行时也会运行一个任务, 这个任务会运行在最低的优先级. An idle task hook is a function that is called during each cycle of the idle task. 如果自定义了 idle task 方法, 就将其设为1.
*/
#define configUSE_IDLE_HOOK 0
// 不使用 tick hook. 和 idle task hook 一样, 就是tick中断时可以定义一个callback方法.
#define configUSE_TICK_HOOK 0
// [重要]定义主频, 别定义错, 会导致延时和定时器计算有偏差, 如果设置了216MHz或者256MHz, 这里需要修改
#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
// [重要]定义Tick的频率(每秒多少个tick), 和主频和SysTick的定义要结合看, 一般用1毫秒, 或者1/10毫秒
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
// [重要]task中可以用的优先级个数
#define configMAX_PRIORITIES ( 5 )
// [重要]任务的最小堆栈尺寸, 如果stack是32位, 就是4byte, 128就是128*4=512 byte
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
// [重要]堆的尺寸, 根据自己的MCU RAM容量调整
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
// 任务名长度限制
#define configMAX_TASK_NAME_LEN ( 16 )
// 用于需要包含额外的变量和函数结构用于协助跟踪和可视化, 不使用就设为0
#define configUSE_TRACE_FACILITY 0
// Tick使用16位计数值, 针对8位和16位的核使用的. 对M0 M3这种32位的不需要
#define configUSE_16_BIT_TICKS 0
// 开启低功耗的空闲模式, 0则永远打开tick中断. 这个配置要和 configUSE_TICKLESS_IDLE 结合看
#define configIDLE_SHOULD_YIELD 1
// 用于设置是否允许低优先级任务使用taskENTER_CRITICAL(), 设为0可以提高安全性, 不定义会报warning
#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 0 // 协程基本用不上, 按默认即可
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) /* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */ // 这些是属于功能裁剪的部分, 如果你使用了某些功能, 就要加上, 没用到的可以设为0或者不定义
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1 /*
对于Cortex-M3核最低的中断优先级
This is the raw value as per the Cortex-M3 NVIC. Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY 255
/*
在新的移植中, configMAX_SYSCALL_INTERRUPT_PRIORITY改名为configMAX_API_CALL_INTERRUPT_PRIORITY, 这两个是等价的. 这个值代表了最高的, 可以安全调用 FreeRTOS API 的中断优先级. 如果一个中断的优先级比这个高, 那么 FreeRTOS 是无法屏蔽这个中断的, 哪怕在 critical section 内部, 也会被这个中断打断.
!!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */ /*
将 FreeRTOS 中的关键中断处理函数设置为宏, 避免修改startup文件
Use MACRO to replace the handlers without changing startup file */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

在项目中使用 FreeRTOS

开启 FreeRTOS 支持

在项目中启用 FreeRTOS 支持, 只需要编辑 Makefile, 将 USE_FREERTOS ?= n 配置修改为 USE_FREERTOS ?= y

# Build with FreeRTOS, y:yes, n:no
USE_FREERTOS ?= y

默认使用的内存管理方式是heap_4.c, 如果希望换成其它的内存管理方式, 可以修改这一行

CFILES		+= Libraries/FreeRTOS/portable/MemMang/heap_4.c

执行示例代码

项目中已经针对AIR32F103准备了一些FreeRTOS的代码示例, 根据FreeRTOS的功能, 分别提供了以下示例的集合

├── Mem
│   └── Malloc_And_Free # 内存申请和释放
├── Queue
│   ├── Queue_And_Notification # 队列和定时器中断触发的通知
│   ├── Queue_And_Notification_DMA # 和上面一样, 但是换成了DMA中断
│   └── Queue_Send_And_Receive # 队列的接收和发送
├── Semaphore
│   ├── Binary_Semaphore # 单值信号量
│   ├── Counting_Semaphore # 计数信号量
│   └── Mutex # 锁
├── Tasks
│   ├── Blink # 多任务闪灯
│   ├── Blink_Controlled_By_UART # 用一个任务读取UART控制另一个任务的闪灯频率
│   ├── DelayUntil # 带提前量的延迟
│   └── Task_Notification # 任务间的等待和通知
└── Timers
└── TimerCallback # 软件定时器

修改 Makefile 启用 FreeRTOS 支持后, 可以将示例代码复制到 User 目录下编译烧录.

针对合宙AIR32F103CBT6开发板的闪灯示例代码位于 Examples/FreeRTOS/Tasks/Blink 目录, 这个示例会创建三个任务, 按不同的周期控制板载的三个LED的亮灭. 编译和烧录的步骤参考 AIR32F103(三) Linux环境基于标准外设库的项目模板

更多阅读

AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码的更多相关文章

  1. 一系列令人敬畏的.NET核心库,工具,框架和软件

    内容 一般 框架,库和工具 API 应用框架 应用模板 身份验证和授权 Blockchain 博特 构建自动化 捆绑和缩小 高速缓存 CMS 代码分析和指标 压缩 编译器,管道工和语言 加密 数据库 ...

  2. Swift 正式开源, 包括 Swift 核心库和包管理器

    Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章.自从苹果发布 Swfit 编程语言,就成为了历史上发展最快的编程语言之一.Swift 通过设计使得软件编写更加快速更加安全 ...

  3. APICloud支持Atom编辑器,并建立开发工具核心库

    APICloud支持Atom编辑器开发工具 APICloud始终坚持多开发工具支持策略,开发者无论使用Sublime Text3.Eclipse还是Webstorm,都可以在APICloud平台中找到 ...

  4. (五)boost库之随机数random

    (五)boost库之随机数random boost库为我们提供了许多的日常随机数生成器: 1.uniform_smallint:在小整数域内的均匀分布 2.uniform_int:在整数域上的均匀分布 ...

  5. Lu核心库系统结构及输出函数

    Lu核心库系统结构及输出函数 Lu来源于Forcal,可以说,没有Forcal就没有Lu,但学习Lu并不需要了解Forcal. Lu是对Forcal的完善和发展,但与Forcal相比,Lu更简洁实用. ...

  6. 【Java疑难杂症】利用Java核心库实现简单的AOP

    Spring是一个十分火热开源框架,而AOP(面向切面编程)则是Spring最重要的概念之一,为了更好的理解和学习AOP的思想,使用核心库来实现一次不失为一个好方法. 首先介绍一下AOP的概念,AOP ...

  7. MyBatis基础入门《五》核心配置文件

    MyBatis基础入门<五>核心配置文件 描述: 在前面的章节中,简单的学习使用了一下mybatis,对于配置文件没有过多详细说明. 这里先描述项目中的一个核心配置文件:mybatis-c ...

  8. BitAdminCore框架应用篇:(五)核心套件querySuite列的定义

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...

  9. .NET 解决方案 核心库整理

    一系列令人敬畏的.NET核心库,工具,框架和软件: https://www.cnblogs.com/weifeng123/p/11039345.html 企业级解决方案收录:  https://www ...

随机推荐

  1. 【Java】学习路径63-反射、类的加载-附思维导图(完结)

    这一章的知识在实际开发也没有那么重要,主要是了解即可,另外掌握如何使用反射机制. 类的使用: 在虚拟机中: 类的加载->类的连接->类的初始化 类的加载   只会加载需要用到的类,加载到内 ...

  2. 牛客小白月赛51-C-E

    C-零一题 题意: 每次可以选择两个相邻且相同的字符,将他们删除,在无数次操作后,字符串的长度变为n,问能否构造出原来的字符串,不能输出-1 题解: 很明显,最后无法再操作时,这个字符串一定是01相交 ...

  3. Session认证机制与JWT认证机制

    一.什么是身份认证? 身份认证(Authentication)又称"身份验证"."鉴权",是指通过一定的手段,完成对用户身份的确认.日常生活中的身份认证随处可见 ...

  4. SDUT 2022 Autumn Team Contest 7th

    1.J题:给你T组数据,每一组数据给你一个区间,让你求这个区间的范围,区间的起始时间和终止时间可能被包含或重复 思路:思路的话,就是直接把给定的两个区间的之间的数包括端点存到vector去重,然后直接 ...

  5. 好书推荐之Mysql三剑客 :《高性能Mysql》、《Mysql技术内幕》、《数据库索引设计与优化》

    Mysql三剑客系列书籍: 大佬推荐 首先推荐<高性能 MySQL>,这本书是 MySQL 领域的经典之作,拥有广泛的影响力.不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习.不 ...

  6. 利用Kafka的Assign模式实现超大群组(10万+)消息推送

    引言 IM即时通信场景下,最重要的一个能力就是推送:在线的直接通过长连接网关服务转发,离线的通过APNS或者极光等系统进行推送.   本文主要是针对在线用户推送场景来进行总结和探讨:如何利用Kafka ...

  7. 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用(含源码)

    前言 今天我们一起来使用LabVIEW AI视觉工具包快速实现图像的滤波与增强:图像灰度处理:阈值处理与设定:二值化处理:边缘提取与特征提取等基本操作.工具包的安装与下载方法可见之前的博客. 一.图像 ...

  8. C#-7 结构和枚举

    一 什么是结构 结构是程序员定义的数据类型,有数据成员和函数成员,和类非常类似. 类是引用类型,而结构是值类型: 结构和类一样可以实现接口: 结构是隐式密封的,不能被派生: 结构类型的变量不能为nul ...

  9. jquery修改图片src

    jquery修改图片src,会重新请求此图片url,重新加载图片.方法如下: $("#<img的id>").attr("src", src_valu ...

  10. python之流程控制上-if、while

    流程控制 编写程序,是将自己的逻辑思想记录下来,使得计算机能够执行的过程. 而流程控制,则是逻辑结构中十分重要的一环. 在程序中,基础的流程结构分为顺序结构.分支结构.顺序结构 顺序结构自不必多说,上 ...