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