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

FreeRTOS移植

1.在RTOS官网下载源码

FreeRTOS™ - FreeRTOS™

2.这里我以我的板子为例​​​​​​stm32f103精英开发板V2 — 正点原子资料下载中心 1.0.0 文档

资料可以从这个链接里面下载

下载完成之后我们按照他们说的移植到内存管理实验上

1.移植FreeRTOS源码

这个是我们准备的基础工程--实验33

在这个实验33的Middlewares里面新建一个叫FreeRTOS的文件夹

移植RTOS源码

在这个文件夹中移植入FreeRTOS-Kernel的代码

移植完成如下图所示

删除portable中的部分文件剩下这三个

通过RVDS来实现软件和硬件的链接

然后在工程里面新建两个分组

在这两个目录下添加我们刚刚在Middlewares中克隆的源码

添加完成如下,因为我们的是M3的内核所以选择就很固定啦

下一步就是要添加头文件路径啦添加下面两个头文件

添加FreeRTOSConfig.h文件

在资料文件中扩展例程移植FreeRTOS中的路径如下

F:\BaiduDownload\【正点原子】精英STM32F103开发板 V2-资料盘(A盘)\4,程序源码\4,程序源码\3,扩展例程\2,FreeRTOS例程\2,FreeRTOS例程\FreeRTOS实验例程2 FreeRTOS移植实验\User

里面的FreeRTOSconfig.h文件

粘贴在这个路径上

F:\BaiduDownload\【正点原子】精英STM32F103开发板 V2-资料盘(A盘)\4,程序源码\4,程序源码\2,标准例程-HAL库版本\2,标准例程-HAL库版本\实验33 内存管理实验\User

2.修改文件源码

1.修改sys.h文件

设置成支持OS

2.修改usart.c文件

删除掉加OSIntEnter()和OSIntExit()两个函数,因为只有使用裸机开发的时候需要使用到这两个函数,添加下面这些代码

void USART_UX_IRQHandler(void){HAL_UART_IRQHandler(&g_uart1_handle); /*调用HAL库中断处理公用函数*/
while(HAL_UART_Receive_IT(&g_uart1_handle,(uint8_t *)g_rx_buffer,RXBUFFERSIZE) != HAL_OK)/*重新开启中断并接收数据*/{/*如果出错会卡死在这里*/}}

将串口1中断服务函数更改为如图所示

并且删除图中所选部分,这部分是于µC/OS使用的,FreeRTOS没有使用这部分

3.修改delay.c文件

大致可分为三个步骤:删除适用于µC/OS但不适用于FreeRTOS的相关代码、添加 FreeRTOS的相关代码、修改部分内容

1.删除适用于µC/OS但不适用于FreeRTOS的相关代码
1.删除3个宏定义

delay_osrunning :用于表示OS当前是否正在运行,以决定是否可以使用相关函数 delay_ostickspersec :用于表示OS设定的时钟节拍,delay_init将根据这个参数来初始化systick delay_osintnesting :用于表示OS中断嵌套级别,因为中断里面不可以调度,delay_ms使用该参数来决定如何运行

2.删除三个函数

delay_osschedlock :用于锁定OS任务调度,禁止调度

delay_osschedunlock :用于解锁OS任务调度,重新开启调度

delay_ostimedly :用于OS延时,可以引起任务调度.

3.在systick_handler函数前面加上这句

