当前位置: 首页 > news >正文

基于STM32103移植FreeRTOS

目录

一、FreeRTOS协议栈下载

二、准备工程文件与协议代码

三、移植FreeRTOS协议栈


一、FreeRTOS协议栈下载

1、官网下载

FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensionshttps://www.freertos.org/zh-cn-cmn-s/

2、网盘下载(访问密码:1666)

二、准备工程文件与协议代码

三、移植FreeRTOS协议栈

(FreeRTOS协议栈内容请自行百度,此处只是应用)

1、将\FreeRTOSv202212.00\FreeRTOS\Source内协议代码均复制到工程文件内新建文件夹“FreeRTOS”中

2、根据需求,删除 FreeRTOS\portable 内多余文件(也可不删,只为了精简工程文件的大小),最后保留文件如下

  • Keil:基于Keil使用的底层接口文件,指向RVDS
  • MemMang:内存管理选择
  • RVDS:底层接口文件需要实际修改的文件
  • readme:内核的基本介绍

3、在工程内添加协议栈

核心文件:

来源于 FreeRTOSv202212.00\FreeRTOS\Source 的C文件

底层接口:

  • port:来源于 FreeRTOSv202212.00\FreeRTOS\Source\portable\RVDS\ARM_CM3
  • heap_4:来源于 FreeRTOSv202212.00\FreeRTOS\Source\portable\MemMang

4、编译

报错:缺失文件 "FreeRTOSConfig.h"

5、补充文件

从例程中直接复制 "FreeRTOSConfig.h" 使用

6、重复编译

编译通过,移植完成。

四、示例演示

1、要实际使用FreeRTOS,需要提供滴答计时器作为OS系统刷新中断

#include "HW_SysTick_Interrupt.h"
#include "stm32f10x.h"
#include "FreeRTOS.h"					//os 使用	 
#include "task.h"extern void xPortSysTickHandler(void);static u8  fac_us=0;							//us延时倍乘数			   
static u16 fac_ms=0;							//ms延时倍乘数,在ucos下,代表每个节拍的ms数/* 功    能:	滴答定时器 - 初始化* 输    入:	* 输    出:	* 返    回:* 备    注:	此处启用中断版本,故默认使用 1/1000 = 1ms 中断*/
void HW_SysTick_Interrupt_Init(void)
{	u32 reload;SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);	//选择外部时钟  HCLK/8fac_us=SystemCoreClock/1000000;						//为系统时钟的1/8  reload=SystemCoreClock/1000000;						//每秒钟的计数次数 单位为K	   reload*=1000000/configTICK_RATE_HZ;					//根据delay_ostickspersec设定溢出时间//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右	fac_ms=1000/configTICK_RATE_HZ;						//代表OS可以延时的最少单位	   SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;   			//开启SYSTICK中断SysTick->LOAD=reload; 								//每1/delay_ostickspersec秒中断一次	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;   			//开启SYSTICK  }///* 功    能:	滴答定时 - 中断
// * 输    入:	
// * 输    出:	
// * 返    回:
// * 备    注:	OS初始化中断1000Hz
// */
//void HW_SysTick_Interrupt_Handler(void)
//{
//	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
//	{
//		xPortSysTickHandler();
//	}		
//}/* 功    能:	延时nus* 输    入:	* 输    出:	* 返    回:* 备    注:	*/
void delay_us(u32 nus)
{		u32 ticks;u32 told,tnow,tcnt=0;u32 reload=SysTick->LOAD;					//LOAD的值	    	 ticks=nus*fac_us; 							//需要的节拍数	  		 told=SysTick->VAL;        					//刚进入时的计数器值while(1){tnow=SysTick->VAL;	if(tnow!=told){	    if(tnow<told)tcnt+=told-tnow;		//这里注意一下SYSTICK是一个递减的计数器就可以了.else tcnt+=reload-tnow+told;	    told=tnow;if(tcnt>=ticks)break;				//时间超过/等于要延迟的时间,则退出.}  };								    
}/* 功    能:	延时nms* 输    入:	* 输    出:	* 返    回:* 备    注:	*/
void delay_ms(u16 nms)
{	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)	//如果OS已经在跑了,并且不是在中断里面(中断里面不能任务调度)	    {		 if(nms>=fac_ms)							//延时的时间大于OS的最少时间周期 { vTaskDelay(nms/fac_ms);		//OS延时}nms%=fac_ms;							//OS已经无法提供这么小的延时了,采用普通方式延时    }delay_us((u32)(nms*1000));					//普通方式延时  
}/* 功    能:	延时nms* 输    入:	* 输    出:	* 返    回:* 备    注:	此处启用中断版本,故默认使用 1/1000 = 1ms 中断*/
void delay_xms(u32 nms)
{u32 i;for(i = 0;i < nms;i++)delay_us(1000);
}

