有没有人为微封面编写了多线程C 应用程序吗?Xilinx文档指出:
EDK提供的标准C库不是为多线程环境构建的。stdio功能诸如printf(),scanf()和内存管理功能(如malloc()和 Free()是不螺纹安全的函数的常见示例。使用C库时 在多线程环境中,必须使用适当的相互排斥技术来保护 线程不安全的功能。
此外,Microblaze GCC报告了线程模型是"单个"。
如果我使用C 标准库容器,这肯定是不安全的,正确?
我有很多时间,即使从xilinx那里得到这个简单问题的答案,更不用说一种修复它的方法了。看来这是xilinx提供的构建系统的主要缺陷。
xilinx的答案(通过电子邮件)如下。它没有提及多线程。它还引用了他们的软件工具8.2i,该工具于2006年发布(6年前!!!)。简而言之,这是没有意义的。
学习的教训:
- xilinx支持很糟糕。
- xilinx软件工具对他们是事后的想法。
- 我只能假设文档中概述的内容是正确的,特别是您不能在多线程环境中使用动态内存分配。这意味着没有C 标准库容器。
- 如果您是要选择微封白色软核心处理器的硬件家伙,请在执行此操作之前先与固件人员联系。他期望撰写什么样的应用?确保他知道他不能在C 中编写多线程应用程序。
malloc()
微型布拉兹库库以小的,最小的功能运输 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"one_answers" xil_sbrk.c"文件。
C 应用程序
EDK 8.2i C 应用程序可能表现出异常行为, 记忆损坏等要解决这些问题,包括附加的 源文件(newlib_malloc.c)作为应用程序汇编的一部分。 这将修复无法解释的崩溃。此工作可以修复错误 Malloc()在Microblaze C库中实现。这 从EDK开始的C库中已将工作组合到C库中 8.2i。
此信息似乎也可在以下网址提供:http://www.xilinx.com/support/answers/23345.html