(二)移植FreeRTOS到STM32中

news2024/9/20 6:16:52

一、概念

(1)任务(线程):根据功能的不同,将一个系统分割成一个个独立且无法返回的函数,这个函数就被称为任务
(2)任务栈:静态创建的任务保存在栈中
(3)TCB:任务控制块,保存了一个任务节点
(4)任务就绪列表:初始化的一个列表数组,每个数组元素的列表可以保存多个任务列表项
(5)任务调度器:实现任务切换,从就绪列表中找到任务优先级最高的任务执行
(6)临界段:执行的时候不能被中断的代码段,实际就是中断的开关控制
(7)空闲任务:在CPU空闲时才会运行的任务
(8)阻塞延时:任务调用此延时函数后,任务会被剥离CPU使用权,然后进入阻塞状态,直到延时结束,任务重新获取CPU使用权才可以继续运行
(9)时间片:同一优先级下的多个任务,轮流享有CPU使用权,享有CPU的时间叫做时间片
(10)free rtos官网

二、移植

(1)一级文件夹介绍
一级文件夹
FreeRTOS:freertos系统文件夹
FreeRTOS-Plus:第三方组件
(2)二级文件夹
二级文件夹
Demo:官方例程
License:放置开源协议文件
Source:系统源码文件(重要)
(3)三级文件夹
三级文件夹
include:头文件
portable:硬件接口文件
.c:源文件
(4)在STM32项目下创建freertos文件夹,然后在文件夹下创建inc、src、port文件夹
(5)将FreeRTOS源码目录下的FreeRTOS/Source/include文件夹下的.h头文件全部复制到STM32项目的freertos/inc文件夹下
(6)将FreeRTOS源码目录下的FreeRTOS/Source文件夹下的.c源文件全部复制到STM32项目的freertos/src文件夹下
(7)将FreeRTOS源码目录下的FreeRTOS/Source/portable文件夹下的MemMang和RVDS文件夹复制到STM32项目的freertos/port文件夹下,其中MemMang文件夹下是不同的内存管理文件,一般选择heap_4.c文件,RVDS/ARM_CM3文件夹下存放的是单片机m3内核,不同单片机根据不同内核进行选择
(8)打开STM32项目,创建分组,将freertos的.c源文件添加进项目中,.h头文件路径添加到魔术棒中
(9)复制freertos源码的Demo文件夹下找到对应的单片机和编译器文件夹,将下边的FreeRTOSConfig.h文件复制到项目的头文件文件夹中
(10)FreeRTOSConfig.h配置文件

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/**
 *                                            基础配置
 */

#define configUSE_PREEMPTION		1                                   //1使用抢占式调度器 0使用协作式调度器(时间片)
#define configUSE_TIME_SLICING      1                                   //使能时间片调度
#define configUSE_PORT_OPTIMISED_TASK_SELECTION     1                   //任务选择方法,0通用方法 1优化方法,一般为计算前导零[CLZ]指令
#define configUSE_TICKLESS_IDLE     0                                   //1进入低功耗模式,下载代码可能会出错,0保持系统节拍(tick)中断一直运行
#define configCPU_CLOCK_HZ			( ( unsigned long ) 72000000 )     //定义系统时钟
#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )             //系统节拍中断频率,即1s中断的次数
#define configMAX_PRIORITIES		( 32 )                              //可使用的最大优先级
#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 128 )         //空闲任务栈大小
#define configMAX_TASK_NAME_LEN		( 16 )                              //任务名字最大长度
#define configUSE_16_BIT_TICKS		0                                   //系统节拍计数器变量数据类型,1表示16位无符号整型,0表示32位无符号整型
#define configIDLE_SHOULD_YIELD		1                                   //1表示空闲任务会放弃CPU使用权给其他同优先级的任务
#define configUSE_QUEUE_SETS        0                                   //1表示使能队列集合
#define configUSE_TASK_NOTIFICATIONS                1                   //1表示使能任务通知功能
#define configUSE_MUTEXES           0                                   //互斥信号量使能标志
#define configUSE_RECURSIVE_MUTEXES 0                                   //使用递归互斥信号量
#define configUSE_COUNTING_SEMAPHORES               0                   //1表示使用计数信号量
#define configQUEUE_REGISTRY_SIZE   10                                  //可以注册的信号量消息队列个数
#define configUSE_APPLICATION_TASK_TAG              0

