首页 > 其他分享 >STM32F1移植FREERTOS DEMO

STM32F1移植FREERTOS DEMO

时间:2024-08-06 08:55:15浏览次数:6  
标签:FREERTOS FreeRTOS DEMO configUSE API GPIO INCLUDE STM32F1 define

简介

STM32F1太常用了,因为官网已经把移植的工作做的很完善了,只要文件放到相应工程里就可以使用,这里只做一个简单的DEMO,记录下FreeRTOS正常启动的流程

CUBEMX配置

1.新建CUBEMX工程,使用SWD的情况先配置SWD设置,防止第一次烧录后,后续无法使用
2.由于FreeRTOS有重新使用到SYSTICK(滴搭定时器),port.c之中,有systick的新配置与响应,因此HAL库的基础时钟,要由SYSTICK改为其他时钟,如TIM2

3.配置时钟,根据实际情况配置即可,此处使HSE,8M,PLL输入作为系统时钟,72M主频
4.SYSTICK,PENDSV,SVC等系统中断,有被FreeRTOS,重新配置使用到。因此CUBEMX输出代码的时候都不能输出这个定义,不然编译时会报错,配置如下

5.基本的DEMO配置的基本参数已配置好,可以再配置下DEMO中,有用到的管脚,这里使PE5,PB5作为DEMO,IO输出管脚,用于后续的,就可以生成DEMO代码了

FreeRTOS源码放置

1.下载FreeRTOS源码,下载LTS版本
2.下载过来的FreeRTOS中的源码,并不是我们需要全部,只需将其中的FreeRTOS-Kernel文件夹下,拷贝出来即可,拷贝到工程下的FreeRTOS/Source文件夹中

3.最小FreeRTOS系统的情况下,内核只需要task.c,list.c,queue.c三个文件即可,同时工程还要需添加官方写好的port.c(portable/RVDS/ARM_CM3)的文件,根据自己的编译环境与芯片类型来选择相应的文件,
添加HEAP文件,默认推荐为heap_4.c(portable/MemMang)
4.添加FreeRTOSConfih.h,FREERTOS的配置文件内容如下,也可以根据编译错误提示修改相应的配置
由于是最小的系统因此关闭了很多类于HOOK调用的函数,关闭静态分配内存等

具体如下

点击查看代码
/*
 * FreeRTOS Kernel V10.4.6
 * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
  #include <stdint.h>
  //extern volatile uint32_t SystemCoreClock;
  extern uint32_t SystemCoreClock;
#endif

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 *
 * See http://www.freertos.org/a00110.html
 *----------------------------------------------------------*/
#define configUSE_PREEMPTION              1
#define configSUPPORT_STATIC_ALLOCATION   0
#define configSUPPORT_DYNAMIC_ALLOCATION  1
#define configUSE_IDLE_HOOK               0
#define configUSE_TICK_HOOK               0
#define configCPU_CLOCK_HZ                ( SystemCoreClock )
#define configTICK_RATE_HZ                ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES              ( 5 )
#define configMINIMAL_STACK_SIZE          ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE             ( ( size_t ) ( 2 * 1024 ) )
#define configMAX_TASK_NAME_LEN           ( 5 )
#define configUSE_TRACE_FACILITY          0
#define configUSE_16_BIT_TICKS            0
#define configIDLE_SHOULD_YIELD           1
#define configUSE_MUTEXES                 1
#define configQUEUE_REGISTRY_SIZE         8
#define configCHECK_FOR_STACK_OVERFLOW    0
#define configUSE_RECURSIVE_MUTEXES       1
#define configUSE_COUNTING_SEMAPHORES     1
#define configUSE_MALLOC_FAILED_HOOK      0
#define configUSE_APPLICATION_TASK_TAG    0
#define configGENERATE_RUN_TIME_STATS     0

/* Software timer definitions. */
#define configUSE_TIMERS                  0
#define configTIMER_TASK_PRIORITY         ( 2 )
#define configTIMER_QUEUE_LENGTH          5
#define configTIMER_TASK_STACK_DEPTH      ( 128 )

/* Set the following definitions to 1 to include the API function, or zero
 * to exclude the API function. */
#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_xTaskGetCurrentTaskHandle 1

#if (1)  /* Specific priority configuration for non-Cortex-M0/M0+. */

/* Cortex-M specific definitions. */
#define configPRIO_BITS 4

/* The lowest interrupt priority that can be used in a call to a "set priority"
 * function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15

/* The highest interrupt priority that can be used by any interrupt service
 * routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT
 * CALL INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A
 * HIGHER PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

/* Interrupt priorities used by the kernel port layer itself.  These are generic
 * to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY       ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
 * See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY  ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) )

#endif  /* Specific priority configuration for non-Cortex-M0/M0+. */

/* Normal assert() semantics without relying on the provision of an assert.h
 * header file. */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
 * standard names - or at least those used in the unmodified vector table. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

#endif /* FREERTOS_CONFIG_H */


5.配置好INCLUDE文件路径

新建TASK

void vTask1(void *pvParameters)
{
	for(;;)
	{
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);
		vTaskDelay(1000);
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);
		vTaskDelay(1000);
	}
}

void vTask2(void *pvParameters)
{
	for(;;)
	{
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
		vTaskDelay(500);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
		vTaskDelay(500);
	}
}

