打印
[STM32H7]

【STM32H745I-DISCO试用】移植FreeRTOS系统

[复制链接]
524|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tlled|  楼主 | 2025-3-4 23:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tlled 于 2025-3-4 23:46 编辑

学习在STM32H745I-DISCO开发板上移植freertos系统。


一、下载FreeRTOS源码


下载地址:https://wwww.freertos.org/





二、添加源码到工程


2.1、复制源码到工程文件夹下


2.2、添加文件到项目工程



2.3、修改文件
修改stm32h7xx_it.c文件,屏蔽掉下面函数

void SVC_Handler(void)


void PendSV_Handler(void)


void SysTick_Handler(void)


2.4、修改FreeRTOSConfig.h
/*
* FreeRTOS V202212.01
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
*
* 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 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 configUSE_PORT_OPTIMISED_TASK_SELECTION        0
//#define configUSE_QUEUE_SETS                                        1
#define configUSE_IDLE_HOOK                                                0
#define configUSE_TICK_HOOK                                                0//1
#define configCPU_CLOCK_HZ                                                ( SystemCoreClock )
#define configTICK_RATE_HZ                                                ( ( TickType_t )1000 )
#define configMAX_PRIORITIES                                        ( 5 )
#define configMINIMAL_STACK_SIZE                                ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE                                        ( ( size_t ) ( 20 * 1024 ) )
#define configMAX_TASK_NAME_LEN                                        ( 10 )
#define configUSE_TRACE_FACILITY                                1
#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//2
#define configUSE_RECURSIVE_MUTEXES                                1
#define configUSE_MALLOC_FAILED_HOOK                        0//1
#define configUSE_APPLICATION_TASK_TAG                        0
#define configUSE_COUNTING_SEMAPHORES                        1

/* The full demo always has tasks to run so the tick will never be turned off.
The blinky demo will use the default tickless idle implementation to turn the
tick off. */
#define configUSE_TICKLESS_IDLE                                        0

/* Run time stats gathering definitions. */
#define configGENERATE_RUN_TIME_STATS        0

/* This demo makes use of one or more example stats formatting functions.  These
format the raw data provided by the uxTaskGetSystemState() function in to human
readable ASCII form.  See the notes in the implementation of vTaskList() within
FreeRTOS/Source/tasks.c for limitations. */
#define configUSE_STATS_FORMATTING_FUNCTIONS        1


/* Software timer definitions. */
#define configUSE_TIMERS                                1
#define configTIMER_TASK_PRIORITY                2//( configMAX_PRIORITIES - 1 )
#define configTIMER_QUEUE_LENGTH                10//5
#define configTIMER_TASK_STACK_DEPTH        ( configMINIMAL_STACK_SIZE * 2 )

/* 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_eTaskGetState                        1
#define INCLUDE_xTimerPendFunctionCall        1

/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
        /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
        #define configPRIO_BITS                       __NVIC_PRIO_BITS
#else
        #define configPRIO_BITS                       4        /* 15 priority levels */
#endif

/* 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//4

/* 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) )

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler

/* Prevent the inclusion of items the assembler will not understand in assembly
files. */
//#ifndef __IAR_SYSTEMS_ASM__

//        /* Library includes. */
//        #include "stm32f7xx_hal.h"

//        extern uint32_t SystemCoreClock;

//        /* Normal assert() semantics without relying on the provision of an assert.h
//        header file. */
//        extern void vAssertCalled( uint32_t ulLine, const char *pcFile );
//        #define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __LINE__, __FILE__ )

//#endif /* __IAR_SYSTEMS_ASM__ */

#endif /* FREERTOS_CONFIG_H */



三、程序部分


3.1、task.c
#include "main.h"

#define START_TASK_PRO                tskIDLE_PRIORITY + 1                               
#define START_STK_SIZE                256
TaskHandle_t StartTask_Handler;