/*
 *                                             内存申请相关配置
 */

#define configSUPPORT_DYNAMIC_ALLOCATION            1                   //支持动态内存申请
#define configSUPPORT_STATIC_ALLOCATION             0                   //支持静态内存
#define configTOTAL_HEAP_SIZE		( ( size_t ) ( 17 * 1024 ) )        //系统所有总的堆大小


/*
 *                                              钩子函数相关的配置
 */

#define configUSE_IDLE_HOOK			0                                   //1使用空闲钩子 0忽略空闲钩子 freertos规定了函数名,需要用户自己实现void vApplicationIdleHook(void)
#define configUSE_TICK_HOOK			0                                   //1使用时间片钩子 0忽略时间片钩子 freertos规定了函数名,需要用户自己实现void vApplicationTickHook(void)
#define configUSE_MALLOC_FAILED_HOOK                0                   //1使用内存申请失败钩子函数
#define configCHECK_FOR_STACK_OVERFLOW              0                   //1/2表示使用堆栈溢出检测功能 要使用此功能用户需要提供一个栈溢出钩子函数

/*
 *                                          运行时间和任务状态收集的配置
 */

#define configGENERATE_RUN_TIME_STATS               0                   //运行时间统计功能
#define configUSE_TRACE_FACILITY	0                                   //可视化跟踪调试功能
#define configUSE_STATS_FORMATTING_FUNCTIONS        0

/*
 *                                                  协程有关的配置
 */
 
#define configUSE_CO_ROUTINES       0                                   //协程启用状态位,启动协程必须添加croutine.c文件
#define configMAX_CO_ROUTINE_PRIORITIES              (2)                //协程的有效优先级数目

/*
 *                                               软件定时器相关配置
 */

#define configUSE_TIMERS             0                                  //软件定时器启动标志位
#define configTIMER_TASK_PRIORITY    (configMAX_PRIORITIES-1)           //软件定时器优先级
#define configTIMER_QUEUE_LENGTH     (10)                               //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2)       //软件定时器的任务堆栈大小

/*
 *                                           可选配置,是否编译对应的函数
 */

#define INCLUDE_xTaskGetSchedulerState  1                               //获取调度器状态
#define INCLUDE_vTaskPrioritySet		1                               //修改任务优先级
#define INCLUDE_uxTaskPriorityGet		1                               //获取任务优先级
#define INCLUDE_vTaskDelete				1                               //任务删除
#define INCLUDE_vTaskCleanUpResources	1                               //清除资源
#define INCLUDE_vTaskSuspend			1                               //挂起任务
#define INCLUDE_vTaskDelayUntil			1                               //绝对延时
#define INCLUDE_vTaskDelay				1                               //阻塞延时
#define INCLUDE_eTaskGetState           1                               //获取任务状态
#define INCLUDE_xTimerPendFunctionCall  0

/*
 *                                           中断相关配置
 */
 
#ifdef __NVIC_PRIO_BITS
    #define configPRIO_BITS             __NVIC_PRIO_BITS
#else
    #define configPRIO_BITS             (4)
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY    15                  //中断最低优先级
//系统可管理的最高中断优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5
/* This is the raw value as per the Cortex-M3 NVIC.  Values can be 255*/
#define configKERNEL_INTERRUPT_PRIORITY 		255
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!*/
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	191 /* equivalent to 0xb0, or priority 11. */


/* This is the value being used as per the ST library which permits 16
priority values, 0 to 15.  This must correspond to the
configKERNEL_INTERRUPT_PRIORITY setting.  Here 15 corresponds to the lowest
NVIC value of 255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY	15

#define xPortPendSVHandler  PendSV_Handler      //挂起中断,进行任务切换
#define vPortSVCHandler     SVC_Handler         //实现跳转到第一个任务的中断

#endif /* FREERTOS_CONFIG_H */

