che*_*rno 4 c++ malloc stl microblaze
有没有人为MicroBlaze编写了多线程C ++应用程序?Xilinx文档指出:
EDK随附的标准C库不是为多线程环境构建的。诸如printf(),scanf()的STDIO函数以及诸如malloc()和free()的内存管理函数是非线程安全函数的常见示例。在多线程环境中使用C库时,必须使用适当的互斥技术来保护线程不安全的函数。
此外,MicroBlaze GCC报告线程模型为“单个”。
如果我使用的是C ++标准库容器,那肯定是不安全的,对吗?
甚至从Xilinx那里得到关于这个简单问题的答案的时间也很短,更不用说解决它的方法了。似乎这是Xilinx提供的构建系统的主要缺陷。
Xilinx(通过电子邮件)的答案如下。它没有提到多线程。它还引用了他们的软件工具8.2i,该工具于2006年发布(6年前!!!)。简而言之,这没有任何意义。
得到教训:
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 ++应用程序
在EDK 8.2i之前,C ++应用程序可能会表现出异常行为,内存损坏等。要解决这些问题,请在应用程序编译中包括随附的源文件(newlib_malloc.c)。这将解决无法解释的崩溃。此变通办法解决了MicroBlaze C库中malloc()实现中的错误。从EDK 8.2i开始,此变通办法已合并到C库中。
该信息似乎也可以从以下位置获得:http : //www.xilinx.com/support/answers/23345.html
归档时间: |
|
查看次数: |
2035 次 |
最近记录: |