main函数中添加任务,同时开启调度

    xTaskCreate(vTask1, "LED1", 128, NULL, 1, NULL);
    xTaskCreate(vTask2, "LED2", 128, NULL, 1, NULL);
    vTaskStartScheduler();

运行

编译后下载到线路板中,就可以实现FreeRTOS最小系统的使用了

总结

FreeRTOS是很成熟的操作系统,STM32F1也是很常用的MCU,因此在STM32上面使用FreeRTOS,基本上不用修改代码,工程配置好就可以使用了
同时CUBEMX里面也可以直接添加FreeRTOS来使用,只是CUBEMX生成FreeRTOS,上面又封装了一层API,如果已经习惯了FreeRTOS的用户去使用的话,就需要再学习下新的API,
手工添加代码,直接使用FreeRTOS本身的API,也是一个很好的选择。
FreeRTOS移植成功,只是开了个头,后面API的学习,以及在系统变得复杂时,对嵌入式操作系统的理解(信号量、互斥、优先级、中断处理、调度、队列等),合理分配系统的资源来完成具体的应用,才是后面的重点。
移植成功,离真正到项目中去做还需要一定的学习与练习。

标签:FREERTOS,FreeRTOS,DEMO,configUSE,API,GPIO,INCLUDE,STM32F1,define
From: https://www.cnblogs.com/stupidpeng/p/18321364

相关文章

  • 时钟(STM32F103)
    时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波时钟是单片机的脉搏时钟源:              频率         材料              用途高速外部振荡器(HSE)   4-16MHz     晶体/陶瓷       ......
  • 从零体检一个魔塔社区模型(modelscope)最简单demo
    从社区拿一个模型,比如以下这个链接https://www.modelscope.cn/models/iic/cv_mobilenet-v2_bad-image-detecting它的代码样例如下frommodelscope.pipelinesimportpipelinefrommodelscope.utils.constantimportTasksfrommodelscope.outputsimportOutputKeysimg='......
  • 基于stm32f103c8t6的蓝牙小车(可以控制车速,以及有数码管显示速度)
    蓝牙模块的理解:蓝牙可以理解为一个无线的串口,手机和单片机之间可以通过蓝牙来发送数据,控制单片机IO口,进而来控制小车,总体的逻辑是,手机发送数据给蓝牙,蓝牙将这个数据再发送给单片机。另外蓝牙的代码跟我们学的串口通信差不多。usart2.c#include"usart2.h" voiduart......
  • STM32Cubemx在FreeRTOS中使用面向对象的方式使用串口
    文章目录前言一、创建FreeRTOS工程二、创建文件对串口进行封装三、代码编写总结前言本篇文章将带大家来学习使用面向对象的方式在FreeRTOS中使用串口,使用面向对象的方法非常适合编写可移植性强的代码,那么这篇文章就带大家来看一下这个代码要怎么写。一、创建FreeRT......
  • 流量回放技术测试领域应用及GoReplay demo实践总结
    目录前言基本概念流量回放的优势1.高度模拟真实环境:2.提高测试覆盖率:3.快速定位和复现问题:4.减少测试时间和成本:5.支持持续集成和持续部署(CI/CD):6.增强安全性测试:7.支持多场景测试:8.数据驱动的测试:9.提高团队协作效率:10.易于集成和扩展:方案比较1.Nginx层流量......
  • Makefile demo
    #Project:server#MakefilecreatedbyEmbarcaderoDev-C++6.3CPP=g++.exeCC=gcc.exeWINDRES=windres.exeOBJ=helloserver.osoapC.osoapServer.ostdsoap2.oLINKOBJ=helloserver.osoapC.osoapServer.ostdsoap2.oLIBS=-L&q......
  • FreeRTOS 列表和列表项
    强烈建议:一定要有数据结构中链表的基础 列表和列表项列表:列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。列表项:列表项就是存放在列表中的项目 列表相当于链表,列表项相当于节点,FreeRTOS中的列表是一个双向环形链表......
  • 使用springboot中的springdatajpa写一个demo遇到一些问题
    Description:FielduserRepositoryincom.example.jpademo.service.serviceImpl.UserServiceImplrequiredabeannamed'entityManagerFactory'thatcouldnotbefound.Theinjectionpointhasthefollowingannotations: [email protected]......
  • STM32F1基于HAL库的学习记录实用使用教程分享(二、GPIO_Input 按键)
    往期内容STM32F1基于HAL库的学习记录实用使用教程分享(一、GPIO_Output)文章目录往期内容前言一、GPIO_Input1.浮空输入(GPIO_Mode_IN_FLOATING)2.上拉输入(GPIO_Mode_IPU)3.下拉输入(GPIO_Mode_IPD)4.上拉和下拉的区分原因二、配置1.RCC2.SYS(1).Debug(2).SystemWa......
  • FreeRTOS学习笔记(二)
    FreeRTOS移植一、获取FreeRTOS源码1.1官网下载进入官网直接下载官网:https://www.freertos.org/zh-cn-cmn-s/1.2正点原子网盘下载正点原子资料v10.4.6例程git:https://gitee.com/yuan-zhenbin/freertos-code-repository.gitFreeRTOS资料网盘:http://www.openedv.c......