目录

  • AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告
  • AIR32F103(二) Linux环境和LibOpenCM3项目模板
  • AIR32F103(三) Linux环境基于标准外设库的项目模板
  • AIR32F103(四) 27倍频216MHz,CoreMark跑分测试
  • AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码
  • AIR32F103(六) ADC,I2S,DMA和ADPCM实现的录音播放功能
  • AIR32F103(七) AIR32F103CBT6/CCT6启用96K内存
  • AIR32F103(八) 集成Helix MP3解码库播放MP3
  • AIR32F103(九) CAN总线的通信和ID过滤机制及实例
  • AIR32F103(十) 在无系统环境和FreeRTOS环境集成LVGL
  • AIR32F103(十一) 在AIR32F103上移植微雪墨水屏驱动
  • AIR32F103(十二) 搭载 AIR32F103CBT6 的Bluepill核心板

关于

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

  • GitHub https://github.com/IOsetting/air32f103-template/tree/master/Examples/FreeRTOS
  • Gitee https://gitee.com/iosetting/air32f103-template/tree/master/Examples/FreeRTOS

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的定义要结合看, 一般用1000(1毫秒), 或者100(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环境基于标准外设库的项目模板

更多阅读

  • Mastering the FreeRTOS Real Time Kernel 电子书 https://www.freertos.org/fr-content-src/uploads/2018/07/161204_Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide.pdf
  • FreeRTOSConfig.h 参数说明 https://www.freertos.org/a00110.html
  • 写得比较详细的 FreeRTOS 介绍 https://blog.csdn.net/qq_61672347/article/details/125748646

AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码相关推荐

  1. java lambdamart库,LambdaMART 之 lambda(示例代码)

    LambdaMART 之 lambda 概念 LTR 排序学习主要用于对召回结果的精排,主流使用基于pair(文档对标记)的 LambdaMART 算法,该算法由两部分组成:lambda + MART ...

  2. 开发人员必备:微软发布示例代码浏览器 (Sample Browser) 第五版,让您尽享3500个示例代码...

    今天早上,微软一站式示例代码库 携手MSDN和微软创新空间 正式发布了示例代码浏览器(Sample Browser)第五版.这是继去年10月第四版发布以来的一次重大升级.有了它,3500多高质量示例代 ...

  3. All-In-One Code Framework [一站式示例代码库] 【转】

    All-In-One Code Framework [一站式示例代码库] 2010 对一站式示例代码库,对奋战在一站式示例代码库上的每一位工程师来说都是不同寻常的一年. 在我们共同努力和开发社区的支持 ...

  4. 大数据治理的五个核心要素

    当今的大型企业,内部分工日趋细化,采购.服务.市场.销售.开发.支持.物流.财务.人力等各个环节,无不每时每刻产生着大量的数据.数据的格式也越来越多样化,包括IT系统里存储的结构化.非结构化数据,各样 ...

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

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

  6. tailwindcss 官网(五)核心概念:添加新的功能类、函数与指令(@tailwind、@apply、!important、@layer、@variants、 theme())、px、em、rem

    tailwindcss 官网(五)核心概念:添加新的功能类.函数与指令(@tailwind.@apply.!important.@layer.@variants.@responsive. theme( ...

  7. ZStack源码剖析之核心库鉴赏——FlowChain

    本文首发于泊浮目的专栏:https://segmentfault.com/blog... 前言 在ZStack(或者说产品化的IaaS软件)中的任务通常有很长的执行路径,错误可能发生在路径的任意一处. ...

  8. 图形驱动程序和显卡驱动什么区别_什么是核心显卡,核心显卡和集成显卡的区别...

    随着整合时代的到来,如今很多处理器内部都集成了核心显卡,也就本文所说的核心显卡.那么,核心显卡是什么意思?它与我们过去所说的集成显卡又有哪些区别呢?这是很多菜鸟朋友所不够了解的,今天我们就来通俗易懂的 ...

  9. sentinel 端口_双剑合璧Nacos结合Sentinel实现流量安全控制(一):Sentinel核心库和控制台...

    Alibaba Sentinel 是一款高性能且轻量级的流量控制.熔断降级解决方案.是面向分布式服务架构的高可用流量控制组件. Sentinel 官网:https://sentinelguard.io ...

最新文章

  1. 行内标签(最常用的:a标签、img标签、span标签)
  2. iOS 用自签名证书实现 HTTPS 请求的原理实例讲解
  3. 073_html5视频
  4. 字体大小的设置_ios 设置的字体大小与实际的字体大小不一致
  5. 【Python】递归绘制科赫曲线及科赫雪花及转换成可执行文件打包
  6. vb.net mysql存储图片_怎么让VB.NET 上传图片到SQL 数据库只保存路径,图片保存到文件...
  7. 计算机打开共享网络连接打印机共享打印机,WIN7怎么连接共享打印机?如何设置和连接局域网共享打印机...
  8. JavaWeb—作业【建立新闻数据库以及插入数据】
  9. Linux 内核第一宏
  10. deeping安装Android studio
  11. 文件系统FatFsR0.09a翻译(三):ff.h
  12. python中如何判断词性_Python3自然语言处理——词性标注
  13. AI-人工智能 easyAi开发技术
  14. 累了、倦了、撑不下去了,静下心来看一看
  15. Android studio 常见问题(2)----存储空间不足导致AVD打不开的错误
  16. MySQL里什么是主键_mysql主键是什么?
  17. 奥西打印机服务器重装系统教程,奥西工程机TCS400驱动程序安装方法
  18. WPF实现组态软件-逼真的管道和速度可变流体(五)
  19. Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index 5 out of bounds for leng
  20. 使用github+Hexo人人都能拥有一个美美的博客

热门文章

  1. SMT中的关系词组英汉对译
  2. 构建和谐的亲子关系公益讲座--如何和“熊孩子”对话
  3. sigaction 函数
  4. 使用requests爬取豆瓣电影top250
  5. java x轴 左正_R中Barplot中的X轴
  6. 图书馆管理系统数据库设计与实现--用于学完SQL/MYSQL练手
  7. 全流程打通!YOLOV5标注训练部署:Windows/Linux/Jetson Nano
  8. java基础之程序开发三步骤
  9. 树莓派卸载腾出空间_腾出时间进行仪表和观测
  10. DPDK中文-EAL层