下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

从 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 个选项:

  1. 更新到新的增强型 MPU 包装器[推荐]
  2. 继续使用旧的 MPU 包装器

1.更新到新的增强型 MPU 包装器[推荐]

  1. 在项目中编译以下附加文件:
    1. portable/Common/mpu_wrappers_v2.c
    2. mpu_wrappers_v2_asm.cmpu_wrappers_v2_asm.S文件—— 在您的 portable/[Compiler]/[Architecture] 目录中。
  2. 在 FreeRTOSConfig.h 文件中将 configUSE_MPU_WRAPPERS_V1 定义为 0 或将其保留为未定义。
  3. configPROTECTED_KERNEL_OBJECT_POOL_SIZE 定义为应用程序中内核对象(任务、队列、信号量、互斥锁、定时器、 事件组、消息缓冲区和流缓冲区)的总数。应用程序在任何时候 都不能拥有超过 configPROTECTED_KERNEL_OBJECT_POOL_SIZE 个内核对象。
  4. configSYSTEM_CALL_STACK_SIZE 定义为系统调用堆栈的大小(单位:字)。每个任务都有一个静态分配的内存缓冲区, 大小为 configSYSTEM_CALL_STACK_SIZE,用作执行系统调用的堆栈。例如,如果 configSYSTEM_CALL_STACK_SIZE 定义为 128, 并且应用程序中有 10 个任务,则用于系统调用堆栈的总内存量为 128 * 10 = 1280 字。

2.继续使用旧的 MPU 包装器

  1. 在 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;
    /* It is incorrect to use &xQueueBuffer as the queue handle. */
    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;
    /* Use the value returned from xQueueSend as the queue handle. */
    xQueueSend( xQueueHandle, &( valueToSend ), pdMS_TO_TICKS( 10 ) );
  • Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.