打印
[AT32L021]

【AT-START-L021测评】+ 运行FreeRTOS

[复制链接]
1038|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tlled|  楼主 | 2024-12-5 00:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
移植FreeRTOS系统到开发板。

一、下载FreeRTOS软件

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


二、添加文件到工程

将下载的源码添加到工程中


三、程序代码部分

根据芯片的硬件资源来配置FreeRTOS。
3.1、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 system_core_clock;//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                                                (system_core_clock)//80000000//( 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 ) 5 * 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                        0
#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 */


3.2、fun_task.c
#include "main.h"

#define START_TASK_PRO                1                               
#define START_STK_SIZE                64
TaskHandle_t StartTask_Handler;

#define TASK1_PRIO      2                  
#define TASK1_STK_SIZE  64                 
static TaskHandle_t            Task1Task_Handler = NULL;  
           
#define TASK2_PRIO      3                  
#define TASK2_STK_SIZE  64                 
static TaskHandle_t            Task2Task_Handler = NULL;  

#define TASK3_PRIO      4                  
#define TASK3_STK_SIZE  64                 
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
        xTaskCreate((TaskFunction_t )task3,                  
                                                        (const char*    )"task3",               
                                                        (uint16_t       )TASK3_STK_SIZE,        
                                                        (void*          )NULL,                  
                                                        (UBaseType_t    )TASK3_PRIO,            
                                                        (TaskHandle_t*  )&Task3Task_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(200);
    }
}

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



3.3、main.c
#include "main.h"

int main(void)
{
  system_clock_config();
        init_usart(115200);
        delay_init();
        init_led();
        task_create();
  while(1)
  {
  }
}


四、程序运行

下载程序后,串口输出

使用特权

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

本版积分规则

129

主题

698

帖子

6

粉丝