有没有人为C++编写过多线程MicroBlaze应用程序?Xilinx文件指出:
与EDK一起提供的标准C库不是为多线程环境构建的。STDIO函数(如printf()、scanf() )和内存管理函数(如malloc()和free() )是非线程安全函数的常见示例。在多线程环境中使用C库时,必须使用适当的互斥技术来保护线程不安全的函数。
此外,MicroBlaze GCC报告说线程模型是“单一的”。
如果我使用的是C++标准库容器,这肯定是不安全的,对吗?
我甚至从Xilinx那里得到了这个简单问题的答案,更不用说解决这个问题的方法了。这似乎是Xilinx提供的构建系统的一个主要缺陷。
发布于 2013-01-18 19:26:38
以下是来自Xilinx (通过电子邮件)的答复。它没有提到多线程。它还引用了他们于2006年(6年前)发布的软件工具8.2i。总之,这是毫无意义的。
汲取的经验教训:
malloc() Microblaze C库附带了一个小的、最小的功能malloc()。使用时,内存无法释放。其他功能,如calloc、realloc等,则不受支持。在使用malloc()和printf、scanf等例程时也会出现错误。为了解决这个问题,删除了malloc()的最小功能。它已经被原来的Newlib malloc()所取代。因此,您应该不会看到任何功能问题。您可能会看到代码大小增加了大约4K。由于新的完整功能malloc()请求内存的不同,用户程序可能需要检查它们的堆大小设置。如果您看到您的malloc()调用返回NULL,则尝试增加堆大小。此更改对于修复损坏的功能至关重要。 对于少数情况下,您仍然想要原始的重量轻,但损坏的malloc()功能,源代码(malloc.S)可以包括作为源文件之一,以编译您的应用程序。这将保留在EDK8.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++ Applications 在EDK8.2i之前,C++应用程序可能会出现异常行为、内存损坏等。要解决这些问题,请将附加的源文件(newlib_malloc.c)作为应用程序编译的一部分。这将修复无法解释的崩溃。这个解决方案修复了MicroBlaze C库中malloc()实现中的bug。这项工作已纳入C库,从EDK 8.2i开始。
此信息也可在以下网站获得:http://www.xilinx.com/support/answers/23345.html。
https://stackoverflow.com/questions/13242002
复制相似问题