目录

关于

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

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. HDU4372 Count the Buildings (+题解:斯特林数)

    题面 (笔者翻译) There are N buildings standing in a straight line in the City, numbered from 1 to N. The h ...

  2. 【Java】学习路径50-线程死锁问题

    生活化的例子:比如说有两个人,一把刀和一把叉子: 第一个人先需要一把刀,然后还需要一把叉子: 第二个人先需要一把叉子,然后还需要一把刀. 我们理想的情况是:一个人拿着刀,然后再拿到叉子,把事情做完,然 ...

  3. Python自学笔记11-函数的定义和调用

    函数是组织代码的非常有效的方式,有了函数,我们就可以编写大规模的项目.可以说,函数是组织代码的最小单元. Python函数的定义 函数是代码封装的一种手段,函数中包含一段可以重复执行的代码,在需要用到 ...

  4. Openstack之各组件命令

    openstack 组件命令 Glance组件操作(镜像服务组件) #环境配置: source /etc/keystone/admin-openrc.sh #查看镜像列表: glance image- ...

  5. Merge Into 语法支持

    KINGBASE 兼容Oracle 语法,实现了merge into 的功能.以下以例子的形式,介绍merge into语法的使用.以下例子在V8R6 ,且 database_mode=oracle ...

  6. Pytest fixture及conftest详解

    前言 fixture是在测试函数运行前后,由pytest执行的外壳函数.fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集.配置测试前系统的初始状态.为批量测试提供数据源等 ...

  7. IK分词器实现原理剖析 —— 一个小问题引发的思考

    前言: 网上很多的文章都建议在使用IK分词器的时候,建立索引的时候使用ik_max_word模式:搜索的时候使用ik_smart模式.理由是max_word模式分词的结果会包含smart分词的结果,这 ...

  8. Python数据科学手册-Pandas:数据取值与选择

    Numpy数组取值 切片[:,1:5], 掩码操作arr[arr>0], 花哨的索引 arr[0, [1,5]],Pandas的操作类似 Series数据选择方法 Series对象与一维Nump ...

  9. kubeadm join 命令执行流程

  10. 使用nginx代理nexus,不是/根路径

    location /nexus/ { proxy_pass http://192.168.0.218:8081/; proxy_set_header Host $host:$server_port; ...