4.修改systick_handler函数
void SysTick_Handler(void){HAL_IncTick();/*OS开始跑了,才执行正常的调度处理*/if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED){xPortSysTickHandler();}
}
5更改delay_init
void delay_init(uint16_t sysclk){#if SYS_SUPPORT_OSuint32_t reload;#endifSysTick->CTRL=0;HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);g_fac_us=sysclk/8;#if SYS_SUPPORT_OSreload=sysclk/8;/*使用configTICK_RATE_HZ计算重装载值*configTICK_RATE_HZ在FreeRTOSConfig.h中定义*/reload*=1000000/configTICK_RATE_HZ;/*删除不用的g_fac_ms相关代码*/SysTick->CTRL|=1<<1;SysTick->LOAD=reload;SysTick->CTRL|=1<<0;#endif}
6.更改delay_us
void delay_us(uint32_t nus){uint32_t ticks;uint32_t told,tnow,tcnt=0;uint32_t reload=SysTick->LOAD;/*删除适用于μC/OS用于锁定任务调度器的自定义函数*/ticks=nus*g_fac_us;told=SysTick->VAL;while(1){tnow=SysTick->VAL;if(tnow!=told){if(tnow<told){tcnt+=told-tnow;}else{tcnt+=reload-tnow+told;}told=tnow;if(tcnt>=ticks){break;}}}/*删除适用于μC/OS用于解锁任务调度器的自定义函数*/}
7.更改delay_ms
void delay_ms(uint16_t nms){uint32_t i;for(i=0;i<nms;i++){delay_us(1000);}}
8.将#include "os.h"改成
#include"FreeRTOS.h"
#include"task.h"

9.这时我们就完成啦sys下面的配置

4.修改中断配置文件

加入三个宏开关将原来的东西给删除掉

#if (!SYS_SUPPORT_OS)void SVC_Handler(void){}
#endif
#if (!SYS_SUPPORT_OS)voidPendSV_Handler(void){}
#endif
#if(!SYS_SUPPORT_OS)void SysTick_Handler(void){HAL_IncTick();
}
#endif
5.最后要修改的文件FreeRTOSConfig.h里面注:需要编译之后

3.编译发现有问题

是因为我电脑上有两个版本的编译器ARMCC和ARMCLANG

ARMCLANG不会向下兼容导致编译不通过

解决方案在Project → Manage → Project Items... → Folders/Extensions里面

使能我们的ARMCC,然后点击OK不使能ARMCLANG

因为我们使用的STM32F1系列的可能会比较早一点,所以支持比较早的编译器

修改之后出现这个还是出现这个问题

这是为啥呀?

http://www.dtcms.com/a/558790.html

相关文章:

  • 做传媒网站公司建设银行签名通在网站哪里下载
  • 做网站赚钱全攻略专门做进口产品的网站6
  • 北京网站建设推荐安徽秒搜科技上海大型网站设计公司
  • 有限公司网站建设 中企动力佛山图书馆网站建设建议
  • 杭州网站制作机构电子政务网站建设的挑战
  • 阿里巴巴seo站内优化方法专业做政法ppt的网站
  • Prometheus详解
  • 做网站有用吗中国职业培训在线官网
  • 好看英文网站服装设计手稿设计图
  • 网站建设实训心得体会300字企业网站的建立流程的第一步是
  • 林州网站建设公司怎么做公司销售网站
  • NFS(网络文件共享)
  • tex中ifthen宏包的介绍
  • 个人网站建设开题报告做网站协议书
  • wordpress网站更换空间开发软件需要多少钱k
  • 企业网站建设流程步骤美工素材网站
  • 杨洋亮相梦幻西游品牌活动 带队出征尽展风采
  • 网站怎么做代码优化破解php网站后台密码
  • 制作好的网站必须申请网站建设和成本
  • 网站建设产品分割国外域名注册哪个网站好
  • JS 请求处理:从 “回调地狱” 到 “并发控制”,我封装了能复用 10 个项目的请求工具
  • VSCode中Kilo Code插件集成终端输出中文乱码问题解决
  • 影响网站排名的因素 权重网站建设教程视频百度云
  • 第三十四篇:对象的“自我介绍”:__str__和__repr__魔法方法的区别与实现
  • 11-MySQL事务管理
  • 36氪国外做网站微信营销模式有哪些
  • seo网站优化推广教程做简单的html网站
  • ftp怎么做网站南宁建站模板大全
  • 中国空间站拒绝10国名单什么是线上推广
  • 网站开发部门叫什么wordpress右浮动