繁体   English   中英

MicroBlaze上C ++的线程安全性

[英]Thread safety of C++ on MicroBlaze

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

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

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

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

我对Xilinx提出的这个简单问题的答案感到很难,更不用说修复它了。 这似乎是Xilinx提供的构建系统的一个主要缺陷。

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

得到教训:

  • Xilinx支持非常糟糕。
  • 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 ++应用程序

在EDK 8.2i之前,C ++应用程序可能会出现异常行为,内存损坏等。要解决这些问题,请将附加的源文件(newlib_malloc.c)作为应用程序编译的一部分。 这将解决原因不明的崩溃。 这种解决方法修复了MicroBlaze C库中malloc()实现中的错误。 从EDK 8.2i开始,这种解决方法已经整合到C库中。

此信息似乎也可从以下网址获得: http//www.xilinx.com/support/answers/23345.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM