(二)移植FreeRTOS到STM32中

一、概念

(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
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode2. 两数相加(Java)

题目: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这…

USB打印机改网络打印机

解决传统SMB缺陷可跨平台设备使用。 1、安装deepin 如何安装 – 深度科技社区 2、配置IP地址 vi /etc/network/interfaces && systemctl restart networking 3、安装程序上传到服务器并解压。运行0Dinstalld目录下文件 sh 0Dinstalld/0installdd.sh http://XX.XX.XX…

肝了三天,完成了AIGC工具网站大全,建议收藏再看

说是肝了三天,其实远远不止,前前后后,从资料搜集到最后整理成文,有近一个月了,大家看在整理不易的份上,给点个赞吧,不要光顾着收藏呀! 国内网站 AIGC 导航 https://www.aigc.cn 网…

visual studio2019项目中引入头文件失效问题的解决

这几天把项目整理一下,但在引入头文件过程中非常曲折。 项目本身写好了可以运行,但是项目结构是这样的: 所以想把功能模块化,同一类协议功能放在一起。 于是建包,创建文件,导入头文件: 在新…

HTML基础:了解CSS的3种创建方法

你好,我是云桃桃。 CSS,即层叠样式表(Cascading Style Sheets),是一种用于描述网页样式和布局的标记语言。它通过定义样式规则来控制网页元素的外观和排版,包括文字大小、颜色、边距、背景等,从…

3D Occupancy 预测冠军方案:FB-OCC

文章结尾有视频和连接 背景知识 Occupancy 更像是一个语义分割任务,但是它是 3D 空间的语义分割它的我们对 Occupancy 分自己的期望是它能够具有通用的这种目标建模的能力,才能够不是不受制于这种目标框这种几何的矩形的这种约束而能够建模任意形状的这…

欧科云链:ETH Dencun升级倒计时,哪些数据需要重点关注?

2024年3月13日 21:55(epoch 269,568),以太坊将完成坎昆-德内布升级 (Dencun 升级),OKLink 专题数据页传送门 👉 oklink.com/eth/dencun-upgrade 此次升级的主要目标是提升 Layer 2 网络的可扩展…

特殊文本文件、日志技术

特殊文件 为什么要用这些特殊文件? 存储多个用户的:用户名、密码 特殊文件:Properties属性文件 特点: 都只能是键值对键不能重复文件后缀一般是.properties结尾的 作用:存储一些有关系的键值对数据 Properties 是一个Map集合(键…

基础-笔试题2

1、int a[10]{1,2,3,4,5,6,7,8,9,0}; int *p&a[1]; 则p[6]等于_ 答:8 ,考察数组和指针的基本用法; 2、整数数组清零的方法? bzero(),memset()。 memset() 是C语言标准库中的一部分,用于将内存区域设置…

leetcode刷题日记之串联所有单词

题目描述 解题思路 一开始考虑的就是暴力破解,每次切片切words中字母的个数,然后根据每个词语的长度进行进一步的切片,将切出来的单词放入列表,然后每次对比一次,如果存在,就从原来的列表中,删…

LeetCode Python - 58. 最后一个单词的长度

目录 题目描述解法运行结果 题目描述 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s “Hel…

Leet code 34 在排序数组中查找元素的第一个和最后一个位置

解题思路 二分查找 核心就是 先找到左端点的位置 再找到右端点的位置 二分查找整体不难 但难在细节处理 一旦处理不好就是死循环 定义rightnums.size()-1 left0 if(nums[mid] < target) 更新 left leftmid1 if(nums[mid] > target) 这里为什么要大于等于我们不…

idea error java:compilation failed:internal java compiler error

idea中编译运行maven项目报错如下 idea error java:compilation failed:internal java compiler error 尝试如下操作 注意&#xff1a;jdk8 需要设置4个地方 1.首先打开File->Project Structure中的Project&#xff0c;将SDK和language level都设置一致&#xff0c;如下…

【LeetCode热题100】148. 排序链表(链表)

一.题目要求 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输…

日期与时间(Java)

文章目录 日期与时间&#xff08;Java&#xff09;一、JDK8之前的1.1 Date1.2 SimpleDateFormat1.3 Calendar 二、 JDK8之后的2.1 LocalDate、LocalTime和LocalDateTime2.2 ZoneId和ZonedDateTime2.3 Instant2.4 DateTimeFormatter2.4 Period和 Duration &#x1f389;写在最后…

数据结构:详解【链表】的实现(单向链表+双向链表)

目录 一&#xff0c;前言二 &#xff0c;有关链表的概念&#xff0c;结构和分类三&#xff0c;无头单向非循环链表&#xff08;单链表&#xff09;1.单链表的功能2.单链表功能的实现3.完整代码 四&#xff0c;带头双向循环链表&#xff08;双链表&#xff09;1.单链表与双链表的…

YOLOv9改进策略:注意力机制 | 归一化的注意力模块(NAM)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; NAM作为一种高效且轻量级的注意力机制。采用了CBAM的模块集成并重新设计了通道和空间注意子模块。 yolov9-c-NAMAttention summary: 965 layers, 51000614 parameters, 51000582 gradients, 238.9 GFLOPs 改…

Java基础 - 9 - 集合进阶(二)

一. Collection的其他相关知识 1.1 可变参数 可变参数就是一种特殊形参&#xff0c;定义在方法、构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型…参数名称; 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&#xff1b;可以传一个或者同时传多个数据给…

html中如何让网页禁用右键禁止查看源代码

在网页中&#xff0c;辛辛苦苦写的文章&#xff0c;被别人复制粘贴给盗用去另很多站长感到非常无奈&#xff0c;通常大家复制都会使用选取右键复制&#xff0c;或CTRLC等方式&#xff0c;下面介绍几种禁止鼠标右键代码&#xff0c;可减少网页上文章被抄袭的几率&#xff0c;当然…

Day38:安全开发-JavaEE应用SpringBoot框架MyBatis注入Thymeleaf模版注入

目录 SpringBoot-Web应用-路由响应 SpringBoot-数据库应用-Mybatis SpringBoot-模版引擎-Thymeleaf 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…