Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

RTOS应用设计

RTOS应用

在 SDK 下的 examples/freertos/explorer_board 路径下有一个完整的示例应用程序,可以作为使用 RTOS 驱动程序或软件服务的参考,并提供给 xcore 结构化 SMP RTOS 应用程序的示例。此外,还有一个开发板支持配置库模块提供的代码,用于为这个示例的 SoC 平台进行初始化。路径为:/rtos/modules/board_support/XCORE-AI-EXPLORER_2V0/platform

这个示例应用程序运行两个 SMP FreeRTOS 实例,分别在处理器的两个 tile 上运行。由于每个 tile 都有自己的内存,所以它们之间不会共享数据,可以将其视为由两个 SMP 系统组成的单一非对称多处理(AMP)系统。在一个 tile 上创建的 FreeRTOS 线程永远不会被调度到另一个 tile 上运行。同样地,在一个 tile 上创建的 RTOS 对象(如队列)只能被该 tile 上的线程和中断服务程序访问,而不能被运行在另一个 tile 上的代码访问。

也就是说,这个示例应用程序是作为一个整体编程和构建的,这对于以前使用 XC 编程语言开发 xcore 程序的程序员来说应该很熟悉。在不同的 tile 上运行的线程之间必须共享的数据是通过使用 RTOS tile间驱动程序的通道发送的,这种通道使用流式通道在tile之间进行通信。

大多数 I/O 接口驱动程序实际上提供了一种机制,允许在使用tile间驱动程序的tile之间共享驱动程序实例。对于熟悉 XC 编程的人来说,这可以被看作是 XC 接口的 C 语言替代方案。

例如,一个 SPI 接口可能在 tile 0 上可用。通常,在 tile 0 上运行的初始化代码会设置这个接口,然后启动驱动程序。如果没有任何进一步的初始化,运行在 tile 1 上的代码将不能直接访问这个接口,这是因为不能直接访问 tile 0 的内存,也不能直接访问 tile 0 的端口。然而,驱动程序提供了一些额外的初始化功能,应用程序可以使用这些功能来共享 tile 0上的实例和 tile 1上的实例。在这个初始化完成后,运行在 tile 1 上的代码可以使用与 tile 0 相同的驱动 API 的实例,几乎就像它实际上是在 tile 0 上运行一样。

应该参考上面提到的应用实例,以及 RTOS 驱动文档,以了解到底如何初始化和共享驱动实例。此外,由于时间限制,并非所有的 IO 都能直接通过驱动 API 在 tile 之间共享。

SDK 提供了 ON_TILE(t) 预处理器宏。应用程序可以使用这个宏来确保某些代码在编译时只包含在一个特定的 tile 上。在这个例子中,有一个任务是在两个 tile 上都创建的,它可以启动驱动程序并创建其余的应用程序任务。虽然这个函数被写成一个单一的函数,但各个部分都在 #if ON_TILE() 块内。例如,考虑在 i2c_init() 函数中发现的以下代码:

#if ON_TILE(I2C_TILE_NO)
rtos_intertile_t *client_intertile_ctx[1] = {intertile_ctx};
rtos_i2c_master_init(
i2c_master_ctx,
PORT_I2C_SCL, 0, 0,
PORT_I2C_SDA, 0, 0,
0,
100);

rtos_i2c_master_rpc_host_init(
i2c_master_ctx,
&i2c_rpc_config,
client_intertile_ctx,
1);
#else
rtos_i2c_master_rpc_client_init(
i2c_master_ctx,
&i2c_rpc_config,
intertile_ctx);
#endif

当在 tile 0上编译时,只会包含第一个块中的代码。当编译其他 tile 时,只会包含第二块中的代码。当应用程序运行时, tile 0执行I2C主驱动主机的初始化,而其他 tile 初始化I2C主驱动客户端。因为I2C驱动实例是在两个 tile 之间共享的,所以它实际上可以被设置为0或1,提供了一个驱动实例可以在 tile 之间共享的方式的演示。

SDK提供了一个单一的XC文件,提供了main()函数。这个提供的main()函数调用main_tile0()main_tile3(),取决于应用程序需要的 tile 数量和目标xcore处理器提供的 tile 数量。应用程序必须提供这些 tile 入口点函数中的每一个。每一个都提供了最多三个通道端,这些通道端与其他各 tile 相连。

在这个示例应用程序中,提供了两个函数 main_tile0()main_tile1()。它们都调用了一个共同的初始化函数,用于初始化所有与 tile 相关的驱动程序的接口。这些函数还调用初始化函数,以便在不同的 tile 之间共享这些驱动实例。这些初始化函数可以在 platform/platform_init.c 源文件中找到。

然后,每个 tile 都会创建一个 startup_task() 任务并启动 FreeRTOS 调度器。startup_task() 完成了驱动实例的共享,然后启动所有的驱动实例。驱动程序的启动函数可以在 platform/platform_start.c 源文件中找到。

请参考 RTOS 驱动文档,以了解本程序调用的每个 RTOS API 函数的详细内容。

板卡支持配置

