你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-C031C6】移植freertos系统

[复制链接]
TLLED 发布时间:2024-3-17 07:01

学习移植freertos系统到NUCLEO-C031C6开发板

一、freertos系统下载

freertos官网下载地址:https://www.freertos.org/zh-cn-cmn-s/a00104.html

001.jpg

二、添加源码

2.1、将源码添加到项目工程

002.jpg

2.2、修改配置文件

根据开发板的资源来修改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

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

/* Ensure definitions are only used by the compiler, and not by the assembler. */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
  #include <stdint.h>
  extern uint32_t SystemCoreClock;
#endif

#define configUSE_PREEMPTION                                        1
#define configSUPPORT_STATIC_ALLOCATION                        0//1
#define configSUPPORT_DYNAMIC_ALLOCATION                1
#define configUSE_IDLE_HOOK                                                0
#define configUSE_TICK_HOOK                                                0
#define configCPU_CLOCK_HZ                                                48000000//( SystemCoreClock )
#define configTICK_RATE_HZ                                                ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                                        ( 56 )
#define configMINIMAL_STACK_SIZE                                ( ( uint16_t ) 512 )
#define configTOTAL_HEAP_SIZE                                        ( ( size_t ) 8 * 1024 )
#define configMAX_TASK_NAME_LEN                                        ( 16 )
#define configUSE_TRACE_FACILITY                                1
#define configUSE_16_BIT_TICKS                                        0
#define configUSE_MUTEXES                                                1
#define configQUEUE_REGISTRY_SIZE                                8
#define configUSE_RECURSIVE_MUTEXES                                1
#define configUSE_COUNTING_SEMAPHORES                        1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION        0
#define configUSE_MALLOC_FAILED_HOOK                        0//1
#define configCHECK_FOR_STACK_OVERFLOW                        0//2

/* Defaults to size_t for backward compatibility, but can be changed
 * if lengths will always be less than the number of bytes in a size_t. */
#define configMESSAGE_BUFFER_LENGTH_TYPE                size_t
/* USER CODE END MESSAGE_BUFFER_LENGTH_TYPE */

/* Software timer definitions. */
#define configUSE_TIMERS                                                1
#define configTIMER_TASK_PRIORITY                                ( 2 )
#define configTIMER_QUEUE_LENGTH                                10
#define configTIMER_TASK_STACK_DEPTH                        256

/* 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                        0
#define INCLUDE_vTaskSuspend                                        1
#define INCLUDE_vTaskDelayUntil                                        1
#define INCLUDE_vTaskDelay                                                1
#define INCLUDE_xTaskGetSchedulerState                        1
#define INCLUDE_xTimerPendFunctionCall                        1
#define INCLUDE_xQueueGetMutexHolder                        1
#define INCLUDE_uxTaskGetStackHighWaterMark                1
#define INCLUDE_eTaskGetState                                        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
#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

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

/* 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. */
#define vPortSVCHandler                                                                SVC_Handler
#define xPortPendSVHandler                                                        PendSV_Handler
//#define xPortSysTickHandler                                                        SysTick_Handler

/* Allow system call from within FreeRTOS kernel only. */
#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY        1

/* STM32H743 has 16 MPU regions and therefore it is necessary to configure
 * configTOTAL_MPU_REGIONS correctly. */
#define configTOTAL_MPU_REGIONS                                                16

/* The default TEX,S,C,B setting marks the SRAM as shareable and as a result,
 * disables cache. Do not mark the SRAM as shareable because caching is being
 * used. TEX=0, S=0, C=1, B=1. */
#define configTEX_S_C_B_SRAM                                                ( 0x03UL )

#endif /* FREERTOS_CONFIG_H */

2.3、修改stm32c0xx_it.h文件

屏蔽函数

003.jpg

增加内容

004.jpg

2.4、task.c

#include "main.h"

#define START_TASK_PRO                1                        
#define START_STK_SIZE                128
TaskHandle_t StartTask_Handler;

#define TASK1_PRIO      4                 
#define TASK1_STK_SIZE  128               
static TaskHandle_t            Task1Task_Handler = NULL;  

#define TASK2_PRIO      3                 
#define TASK2_STK_SIZE  128               
static TaskHandle_t            Task2Task_Handler = NULL;  


void start_task(void *pvParameters); 
void gui_task(void *pvParameters);

void task1(void *pvParameters);  
void task2(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); 
        taskEXIT_CRITICAL();
        vTaskDelete(StartTask_Handler);                                        
}


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

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

2.5、main.c

#include "main.h"

void SystemClock_Config(void);

int main(void)
{
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

        init_led();
        init_usart(115200);
        printf("stm32c031 test!\r\n");
        task_create();

  while (1)
  {
    led4_tog();
    HAL_Delay(100);
  }
}

三、运行

编译完成后,下载程序到开发板,串口输出

005.jpg

收藏 评论0 发布时间:2024-3-17 07:01

举报

0个回答

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版