4

有没有人为 MicroBlaze 编写过多线程 C++ 应用程序?Xilinx 文档指出:

EDK 提供的标准 C 库不是为多线程环境构建的。STDIO 函数如 printf()、scanf() 和内存管理函数如 malloc() 和 free() 是非线程安全函数的常见示例。在多线程环境中使用 C 库时,必须使用适当的互斥技术来保护线程不安全函数。

此外,MicroBlaze GCC 报告线程模型是“单一的”。

如果我使用 C++ 标准库容器,这肯定是不安全的,对吗?

我什至可以从赛灵思得到这个简单问题的答案,更不用说解决它的方法了。这似乎是 Xilinx 提供的构建系统的一个主要缺陷。

4

1 回答 1

5

Xilinx 的答案(通过电子邮件)如下。它没有提到多线程。它还引用了他们在 2006 年(6 年前!!!)发布的软件工具 8.2i。简而言之,这没有任何意义。

得到教训:

  • 赛灵思的支持很糟糕。
  • Xilinx 软件工具是他们事后才想到的。
  • 我只能假设文档中概述的内容是正确的,特别是您不能在多线程环境中使用动态内存分配。这意味着没有 c++ 标准库容器。
  • 如果您是即将选择 MicroBlaze 软核处理器的硬件人员,请在执行此操作之前与固件人员核实。他希望写什么样的应用程序?确保他知道他不能用 C++ 编写多线程应用程序。

malloc()

Microblaze C 库附带了一个小的、最小的功能 malloc()。使用时,内存无法释放。不支持其他函数,例如 calloc、realloc 等。同时使用 malloc() 和例程(如 printf、scanf 等)时也存在错误。为了解决此问题,已删除最小功能 malloc()。它已被原始 Newlib malloc() 取代。因此,您应该不会看到任何功能问题。您可能会看到代码大小增加了大约 4K。由于新的完整功能 malloc() 请求内存的差异,用户程序可能需要检查其堆大小设置。如果你看到你的 malloc() 调用返回 NULL,它们曾经在哪里工作,请尝试增加你的堆大小。此更改对于修复损坏的功能至关重要。

对于您仍然需要原始轻量级但损坏的 malloc() 功能的极少数情况,可以将源代码 (malloc.S) 作为要编译的源文件之一包含在内以构建您的应用程序。这将保留 EDK 8.2i 之前的旧功能、代码大小要求和动态内存要求。

xil_malloc()

MicroBlaze C 库附带了另一种动态内存分配实现,称为 xil_malloc()。这个程序有一些限制;它不会从堆中分配内存,而是从固定的 64K 缓冲区中分配内存。此例程现已弃用。尽管此例程仍可用于链接,但强烈建议不要使用它。请使用 malloc(); 它比 xil_malloc() 小,并提供更好的功能。使用 malloc() 时,请务必检查您的堆大小设置以满足您的动态内存要求。

独立 BSP 包含一个参数“need_xil_malloc”。此参数旨在允许您编写包含 malloc() 的代码,但将其连接到 xil_malloc() 实现。由于参数实现中的错误以及 xil_malloc() 的弃用,该参数也被弃用。

Xilkernel 包含一个参数“use_xil_malloc”。此参数旨在允许内核消息队列实现使用 xil_malloc() 而不是 malloc()。由于 xil_malloc() 的弃用,该参数也被弃用。

如果您出于遗留原因仍需要 xil_malloc() 源代码,可以下载和使用“xil_malloc.c”和“xil_sbrk.c”文件。

C++ 应用程序

Prior to EDK 8.2i C++ applications might exhibit unusual behavior, memory corruption, etc. To fix these issues, include the attached source file (newlib_malloc.c) as part of your application compilation. This will fix the unexplained crashes. This work-around fixes bugs in the malloc() implementation in the MicroBlaze C library. This work-around has been incorporated into the C library starting in EDK 8.2i.

This information also appears to be available at: http://www.xilinx.com/support/answers/23345.html

于 2013-01-18T19:26:38.787 回答