一、FreeRTOS是什么?
FreeRTOS 是亚马逊与世界领先的芯片公司历时 18 年合作开发的成果, 这是一款适用于微控制器和小型微处理器的市场领先实时操作系统。 FreeRTOS 通过 MIT 开源许可免费分发,包括一个内核和一组不断丰富的库, 适用于各行各业。FreeRTOS 注重可靠性、可访问性和易用性, 每 170 秒就被下载一次。第一次入门RTOS就是用的FreeRTOS.
二、FreeRTOS能用来做什么?
1、用于管理整个软件的框架;
2、用于提高系统的事实性;
3、管理内存分配
等等
三、优势
- FreeRTOS 真正免费,得到全方位支持,在商业应用中也是如此。 FreeRTOS 采用 MIT 开源许可, 不要求您公开专有知识产权。在使用 FreeRTOS 将产品推向市场时,无需支付费用。
- 提供统一且独立的解决方案,适用于多种不同的架构和开发工具。
- 可靠性众所周知。姐妹项目 SafeRTOS 所执行的活动提供了额外的信心保证。
- 功能丰富
- 占用的 ROM 和 RAM 较少,处理开销也较低。RTOS 内核二进制映像通常 介于 6K 到 12K 字节之间。
- 非常简单易用,RTOS 内核的核心仅包含 在 3 个 C 文件
四、学习链接
FreeRTOS™ 内核 - FreeRTOS™
五、移植
参考了论坛MIND MOTION、yuyy1989两位大佬的帖子。
1、下载代码
链接
FreeRTOS 文档 - FreeRTOS™
2、添加文件
1)解压文件并复制文件
2)在KEIL中添加.c .h文件
3、配置文件
/*
* 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
*
*/
/******************************************************************************
See http://www.freertos.org/a00110.html for an explanation of the
definitions contained in this file.
******************************************************************************/
#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.
* https://www.FreeRTOS.org/a00110.html
*----------------------------------------------------------*/
#include "stdint.h"
extern uint32_t SystemCoreClock;
<font color="#ffff00">#define SVC_Handler SVCall_Handler</font>
/* Cortex M33 port configuration. */
<font color="#ffff00">#define configENABLE_MPU 0</font>
#define configENABLE_FPU 1
#define configENABLE_TRUSTZONE 0
/* This part has 16 MPU regions. */
#define configTOTAL_MPU_REGIONS 16
/* Run FreeRTOS on the secure side and never jump to the non-secure side. */
<font color="#ffff00">#define configRUN_FREERTOS_SECURE_ONLY 0</font>
/* Constants related to the behaviour or the scheduler. */
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#define configUSE_PREEMPTION 1
#define configUSE_TIME_SLICING 1
#define configMAX_PRIORITIES ( 5 )
#define configIDLE_SHOULD_YIELD 1
#define configUSE_16_BIT_TICKS 0 /* Only for 8 and 16-bit hardware. */
/* Constants that describe the hardware and memory usage. */
#define configCPU_CLOCK_HZ SystemCoreClock
#define configMINIMAL_STACK_SIZE ( ( uint16_t ) 256 )
#define configMINIMAL_SECURE_STACK_SIZE ( 1024 )
#define configMAX_TASK_NAME_LEN ( 12 )
<font color="#ffff00">#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 15 * 1024 ) )</font>
/* Constants that build features in or out. */
#define configUSE_MUTEXES 1
#define configUSE_TICKLESS_IDLE 1
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_NEWLIB_REENTRANT 0
#define configUSE_COUNTING_SEMAPHORES 1
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_QUEUE_SETS 0
#define configUSE_TASK_NOTIFICATIONS 1
#define configUSE_TRACE_FACILITY 1
/* Constants that define which hook (callback) functions should be used. */
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configUSE_MALLOC_FAILED_HOOK 0
/* Constants provided for debugging and optimisation assistance. */
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
#define configQUEUE_REGISTRY_SIZE 0
/* Software timer definitions. */
<font color="#ffff00">#define configUSE_TIMERS 0</font>
#define configTIMER_TASK_PRIORITY ( 3 )
#define configTIMER_QUEUE_LENGTH 5
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE )
/* Set the following definitions to 1 to include the API function, or zero
* to exclude the API function. NOTE: Setting an INCLUDE_ parameter to 0 is
* only necessary if the linker does not automatically remove functions that are
* not referenced anyway. */
#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_uxTaskGetStackHighWaterMark 0
#define INCLUDE_xTaskGetIdleTaskHandle 0
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xTaskResumeFromISR 0
#define INCLUDE_xTaskGetCurrentTaskHandle 1
#define INCLUDE_xTaskGetSchedulerState 0
#define INCLUDE_xSemaphoreGetMutexHolder 0
#define INCLUDE_xTimerPendFunctionCall 1
/* 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
/* Dimensions a buffer that can be used by the FreeRTOS+CLI command interpreter.
* See the FreeRTOS+CLI documentation for more information:
* https://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_CLI/ */
#define configCOMMAND_INT_MAX_OUTPUT_SIZE 2048
/* Interrupt priority configuration follows...................... */
/* Use the system definition, if there is one. */
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 3 /* 8 priority levels. */
#endif
/* The lowest interrupt priority that can be used in a call to a "set priority"
* function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x07
/* 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 ) )
/* Constants related to the generation of run time stats. */
#define configGENERATE_RUN_TIME_STATS 0
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define portGET_RUN_TIME_COUNTER_VALUE() 0
<font color="#ffa500">#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )</font>
/* Enable static allocation. */
<span style="background-color: yellow;">#define configSUPPORT_STATIC_ALLOCATION 0</span>
#endif /* FREERTOS_CONFIG_H */
4、编写主函数
/***********************************************************************************************************************
[url=home.php?mod=space&uid=288409]@file[/url] main.c
[url=home.php?mod=space&uid=187600]@author[/url] FAE Team
[url=home.php?mod=space&uid=212281]@date[/url] 08-May-2023
[url=home.php?mod=space&uid=247401]@brief[/url] THIS FILE PROVIDES ALL THE SYSTEM FUNCTIONS.
**********************************************************************************************************************
@attention
<h2><center>© Copyright(c) <2023> <MindMotion></center></h2>
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or
promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*********************************************************************************************************************/
/* Define to prevent recursive inclusion */
#define LOG_TAG "MAIN"
#define _MAIN_C_
/* Files include */
#include "platform.h"
#include "main.h"
#include "adc.h"
#include "FreeRTOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"
/**
* @addtogroup MM32F5330_LibSamples
* @{
*/
/**
* @addtogroup TIM2_5
* @{
*/
/**
* @addtogroup TIM2_5_TimeBase
* @{
*/
/* Private typedef ****************************************************************************************************/
/* Private define *****************************************************************************************************/
/* Private macro ******************************************************************************************************/
/* Private variables **************************************************************************************************/
static TaskHandle_t adc_task_handler = NULL;
static TaskHandle_t led_task_handler = NULL;
static TaskHandle_t printf_task_handler = NULL;
/* Private functions **************************************************************************************************/
void AdcTask(void* pvParameters);
void LedTask(void* pvParameters);
void PrintfTask(void* pvParameters);
void TaskInit(void);
/***********************************************************************************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url] This function is main entrance
* [url=home.php?mod=space&uid=536309]@NOTE[/url] main
* @param none
* @retval none
*********************************************************************************************************************/
int main(void)
{
PLATFORM_Init(); //初始化串口以及LED;
elog_config();
ADC_Configure();
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
TaskInit();
while (1)
{
}
}
void TaskInit(void) {
xTaskCreate(AdcTask, "AdcTask", configMINIMAL_STACK_SIZE, NULL,2, &adc_task_handler);
xTaskCreate(LedTask, "LedTask", configMINIMAL_STACK_SIZE, NULL,1, &led_task_handler);
xTaskCreate(PrintfTask, "PrintfTask", configMINIMAL_STACK_SIZE, NULL,3, &printf_task_handler);
vTaskStartScheduler();
}
void AdcTask(void* pvParameters)
{
while (1)
{
PLATFORM_LED_Toggle(LED3);
ADC_NormalChannel_ContinuousScan_DMA_Interrupt_Sample();
vTaskDelay(1000);
}
}
void LedTask(void* pvParameters)
{
while (1)
{
PLATFORM_LED_Toggle(LED1);
vTaskDelay(500);
log_d("LedTask");
}
}
void PrintfTask(void* pvParameters)
{
while (1)
{
vTaskDelay(1000);
PLATFORM_LED_Toggle(LED4);
log_d("PrintfTask");
}
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/********************************************** (C) Copyright MindMotion **********************************************/
六、验证
串口打印
LED闪烁
工程:
FreeRTOS-MM32.zip
(4.08 MB)
|
此文章已获得独家原创/原创奖标签,著作权归21ic所有,未经允许禁止转载。
|