FreeRTOS在STM32F4上移植
来源:互联网 发布:手机淘宝 卖家中心 编辑:程序博客网 时间:2024/05/17 06:13
本文是《ALIENTEK STM32F429 FreeRTOS 开发教程》第二章学习笔记
第一章笔记–FreeRTOS简介与源码下载
一、移植
1. 准备工程文件
MCU用的是STM32F429的CORE,用keli创建一个基础工程
在工程中创建一个名为FreeRTOS的文件夹
2.文件中添加源码
把FreeRTOS的源码复制到FreeRTOS文件夹里
portable文件夹中只保留 keli,MemMang,RVDS三个文件夹即可
3.工程分组中添加文件
在工程文件中新建分组FreeRTOS_CORE与FreeRTOS_PORTABLE
把相关内核.c文件添加进分组FreeRTOS_CORE
把RVDS文件夹下的ARM_CM4F中的port.c和MemMang文件夹里的heap_4.c添加进分组FreeRTOS_PORTABLE
添加FreeRTOS源码的头文件路径
4.添加FreeRTOSConfig.h文件
在FreeRTOS的官方移植工程Demo文件夹下,找到CORTEX_M4F_STM32F407ZG-SK文件夹,打开找到里面的FreeRTOSConfig.h文件
添加到自己创建的工程文件FreeRTOS文件夹下的include文件夹里
更改SystemCoreClock的条件编译条件
#ifdef __ICCARM__#include <stdint.h>extern uint32_t SystemCoreClock;#endif
改为i
#if defined(__ICCARM__) || defined(__CC_ARM) ||defined(__GUNC__)#include <stdint.h>extern uint32_t SystemCoreClock;#endif
5. 注释掉重复定义函数
在port.c和stm32f4xx_it.c两个文件中有重复定义的函数,需要注释掉stm32f4xx_it.c中的PendSV_Handler()、SVC_Handler()和Systick_Handler()三个函数
6.关闭钩子函数
复制过来的FreeRTOSConfig.h文件中默认开启了一些钩子函数,都是以Hook结尾,但并未定义,在FreeRTOSConfig.h中把configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configCHECK_FOR_STACK_OVERFLOW和MALLOC_FAILED_HOOK的宏定义改为0
7. 修改sys.h文件
将SYSTEM文件夹下的sys.h文件修改成使用OS
//0,不支持os//1,支持os#define SYSTEM_SUPPORT_OS 1 //定义系统文件夹是否支持OS
8. 修改usart.c文件
打开SYSTEM文件夹下usart.c文件,添加FreeRTOS.h头文件
#if SYSTEM_SUPPORT_OS#include "FreeRTOS.h" //os 使用 #endif
USART1的中断服务函数在使用UCOS时进出中断添加OSIntEnter()与OSIntExit(),使用FreeRTOS则不需要,故注释掉
//串口1中断服务程序void USART1_IRQHandler(void) { u32 timeout=0; u32 maxDelay=0x1FFFF;//#if SYSTEM_SUPPORT_OS //使用OS// OSIntEnter(); //#endif HAL_UART_IRQHandler(&UART1_Handler); //调用HAL库中断处理公用函数 timeout=0; while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//等待就绪 { timeout++;////超时处理 if(timeout>maxDelay) break; } timeout=0; while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1 { timeout++; //超时处理 if(timeout>maxDelay) break; }//#if SYSTEM_SUPPORT_OS //使用OS// OSIntExit(); //#endif}
9. 修改delay.c文件
打开SYSTEM文件夹里delay.c文件,重新写入所需代码
#include "delay.h"#include "sys.h"////////////////////////////////////////////////////////////////////////////////// //如果使用OS,则包括下面的头文件即可.#if SYSTEM_SUPPORT_OS#include "FreeRTOS.h" //FreeRTOS使用 #include "task.h"#endifstatic u32 fac_us=0; //us延时倍乘数#if SYSTEM_SUPPORT_OS static u16 fac_ms=0; //ms延时倍乘数,在os下,代表每个节拍的ms数#endifextern void xPortSysTickHandler(void);//systick中断服务函数,使用OS时用到void SysTick_Handler(void){ if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行 { xPortSysTickHandler(); } HAL_IncTick();}//初始化延迟函数//当使用ucos的时候,此函数会初始化ucos的时钟节拍//SYSTICK的时钟固定为AHB时钟//SYSCLK:系统时钟频率void delay_init(u8 SYSCLK){ u32 reload; HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK fac_us=SYSCLK; //不论是否使用OS,fac_us都需要使用 reload=SYSCLK; //每秒钟的计数次数 单位为K reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间 //reload为24位寄存器,最大值:16777216,在180M下,约合0.745s左右 fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延时的最少单位 SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断 SysTick->LOAD=reload; //每1/configTICK_RATE_HZ断一次 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK} //延时nus//nus:要延时的us数. //nus:0~190887435(最大值即2^32/fac_us@fac_us=22.5) 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,会引起任务调度//nms:要延时的ms数//nms:0~65535void delay_ms(u32 nms){ if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行 { if(nms>=fac_ms) //延时的时间大于OS的最少时间周期 { vTaskDelay(nms/fac_ms); //FreeRTOS延时 } nms%=fac_ms; //OS已经无法提供这么小的延时了,采用普通方式延时 } delay_us((u32)(nms*1000)); //普通方式延时}//延时nms,不会引起任务调度//nms:要延时的ms数void delay_xms(u32 nms){ u32 i; for(i=0;i<nms;i++) delay_us(1000);}
由一个初始化滴答定时器和三个延时函数组成
delay_init()完成初始化滴答定时器。FreeRTOS的系统时钟节拍由宏configTICK_RATE_HZ来设置,由于使用HAL库,而HAL库里延时函数需要滴答定时器时间周期为1ms,责FreeRTOS的系统节拍应该设置成1000HZ(即滴答定时器的中断周期为1ms)
delay_us()、delay_ms()和delay_xms()都是延时函数。
delay_ms()是对FreeRTOS中的延时函数vTaskDelay()的封装,使用时会导致任务切换;
delay_us()是us级的延时函数,os系统节拍是1ms,无法提供那么小的延时,直接使用滴答计时器的计数来延时;
delay_xms()在delay_us()的us级累加到ms级形成延时,完成ms级的延时,但不会像delay_ms()导致任务切换
10. 注释掉FreeRTOSConfig.h里的重复定义函数
注释掉FreeRTOSConfig.h里的重复定义函数SysTick_Handler()
- FreeRTOS在STM32F4上移植
- freeRTOS 在arm926ejs上的移植
- FreeRTOS在STM32上移植--详尽篇
- freertos 在arm926-ejs上的移植
- FreeRtos在RH850 D1L芯片上移植
- STM32上移植FreeRTOS
- STM32上移植FreeRTOS
- 将STemWin移植到在STM32F103RCT6上的FreeRTOS上
- FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS
- FreeRTOS 在STM32上的移植 V1.0
- FreeRTOS 在STM32上的移植 V1.0
- freeRTOS 在 BlackFin533 平台上的移植 (1)
- freeRTOS 在 BlackFin533 平台上的移植 (2)
- FreeRTOS系列第5篇---FreeRTOS在Cortex-M3上的移植
- FreeRTOS系列第5篇---FreeRTOS在Cortex-M3上的移植
- FreeRTOS在STM32F405RGT6的移植
- 神经网络移植到STM32F4上的应用
- 在stm32f4(正点原子“探索者”的板子)上,如何移植ds1302芯片程序
- Codeforces Round #381 (Div. 2) #V
- 用css做的风琴相册
- Visual Studio如何设置背景
- python 的xml解析
- php、nginx 两个分开的容器相连连不上的问题总结
- FreeRTOS在STM32F4上移植
- js之二级伸缩栏目+多选框+开关门
- 竖式问题
- RILD
- MII 类型接口介绍
- Struts2的下载安装
- css的伪类
- C#委托
- 爬取58上的大量二手数据并保存在MongoDB中