编译报警

需要开启(置一)

再次编译正常

2、main函数中创建开始任务 start_task

3、开始任务(start_task)中创建其他任务

4、执行其他任务

5、设置头文件,以及配置好任务参数后,编译通过。

6、实际运行后,在 vTaskStartScheduler (开启任务调度) -> xPortStartScheduler (开启时钟) -> prvStartFirstTask (开启第一个任务) 中跳到 HardFault_Handler(硬件错误)

7、排查错误

为中断异常导致的,FreeRTOS 使用的中断如下,需要修改中断

8、修改中断方法

①、修改启动文件,直接映射到port文件中

②宏定义

需要删除 stm32f10x_it 中的中断入口,避免二定义

9、编译运行后,预期正常

项目代码(访问密码:1666)


 

相关文章:

基于STM32103移植FreeRTOS

目录 一、FreeRTOS协议栈下载 二、准备工程文件与协议代码 三、移植FreeRTOS协议栈 一、FreeRTOS协议栈下载 1、官网下载 FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensionshttps://www.freertos.or…...

docker compose一键部署lnmt环境

创建docker compose 目录 [rootlocalhost ~]# mkdir -p /compose_lnmt 编写nginx的dockerfile文件 创建目录 [rootlocalhost compose_lnmt]# mkdir -p nginx 编写nginx配置文件 [rootlocalhost nginx]# vim nginx.conf user root; #运行身份#nginx自动设置进程…...

Eeny Meeny Moo

Eeny Meeny Moo 题目描述输入输出格式输入格式输出格式 输入输出样例输入样例输出样例 正确解法A C 代码 题目描述 你肯定有过这样的经验&#xff0c;那就是当很多一起使用网络的时候&#xff0c;网速变得很慢很慢。为了解决这个问题&#xff0c;德国的Ulm大学开发了一份意外事…...

flask---闪现/请求扩展/g对象

闪现 # 一个请求---》假设出错了---》重定向到另一个地址---》把错误信息在另一个返回中看到 错误信息放个位置----》另一个请求过来&#xff0c;去那个位置拿 # 把一些数据&#xff0c;放在某个位置---》后期可以去取出来----》取完不用删除&#xff0c;就没了 def index():s…...

Qt视频播放器

一、设置好ui界面二、打开文件槽函数1.QDir::homePath()作用介绍2.QFileDialog::getOpenFileName()介绍3.QFileInfo介绍4.player 指针解释5.打开文件槽函数完整代码 三、视频播放器初始化1.QMediaPlayer()函数2.设置时间间隔的作用3. QGraphicsScene介绍4.QGraphicsVideoItem介…...

Stable Diffusion教程(8) - X/Y/Z 图表使用

1. 介绍 这项功能可以在 文生图/图生图 界面的左下角种 “脚本” 一栏内选择 “X/Y/Z 图表” 以启用。 它创建具有不同参数的图像网格。使用 X 类型和 Y 类型字段选择应由行和列共享的参数&#xff0c;并将这些参数以逗号分隔输入 X 值 / Y 值字段。支持整数、浮点数和范围。…...

Android 获取网关 ip 和 DNS ip

参考下方 PingUtil.java 代码 import android.content.Context; import android.net.DhcpInfo; import android.net.wifi.WifiManager; import android.text.format.Formatter;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; impor…...

Docker root用户的pip使用方法

Docker下root用户 pip install XX 显示pip命令不存在 # 原始目标&#xff1a;pip install XX pip install --root-user-actionignore 【XX】# (要安装的包)参考&#xff1a;WARNING: Running pip as the ‘root‘ user can result in broken permissions Linux 中 root 与 su…...

企业新片场排名如何优化

企业新片场排名如何优化 要如何去做关键SEO&#xff1f;第一个我们要做的就是做好 SEO 关键词的选词&#xff0c;一般就是会有第一个常用的选词方法&#xff0c;第一是以常用的提问词去做&#xff0c;不实像是情人节买什么礼物&#xff0c;母亲节买什么礼物&#xff0c; 618 有…...

