【问题标题】:Thread safety of C++ on MicroBlazeMicroBlaze 上 C++ 的线程安全
【发布时间】:2012-11-05 23:20:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 哇,这使得多线程 C++ 在平台上几乎无法使用。如果您制作了自己的线程安全内存分配器,将 newdelete 连接到它,并确保代码在任何线程中运行,但除了您自己的代码之外,您可以使用额外的线程进行计算/处理目的。但基本上这使得多线程在平台上几乎无法使用。

标签: c++ stl malloc microblaze


【解决方案1】:

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

经验教训:

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

ma​​lloc()

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 开始并入 C 库 8.2i。

此信息似乎也可通过以下方式获得:http://www.xilinx.com/support/answers/23345.html

【讨论】:

    猜你喜欢
    • 2020-04-10
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多