(11)打开stm32f103x_it.c文件,注释掉已经实现的中断函数PendSV_Handler和SVC_Handler,修改SysTick_Handler内容为以下

extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{
    #if (INCLUDE_xTaskGetSchedulerState == 1)
        if( xTaskGetSchedulerState() != taskSCHEDULER_NOT_SATRTED)
        {
    #endif
            xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState == 1)
        }
    #endif
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1522133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

layui2.9.7-入门初学

下载:https://layui.dev/ 下载后解压: 在hbuider中新建一个项目 将如上解压好的文件打开,复制如下到项目中 写案例,基础学习通之前的bootstrap 那样,挨个相中哪个就测试哪个,在这里不再重复罗列&#x…

刷题日记——三种方法秒杀《最大子串和》(厦大机试)

题目 分析——暴力 两个for循环&#xff0c;计算每一种子序&#xff08;连续&#xff09;和的值&#xff0c;找到最大时的自序起点和终点&#xff0c;输出即可 代码 #include <cstdio> #include <map> #include <string> #include <cmath> #include…

2024-03-14 Android app runOnUiThread 函数,它的作用是让一个Runnable对象在主线程(UI线程)上运行。

一、看到别人app有这么一个runOnUiThread 函数用法。 二、在Android中&#xff0c;runOnUiThread 是一个非常重要的方法&#xff0c;它的作用是让一个Runnable对象在主线程&#xff08;UI线程&#xff09;上运行。在Android中&#xff0c;主线程是负责更新UI的线程&#xff0c;…

StarRocks面试题及答案整理,最新面试题

StarRocks 的 MV&#xff08;物化视图&#xff09;机制是如何工作的&#xff1f; StarRocks 的物化视图&#xff08;MV&#xff09;机制通过预先计算和存储数据的聚合结果或者转换结果来提高查询性能。其工作原理如下&#xff1a; 1、数据预处理&#xff1a; 在创建物化视图时…

JOSEF约瑟 TQ-100同期继电器 额定直流电压220V 交流电压100V±10V

TQ-100型同期继电器 TQ-100同期继电器 ​ l 应用 本继电器用于双端供电线路的自动重合闸和备用电源自投装置中&#xff0c;以检查线路电压与母线电压的 相位差和幅值差。 2 主要性能 2 1采用进口集成电路和元器件构成&#xff0c;具有原理先进、性能稳定、可靠性高、动作值精…

电脑那个部件坏了或者是哪个软件需要修复来看价钱

电脑维修价格表是多少&#xff1f; 价格取决于计算机的哪个部分损坏或哪个软件需要修复。 由于电脑中的部件非常多&#xff0c;而且会以各种奇怪的方式出现问题&#xff0c;下面我们就来看看具体的充电方法。 电脑维修价格表&#xff1a; 1. 重新安装系统。 安装XP系统通常需…

双指针、bfs与图论