Database Name

概述 DB_NAME与INSTANCE_NAME DB_NAME 数据库名称&#xff0c;也就是数据库的名字标示。这里&#xff0c;数据库里可能有多个实例&#xff0c;比如RAC里的多节点&#xff0c;这多个节点是不同的实例&#xff0c;但是却有相同的名字&#xff0c;他们的 DB_NAME是相同的&#xf…...

git代码版本管理

git 文章目录 git基本使用 基本使用 在一台新的电脑上使用git 你要下载安装git, 然后把git的安装路径配到系统环境变量里 然后把这台电脑的.ssh/ id_rsa.pub里的公钥整到github里 然后在github上新建仓库&#xff0c;它会生成一些指令引导上你传本地的代码 之后就可以在终…...

k8s概念-ConfigMap

回到目录 一般用于去存储 Pod 中应用所需的一些配置信息&#xff0c;或者环境变量&#xff0c;将配置于 Pod 分开&#xff0c;避免应为修改配置导致还需要重新构建 镜像与容器。 1 创建ConfigMap #使用 kubectl create configmap -h 查看示例&#xff0c;构建 configmap 对象…...

Mybatis 实体类属性名和表中字段名不一致怎么处理

一. 前言 最近耀哥有学生出去面试&#xff0c;被问到 “Mybatis实体类的属性名和表中的字段名不一致该怎么处理&#xff1f;”&#xff0c;这其实是一个很经典的面试题&#xff0c;接下来耀哥就为大家详细解析一下这道面试题。 二. 分析 2.1 实体类和字段名不一致所带来的后果…...

CAS - 从AtomicInteger窥探CAS

Unsafe类是CAS的核心&#xff0c;由于Java方法无法直接访问底层&#xff0c;需要通过本地方法(native)来实现&#xff0c;Unsafe类相当于一个桥梁。基于Unsafe类&#xff0c;可以直接操作特定的内存数据。 我们从上一篇说CAS基本原理的时候&#xff0c;有说到一个“资源”被100…...

micro-ros IMU ML 代码

示例代码&#xff1a; #include <micro_ros_arduino.h>#include "LSM6DSOXSensor.h" #include "lsm6dsox_activity_recognition_for_mobile.h"#include <stdio.h> #include <rcl/rcl.h> #include <rcl/error_handling.h> #inclu…...

二十三种设计模式第二十四篇--访问者模式(完结撒花)

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。 通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接…...

月报总结|Moonbeam 7月份大事一览

炎炎夏日&#xff0c;Moonbeam于越南举办了线下交流会&#xff0c;在EthCC 2023和以太坊社区成员共同讨论多链应用&#xff0c;在Polkadot Decoded中分享了Moonbeam的与众不同之处。 Bear Necessities Hackathon也于本月圆满结束&#xff0c;选出了每个赛道最杰出的项目&#…...

【2023.8】docker一键部署wvp-GB28181-pro和ZLMediaKit过程全记录

安装docker 使用的操作系统是ubuntu20.04 如何在 Ubuntu 20.04 上安装和使用 Docker https://developer.aliyun.com/article/762674 docker拉取配置好的ZLMediaKIt和wvp-GB28181-pro docker pull 648540858/wvp_pro第一次运行 docker一键运行ZLMediaKIt和wvp-GB28181-pro …...

【2023】字节跳动 10 日心动计划——第四关

目录 1. 买卖股票的最佳时机2. 打家劫舍 II 1. 买卖股票的最佳时机 &#x1f517; 原题链接&#xff1a;121. 买卖股票的最佳时机 假设在第 i i i 天卖出股票可获得最大利润&#xff0c;那么买入股票必然是在前 i − 1 i-1 i−1 天中的某一天。更进一步&#xff0c;买入股票应…...

数据库与数据仓库的区别及关系

数据库与数据仓库的区别及关系 数据库数据仓库异同差异联系例子 数据库 数据库是结构化信息或数据的有序集合&#xff0c;一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…...

计算机毕业设计:Python全国天气数据可视化与预测系统 Django框架 可视化 随机森林 爬虫 中国天气网 机器学习 深度学习(建议收藏)✅

