(二)移植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){#endifxPortSysTickHandler();#if (INCLUDE_xTaskGetSchedulerState == 1)}#endif
}

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

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

相关文章

代码随想录阅读笔记-哈希表【四数相加II】

题目 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间…

Formate函数的一般使用

Program Project2;{$APPTYPE CONSOLE}UsesSysUtils;Varnum: Integer;r1: Real;BeginRead(num, r1);Writeln(Format(%d 绝对值%%d:%d, [num, abs(num)]));Writeln(Format(%u 绝对值%%u:%u, [num, abs(num)]));Writeln(Format(%f 参数为浮点数,…

前后端分离:现代Web开发的协作模式

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

el-cascader修改样式(不影响全局)

当用/deep/想像往常一样修改,会发现不生效,原因在于这个组件和div#app同级了,如果去掉scoped,是最简单的方法,当然,为了不影响全局我们当然不能这么做。 以下是步骤: 1.我们查看组件属性&…

镜像制作实战篇

“ 在失控边缘冲杀为,最终解脱” CMD与EntryPoint实战 EntryPoint 与 CMD都是docker 镜像制作中的一条命令,它们在概念上可能有些相似,但在使用中,两者是有明显的区别的。比如,执行一个没有调用EntryPoint、CMD的容器会…

Rust基础知识讲解

Rust 的背景和设计理念 Rust 是一种系统编程语言,旨在提供高性能、内存安全和并发性。它由 Mozilla 研究院开发,第一个正式版本(1.0)发布于 2015 年。Rust 的设计融合了静态类型语言的性能和安全性,以及现代语言的便利…

#QT(事件--快捷键保存文件)

1.IDE:QTCreator 2.实验:QEvent,QMouseEvent,QKeyEvent。 在上一个文本编辑器的基础上实现快捷键"ctrls"保存文件。 3.记录 (1)查看QEVENT的有效事件 (2) 所有时间均继承于QEvent,任…

微信小程序《简单、快速上手的微信小程序音乐播放器》+源代码+文档说明

文章目录 源代码下载地址项目介绍项目功能使用方法界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 首页:歌曲歌手搜索,轮播图,各大榜单,热门歌单 正在播放: 当前播放歌曲展示…

MySQL查询结果竖列转列为字段:深入探讨pivot操作与应用实践

在数据分析和报表生成过程中,我们经常需要将MySQL查询结果中原本竖直排列的数据转换为横向的列,也就是常说的“行列转换”或“透视(pivot)”操作。MySQL本身并未内置像Excel那样的Pivot Table功能,但这并不妨碍我们通过SQL语句的巧妙构造实现相同的效果。本文将深入探讨My…

Parade Series - Web Streamer Low Latency

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse [monitor] listrtsp00,rtsp01,rtsp02 timeout30000 [rtsp00] typelocal deviceSurface Camera Front schemartsp ip127…

【C语言】strcpy与strncpy函数的使用和模拟实现

一.strcpy的使用与模拟实现 char* strcpy(char * destination, const char * source ); 使用注意事项: • 源字符串必须以 \0 结束。 • 会将源字符串中的 \0 拷贝到目标空间。 • 目标空间必须足够大,以确保能存放源字符串。 • 目标空间必须可修改。…

如何从不同维度对服务进行拆分

1.压力模型 高频高并发 商品详情页 低频突发流量 如秒杀 批量上架 2.主链路规划 不可缺少的环节 如果缺少了就无法形成完整的服务 如图营销计算就是一个服务业务 3.领域模型拆分DDD 4.用户群体拆分 2C 2B

【.net/.net core】使用System.Web.HttpUtility.UrlDecode处理web请求编码问题

问题场景:将数据已JSON字符串写入请求内容后,在接收端接收数据时,数据内容为URL编码后的内容,需要先将接收的字符串数据URL解码后才可转换为数据对象 解决办法:使用System.Web.HttpUtility.UrlDecode(string s)方法对…

自恋型人格如何调整

目录 1. 假期后无法快速投入工作,走不出被需求的陷阱1.1 与他人分享对调节自恋型人格有何帮助1.2 自恋型人格的一起其他问题1. 假期后无法快速投入工作,走不出被需求的陷阱 感受到被需要和价值的重要性是人之常情,尤其对于自恋型性格的人来说,这种感觉可能会更加强烈。 假…

CCF CSP试题编号: 202312-2试题名称: 因子化简

题目中提到关键词素数 我们可以尝试求一下1000以内的素数 足以表示数据 int a[1000]{0}; a[0]a[1]1;for(int i3;i<1000;i){for(int j2;j<i;j){if(i%j0){a[i]1;}}}for(int i0;i<1000;i){if(a[i]!1)cout<<i<<",";} 将素数存入数组 即可以按照题…

爬虫基本原理介绍、实现以及问题解决

爬虫基本原理介绍、实现以及问题解决 一、爬虫的意义 1. 前言 爬虫作为网络数据采集的重要工具&#xff0c;在当今互联网时代具有不可替代的作用。通过爬虫&#xff0c;我们可以获取到丰富的网络数据&#xff0c;用于各种用途&#xff0c;包括数据分析、业务决策、舆情监测等…

springboot整合swagger,postman,接口规范

一、postman介绍 1.1概述 工具下载 Postman&#xff08;发送 http 请求的工具&#xff09; 官网&#xff08;下载速度比较慢&#xff09;&#xff1a;Download Postman | Get Started for Free 网盘下载&#xff1a;百度网盘 请输入提取码 1.2Http 请求格式 请求地址请求方法状…

VsCode 配置go开发环境之下载go tools

ctrl shift P 选择 go install/update tools&#xff0c;下载go tools 报错&#xff0c; 提升dial err。 将GOPROXY 和 GOSUMDB 按照如下配置&#xff0c;重启IDE即可成功下载 set GOPROXYhttps://goproxy.cn set GOSUMDBoff

jupyter中pip安装包会安装到别的环境。

文章目录 1. 查看jupyter当前环境和默认环境的路径和python版本2.安装包到正确的环境 如果你在 Jupyter Notebook 中使用 pip 安装包&#xff0c;它默认会将包安装到 Jupyter Notebook 所在的Python 环境。这可能会导致安装的包与你期望的环境不匹配。 1. 查看jupyter当前环境和…

麒麟系统Redis7.2哨兵集群部署

redis哨兵集群部署 1、原理 Redis 哨兵模式是指在 Redis 集群中,有一组专门的进程(即哨兵进程)负责监控主节点和从节点的状态,并在发现故障时自动进行故障转移,以保证 Redis 集群的高可用性。 Redis 提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵进程会周期性地向主…