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

【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分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版