1、项目介绍 技术栈 采用 Python 语言开发&#xff0c;基于 Django 框架搭建后端服务&#xff0c;使用 MySQL 数据库进行数据存储&#xff0c;通过 requests 爬虫技术从中国天气网采集历史天气数据&#xff0c;前端利用 Echarts 实现数据可视化展示&#xff0c;并运用机器学习…...

FireRedASR-AED-L环境配置:CUDA 11.8 + PyTorch 2.1.2 + Transformers 4.41一键集成

FireRedASR-AED-L环境配置&#xff1a;CUDA 11.8 PyTorch 2.1.2 Transformers 4.41一键集成 1. 项目简介 FireRedASR-AED-L是一个基于1.1B参数大模型开发的本地语音识别工具&#xff0c;专为中文、方言和中英混合语音识别而设计。这个工具最大的特点是完全本地运行&#xf…...

MiniCPM-V-2_6数据中心:机柜图识别+温控与负载均衡建议

MiniCPM-V-2_6数据中心&#xff1a;机柜图识别温控与负载均衡建议 1. 项目背景与价值 在现代数据中心运维中&#xff0c;机柜设备识别和温度监控是两项关键任务。传统方法需要人工巡检和手动记录&#xff0c;效率低下且容易出错。MiniCPM-V-2_6作为先进的视觉多模态模型&…...

OpenClaw年终总结:我的Qwen3-32B自动化效率提升报告

OpenClaw年终总结&#xff1a;我的Qwen3-32B自动化效率提升报告 1. 为什么选择OpenClawQwen3-32B组合 去年这个时候&#xff0c;我还在为重复性的文档整理工作熬夜到凌晨两点。直到在星图镜像广场发现这个Qwen3-32B优化镜像&#xff0c;配合OpenClaw搭建了本地自动化工作流&a…...

第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--多策略混合算法

前言 全球校园人工智能算法精英大赛”是江苏省人工智能学会举办的面向全球具有正式学籍的全日制高等院校及以上在校学生举办的算法竞赛。其中的算法巅峰赛属于产业命题赛道&#xff0c;这是第3赛季&#xff0c;这次优化题的主题是 “碳中和”。 回顾 第七届全球校园人工智能算…...

智能相册管理:OpenClaw+Phi-3-vision-128k-instruct自动分类家庭照片

智能相册管理&#xff1a;OpenClawPhi-3-vision-128k-instruct自动分类家庭照片 1. 为什么需要智能相册管理&#xff1f; 每次打开手机相册&#xff0c;看到上万张杂乱无章的照片时&#xff0c;我都感到一阵头疼。孩子的成长瞬间、家庭旅行、朋友聚会全都混在一起&#xff0c…...

FISCO BCOS节点扩容实战指南:从原理到操作全解析

引言:为什么需要节点扩容? 在区块链网络运营过程中,“如何在不中断服务的情况下扩展网络处理能力?”“能否实现节点的平滑扩容与缩容?”“怎样确保新节点快速同步数据?”——这些问题困扰着许多区块链运维人员。FISCO BCOS作为金融级联盟链平台,提供了完善的节点扩容机…...

OpenClaw技能市场挖掘:百川2-13B-4bits量化版适配插件精选

OpenClaw技能市场挖掘&#xff1a;百川2-13B-4bits量化版适配插件精选 1. 为什么需要专门适配百川模型的技能&#xff1f; 去年冬天第一次尝试用OpenClaw对接百川2-13B模型时&#xff0c;我遇到了一个典型问题&#xff1a;虽然模型本身运行良好&#xff0c;但很多现成的技能模…...

智谱GLM-5.1实测

智谱在GLM-5发布不到两个月后&#xff0c;迅速推出了迭代版本GLM-5.1。官方将其定位为"面向长程任务的开源第一模型"&#xff0c;核心升级方向集中在代码工程能力和长程Agent任务上——GLM-5.1能够在单次任务中独立、持续工作超过8小时&#xff0c;在SWE-Bench Pro等…...

OpenClaw自动化测试实践:gemma-3-12b-it驱动Python脚本批量执行

OpenClaw自动化测试实践&#xff1a;gemma-3-12b-it驱动Python脚本批量执行 1. 为什么选择OpenClawgemma做测试自动化&#xff1f; 上个月重构一个爬虫项目时&#xff0c;我遇到了测试脚本管理的噩梦——每次修改核心逻辑后&#xff0c;都需要手动执行十几个测试用例&#xf…...