从 FreeRTOS V10.5.1 升级到 V10.6.0
FreeRTOS V10.6.0是 FreeRTOS 的升级版,适用于除具有内存保护单元(MPU)支持的端口之外的所有端口。
请按照以下说明将使用 FreeRTOS MPU 支持的应用程序从 FreeRTOS V10.5.1 升级到 V10.6.0。
移植现有应用程序
FreeRTOS V10.6.0 引入了一个新的 MPU 包装器。如果您的应用程序使用 FreeRTOS MPU 支持,您有以下 2 个选项:
- 更新到新的增强型 MPU 包装器[推荐]
- 继续使用旧的 MPU 包装器
1.更新到新的增强型 MPU 包装器[推荐]
- 在项目中编译以下附加文件:
portable/Common/mpu_wrappers_v2.c
。
mpu_wrappers_v2_asm.c
或 mpu_wrappers_v2_asm.S
文件——
在您的 portable/[Compiler]/[Architecture]
目录中。
- 在 FreeRTOSConfig.h 文件中将
configUSE_MPU_WRAPPERS_V1
定义为 0 或将其保留为未定义。
- 将
configPROTECTED_KERNEL_OBJECT_POOL_SIZE
定义为应用程序中内核对象(任务、队列、信号量、互斥锁、定时器、
事件组、消息缓冲区和流缓冲区)的总数。应用程序在任何时候
都不能拥有超过 configPROTECTED_KERNEL_OBJECT_POOL_SIZE
个内核对象。
- 将
configSYSTEM_CALL_STACK_SIZE
定义为系统调用堆栈的大小(单位:字)。每个任务都有一个静态分配的内存缓冲区,
大小为 configSYSTEM_CALL_STACK_SIZE,用作执行系统调用的堆栈。例如,如果 configSYSTEM_CALL_STACK_SIZE
定义为 128,
并且应用程序中有 10 个任务,则用于系统调用堆栈的总内存量为 128 * 10 = 1280 字。
2.继续使用旧的 MPU 包装器
- 在 FreeRTOSConfig.h 文件中将
configUSE_MPU_WRAPPERS_V1
定义为 1。
故障排除
- 我使用的是增强型 MPU 包装器,内存快用完了。
- 您可以尝试使用
configSYSTEM_CALL_STACK_SIZE
调整系统调用堆栈大小。
- 您还可以尝试减少每个任务的堆栈大小,因为任务上下文不再保存在任务堆栈中。
- 我使用的是旧的 MPU 包装器,内存快用完了。
- 您可以尝试减少每个任务的堆栈大小,因为任务上下文不再保存在任务堆栈中。
- 我遇到了内存保护故障,因为应用程序使用的系统调用在增强型 MPU 包装器中不再可用。
(请浏览以下页面,参阅 FreeRTOS 10.6.0 版中的更改:
内存保护单元 (MPU) 支持页面。)
- 大多数已移除的系统调用是用于创建和删除内核对象的。您可以考虑在启动调度器之前创建所有内核对象,
并且永远不删除它们。
- 如果做不到这一点,可以考虑将创建和删除内核对象的任务设置为特权任务。
- 如果上述方法也不起作用,您可以切换回旧的 MPU 包装器,
具体做法请参阅上文“2. 继续使用旧的 MPU 包装器”。
- 如果您使用静态创建 API 创建了内核对象,并将静态缓冲区的地址用作对象句柄,
而不是 API 返回的值,则该对象将不再工作。示例:
#define QUEUE_LENGTH 10
#define ITEM_SIZE sizeof( uint32_t )
StaticQueue_t xQueueBuffer;
uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];
xQueueCreate( QUEUE_LENGTH,
ITEM_SIZE,
&( ucQueueStorage[ 0 ] ),
&xQueueBuffer );
uint32_t valueToSend = 10;
xQueueSend( &xQueueBuffer, &( valueToSend ), pdMS_TO_TICKS( 10 ) );
执行上述操作的正确方法是:
#define QUEUE_LENGTH 10
#define ITEM_SIZE sizeof( uint32_t )
StaticQueue_t xQueueBuffer;
uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];
QueueHandle_t xQueueHandle;
xQueueHandle = xQueueCreate( QUEUE_LENGTH,
ITEM_SIZE,
&( ucQueueStorage[ 0 ] ),
&xQueueBuffer );
uint32_t valueToSend = 10;
xQueueSend( xQueueHandle, &( valueToSend ), pdMS_TO_TICKS( 10 ) );
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.