#define TASK1_PRIO              tskIDLE_PRIORITY + 2                  
#define TASK1_STK_SIZE          256                 
static TaskHandle_t                    Task1Task_Handler = NULL;  
           
#define TASK2_PRIO              tskIDLE_PRIORITY + 3                  
#define TASK2_STK_SIZE          256              
static TaskHandle_t                    Task2Task_Handler = NULL;  

#define TASK3_PRIO              tskIDLE_PRIORITY + 4                  
#define TASK3_STK_SIZE          256               
static TaskHandle_t                    Task3Task_Handler = NULL;  


void start_task(void *pvParameters);
void task1(void *pvParameters);  
void task2(void *pvParameters);
void task3(void *pvParameters);

void task_create(void)
{
       
        //start_task
        xTaskCreate((TaskFunction_t )start_task,                  
                                                        (const char*    )"start_task",               
                                                        (uint16_t       )START_STK_SIZE,         
                                                        (void*          )NULL,                  
                                                        (UBaseType_t    )START_TASK_PRO,            
                                                        (TaskHandle_t*  )&StartTask_Handler);   

        vTaskStartScheduler();
}

void start_task(void *pvParameters)
{
        taskENTER_CRITICAL();
        //task1
        xTaskCreate((TaskFunction_t )task1,                  
                                                        (const char*    )"task1",               
                                                        (uint16_t       )TASK1_STK_SIZE,         
                                                        (void*          )NULL,                  
                                                        (UBaseType_t    )TASK1_PRIO,            
                                                        (TaskHandle_t*  )&Task1Task_Handler);   
        //task2
        xTaskCreate((TaskFunction_t )task2,                  
                                                        (const char*    )"task2",               
                                                        (uint16_t       )TASK2_STK_SIZE,        
                                                        (void*          )NULL,                  
                                                        (UBaseType_t    )TASK2_PRIO,            
                                                        (TaskHandle_t*  )&Task2Task_Handler);
                                                       
        //task3-lvlg
        xTaskCreate((TaskFunction_t )task3,                  
                                                        (const char*    )"task3",               
                                                        (uint16_t       )TASK3_STK_SIZE,        
                                                        (void*          )NULL,                  
                                                        (UBaseType_t    )TASK3_PRIO,            
                                                        (TaskHandle_t*  )&Task2Task_Handler);
        taskEXIT_CRITICAL();
                                                       
                                                       
        vTaskDelete(StartTask_Handler);                                               
}

//task1
void task1(void *pvParameters)
{
    while (1)
    {
        printf("task1 run ...\r\n");
        vTaskDelay(100);
    }
}

//task2
void task2(void *pvParameters)
{
    while (1)
    {       
        printf("task2 run ...\r\n");
        vTaskDelay(100);
    }
}

//task3
void task3(void *pvParameters)
{
                while (1)
                {       
                                printf("task3 run ...\r\n");
                                vTaskDelay(100);
                }
}


3.2、main.c
#include "main.h"
#include "usart/usart.h"
#include "led/led.h"

#ifndef HSEM_ID_0
#define HSEM_ID_0 (0U) /* HW semaphore 0*/
#endif

void SystemClock_Config(void);

static void CPU_CACHE_Enable(void);
static void MPU_Config(void);


int main(void)
{
        MPU_Config();
        CPU_CACHE_Enable();
  HAL_Init();
        SystemClock_Config();
  __HAL_RCC_HSEM_CLK_ENABLE();
  
        HAL_HSEM_FastTake(HSEM_ID_0);   
        HAL_HSEM_Release(HSEM_ID_0,0);

        init_led();
        init_uart3(115200);
        
        task_create();

  while (1)
  {
  }
}


四、程序运行

下载程序后,串口输出


使用特权

评论回复
沙发
yangjiaxu| | 2025-4-9 14:21 | 只看该作者
这个确实可以学习学习,主要是这种比较细致的教程确实很有意义

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

6

粉丝