1238. 日志统计 - AcWing题库 import java.util.*;class PII implements Comparable<PII>{int x, y;public PII(int x, int y){this.x x;this.y y;}public int compareTo(PII o){return Integer.compare(x, o.x);} }public class Main{static int N 100010, D, K;st…

XCode打包IOS应用发布App Store和Ad Hoc测试

文章目录 零、前置说明一、创建本地证书二、配置描述文件2.1 配置certificates2.1.1 配置证书2.1.2 安装cer证书2.1.2.1 打包机器和生成证书同机器2.1.2.2 打包机器和生成证书不同机器 2.2 创建Identifiers2.3 配置Devices2.4 配置Profiles2.4.1 配置生产Profile2.4.2 配置开发…

MATLAB:拟合与插值

一、关于多项式的基本操作 若要求非线性方程的根&#xff0c;则采用fzero, fminbnd函数 二、多项式拟合 clc, clear x0:0.2:10; y0.25*x20*sin(x); plot(x,y,k.,MarkerSize,15) grid on; hold on [p1,s1,mu1]polyfit(x,y,3); %3阶多项式拟合 y1polyval(p1,x,s1,mu1); [p2,s…

JAVA---学生管理系统

遍历字符串 ArrayList学习&#xff1a;

git:码云仓库提交以及Spring项目创建

git&#xff1a;码云仓库提交 1 前言 码云访问稳定性优于github&#xff0c;首先准备好码云的账户&#xff1a; 官网下载GIT&#xff0c;打开git bash&#xff1a; 查看当前用户的所有GIT仓库&#xff0c;需要查看全局的配置信息&#xff0c;使用如下命令&#xff1a; git …

关于数据通信知识的补充——第二篇

目录 四.二层交换机 5.实现不同vlan通信的原理 方法一&#xff1a;路由器网关 方法二&#xff1a;单臂路由 方法三&#xff1a;三层交换机 五.三层路由技术 &#xff08;1&#xff09;直连路由 &#xff08;2&#xff09;静态路由 &#xff08;3&#xff09;动态路由 …

220平现代风装修设计亮点分享,福州·名城银河湾。福州中宅装饰,福州装修

福州名城银河湾&#xff0c;220平现代风装修案例分享&#xff0c;以下是对这些设计亮点的详细分析&#xff1a; ①客厅木饰面背景墙&#xff0c;搭配灰橙撞色皮质沙发 客厅的木饰面背景墙与撞色皮质沙发的搭配&#xff0c;不仅提供了温馨舒适的氛围&#xff0c;还为空间增添了…

2核4G云服务器能支持多少人同时访问?性能测评来了

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

零知识玩转AVH(7)—— 门槛任务(2)所遇错误及解决(1)

接前一篇文章&#xff1a;零知识玩转AVH&#xff08;6&#xff09;—— 门槛任务&#xff08;1&#xff09;源码下载、编译及运行 上一回说到完成门槛任务 https://github.com/ArmDeveloperEcosystem/Paddle-examples-for-AVH &#xff08;推荐&#xff0c;内含 ML 视觉用例&am…

如何在Tomcat中的webapp中手动发布

这里写目录标题 首先进入Tomcat文件夹进入webaaps中,编写Java代码最后进入浏览器打开就看可以进入这个界面了 首先进入Tomcat文件夹 如图: 进入webaaps中, 编写Java代码 最后进入浏览器打开 就看可以进入这个界面了

【Spring Boot】创建你的第一个 Spring Boot 应用

创建你的第一个 Spring Boot 应用 1.环境配置2.步骤详解3.项目结构分析3.1 入口类 DemoApplication3.2 控制器 PathVariableController3.3 控制器 BasicController3.4 模型 User 4.运行 Spring Boot 目前已经成为了 Java 开发领域的框架范式。本篇博客&#xff0c;我将带领大家…

DataGrip 面试题及答案整理,最新面试题

DataGrip的数据库兼容性和多数据库支持如何实现&#xff1f; DataGrip实现数据库兼容性和多数据库支持的方式包括&#xff1a; 1、广泛的数据库支持&#xff1a; DataGrip支持多种数据库&#xff0c;包括但不限于MySQL, PostgreSQL, SQL Server, Oracle, SQLite, 和MongoDB&a…

前端学习之css选择器--基本选择器、关系选择器、属性选择器、复合选择器、伪类选择器

目录 基本选择器 结果 关系选择器 结果 父子关系 祖先后代关系 相邻兄弟关系 兄弟关系 ​编辑 属性选择器 结果 复合选择器 结果 伪类选择器 结果 伪类选择器-操作标签 结果 未访问 访问后 悬停 基本选择器 <!DOCTYPE html> <html lang"en"…

Java八股文(Git)

Java八股文のGit Git Git Git 是什么&#xff1f;它有什么作用&#xff1f; Git 是一种分布式版本控制系统&#xff0c;用于管理源代码的变更和追踪。 它可以记录文件更改的历史&#xff0c;帮助多人协同开发&#xff0c;并提供了回滚、分支管理等功能。 Git 和 SVN&#xff0…