xcore利用其架构提供了一个灵活的芯片,其中许多典型的基于硅的外设可以在软件中找到。这使得芯片可以被重新配置,以提供特定应用所需的特定IO,从而产生一个低成本但令人难以置信的硅效率解决方案。板卡支持配置(bsp_configs)是对特定电路板中存在的硬件IO的描述。bsp_configs为程序员提供了一个初始化和启动硬件配置的API,以及支持的RTOS驱动上下文。这个FreeRTOS架构中的编程模型是:

  • .xn文件提供了端口、引脚和链接的映射关系
  • bsp_configs设置和启动硬件IO,并为应用程序提供RTOS驱动语境。
  • 应用程序使用bsp_config初始/启动代码以及RTOS驱动上下文,类似于传统的微控制器编程模型。

为了支持任何通用的 BSP_config,应用程序应该在启动调度程序之前调用 platform_init(),然后在调度程序运行之后和使用任何 RTOS 驱动之前调用 platform_start()

XCORE SDK 提供的 modules/rtos/modules/bsp_config 中的 bsp_configs 是一个很好的起点。它们提供了支持 XCORE SDK 的板子所支持的最常见的外围驱动。对于高级用户,建议您将这些 bsp_config 中的一个复制到您的应用项目中并根据需要进行定制。

开发和调试内存

XTC工具提供编译时间信息,以帮助开发人员创建和测试他们的应用程序。

资源使用情况

有一个名为 "-report" 的选项,可以显示资源使用情况的摘要。该报告的输出之一是内存使用情况,分为程序的堆栈、代码和数据需求。值得注意的是,与大多数 XC 应用程序不同,FreeRTOS 大量使用了动态内存分配。在 XTC 工具的报告中,堆的内存会被显示为 "数据"。堆的大小由编译时的定义 configTOTAL_HEAP_SIZE 决定,它可以在应用程序的 FreeRTOSConfig.h 中找到。

对于 AMP SMP FreeRTOS 的构建,使用 cmake 宏 merge_binaries() 创建,实际上有多个应用程序的构建,每个 tile 一个,然后将它们合并在一起。在构建一个特定的 AMP 应用程序时,控制台输出中将包含两个单独的 tile 构建报告。

例如,考虑构建目标 example_freertos_explorer_board

Constraint check for tile[0]:
Memory available: 524288, used: 318252 . OKAY
(Stack: 5260, Code: 42314, Data: 270678)
Constraints checks PASSED WITH CAVEATS.
Constraint check for tile[1]:
Memory available: 524288, used: 4060 . OKAY
(Stack: 356, Code: 3146, Data: 558)
Constraints checks PASSED.

Constraint check for tile[0]:
Memory available: 524288, used: 4836 . OKAY
(Stack: 356, Code: 3802, Data: 678)
Constraints checks PASSED.
Constraint check for tile[1]:
Memory available: 524288, used: 319476 . OKAY
(Stack: 14740, Code: 30730, Data: 274006)
Constraints checks PASSED WITH CAVEATS.

在这个例子中,cmake包含的命令如下:

merge_binaries(example_freertos_explorer_board tile0_example_freertos_explorer_board tile1_example_freertos_explorer_board 1)

这意味着最终的应用程序用法将被解释为:

Constraint check for tile[0]:
Memory available: 524288, used: 318252 . OKAY
(Stack: 5260, Code: 42314, Data: 270678)
Constraints checks PASSED WITH CAVEATS.
Constraint check for tile[1]:
Memory available: 524288, used: 319476 . OKAY
(Stack: 14740, Code: 30730, Data: 274006)
Constraints checks PASSED WITH CAVEATS.

因为tile1目标构建中的tile1部分取代了tile0目标构建中的tile1部分。

XTC工具还提供了一种方法来检查二进制文件构建后的资源使用情况。这个方法只有在对中间二进制文件使用时才会起作用。

$ xobjdump --resources tile0_example_freertos_explorer_board.xe
$ xobjdump --resources tile1_example_freertos_explorer_board.xe

请注意:由于生成的 example_freertos_explorer_board.xe 二进制文件是通过合并到 tile0_example_freertos_explorer_board.xe 创建的,因此 xobjdump -resources example_freertos_explorer_board.xe 的结果将与 xobjdump -resources tile0_example_freertos_explorer_board.xe 完全相同,并不考虑实际的 tile 1 要求。

构建RTOS应用

使用 SDK 的 RTOS 应用程序是使用 CMake 构建的。SDK 提供了许多库、驱动和软件服务,所有这些都可以被应用程序的 CMakeLists.txt 文件所包含。应用程序的 CMakeLists 可以通过使用各种 CMake 目标别名精确指定 SDK 中的哪些驱动程序和软件服务应该被包含。

有关 SDK 构建系统的更多信息,请参见构建系统

有关 SDK 构建系统中目标别名的更多信息,请参见目标别名

所有 SDK 示例应用程序都有一个 README 文件,其中包含了关于如何设置、构建和运行应用程序的额外说明。它们还包含一个 CMakeLists.txt 文件,可作为新应用程序的起点。请参阅 FreeRTOS 示例页面,了解所有示例应用程序的列表。

其他例子

FreeRTOS实例上提供了更多的代码实例。