AT32开发 - Freertos集成
简介
在嵌入式领域,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式操作系统(RTOS)可以
更合理、更高效的利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好的保证系统的
实时性和可靠性。
FreeRTOS是一个轻量级的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、
时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的
需求。由于RTOS需要占用一定系统资源(尤其是RAM资源),只有UCOSII/III、embOS、RTT、
FreeRTOS等少数实时操作系统能在小RAM的MCU上运行。相对于UCOSII/III和embOS等商用操作
系统,FreeRTOS是免费开源的操作系统,具有源码公开、可移植、可剪裁、调度策略灵活等特点,
可以方便的移植到MCU上运行。
简介
功能和特点
FreeRTOS主要功能和特点如下:
- 用户可配置内核功能
- 多平台的支持
- 提供一个高层次的信任代码的完整性
- 目标代码小、简单易用
- 遵循MISRA-C标准编程规范
- 强大的执行跟踪功能
- 堆栈溢出检测
- 没有限制的任务数量和优先级
- 多个任务可以分配相同的优先权
- 队列、二进制信号量、计数信号量、递归通信和同步的任务
- 优先级继承
- 免费开源的源代码
系统功能
作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录
功能、软件定时器、协程等,可基本满足较小系统的需求。FreeRTOS内核支持优先级调度算法,不
同任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于任务就绪、优先级最高的任务
运行。FreeRTOS同样支持时间片轮转调度算法,系统允许不同的任务处于同一优先级下,在没有更
高优先级任务就绪的情况下,同一优先级的任务共享系统资源。
FreeRTOS内核可根据需要设置为可剥夺型内核和不可剥夺型内核。当FreeRTOS配置成可剥夺型内
核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样提高了系统的实时性;
当FreeRTOS配置成不可剥夺型内核时,处于就绪态的高优先级任务只能等当前任务主动释放CPU使
用权才能获得运行,这样提高了系统的运行效率。FreeRTOS on AT32 MCU
在嵌入式领域FreeRTOS是不多的同时具备实时性、开源性、可靠性、易用性、多平台支持等特点的
嵌入式操作系统,FreeRTOS已发展到支持包含X86、Xilinx、Altera等多达30种硬件平台,其广阔的
应用场景已经越来越受业界人事的关注
移植 FreeRTOS
第一步:首先需要到FreeRTOS官方网站下载源码包,官方网站地址为:www.freertos.org下载最新的版本
第二步:将FreeRTOS源码包文件中的source文件夹复制到工程中去,并添加到工程目录中。
打开Keil修改配置和导入头文件路径。
修改为最新的Keil编译条件为V6版本。使用GCC
修改C的语言为C99兼容rtos代码。
增加Include路径
创建freertos组,然后添加c文件引入。
图片中的文件都是在source这个目录下的,其中heap_4.c是在Source\portable\MemMang目录下;
port.c是在Source\portable\GCC\ARM_CM4F下;
添加FreeRTOSConfig.h文件
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
#ifdef __cplusplus
extern "C" {
#endif
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include <stdint.h>
#include "system_at32f403a_407.h"
#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_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( ( unsigned long ) system_core_clock )
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
// #define configUSE_TRACE_FACILITY 1
// #define configUSE_STATS_FORMATTING_FUNCTIONS 1
// #define configGENERATE_RUN_TIME_STATS 1
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 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 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetCurrentTaskHandle 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 0x0f
/* 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 0x01
/* 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
#ifdef __cplusplus
}
#endif
#endif /* FREERTOS_CONFIG_H */
在at32f403a_407_int.c文件中注释掉两个方法的实现,因为rtos自己有实现
void PendSV_Handler(void);
void SVC_Handler(void);
代码测试
#include "FreeRTOS.h"
#include "task.h"
TaskHandle_t led_handler;
TaskHandle_t print_handler;
void led_task_function(void* pvParameters);
void print_task_function(void* pvParameters);
int main(void)
{
//....其他初始化方法
taskENTER_CRITICAL();
if (xTaskCreate(led_task_function, "LED", 512, NULL, 2, &led_handler) !=
pdPASS) {
printf("Create led task fail\r\n");
}
if (xTaskCreate(print_task_function, "PRINT", 512, NULL, 2,
&print_handler) != pdPASS) {
printf("Create led task fail\r\n");
}
/* exit critical */
taskEXIT_CRITICAL();
/* start scheduler */
vTaskStartScheduler();
}
评论区