- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有人为 MicroBlaze 编写过多线程 C++ 应用程序? Xilinx 文档指出:
The standard C library provided with EDK is not built for a multi-threaded environment. STDIO functions like printf(), scanf() and memory management functions like malloc() and free() are common examples of functions that are not thread-safe. When using the C library in a multi-threaded environment, proper mutual exclusion techniques must be used to protect thread unsafe functions.
此外,MicroBlaze GCC 报告线程模型是“单一的”。
如果我使用 C++ 标准库容器,这肯定不安全,对吗?
我连从 Xilinx 那里得到这个简单问题的答案都花了不少时间,更不用说修复它的方法了。这似乎是 Xilinx 提供的构建系统的一个主要缺陷。
最佳答案
Xilinx 的回答(通过电子邮件)如下。它没有提到多线程。它还引用了他们在 2006 年(6 年前!!!)发布的软件工具 8.2i。简而言之,这没有任何意义。
经验教训:
malloc()
Microblaze C library shipped with a small, minimal functionality malloc(). When used, memory could not be freed. Other functions such as calloc, realloc, etc., were not supported. There were also bugs when using both malloc() and routines such as printf, scanf, etc. To fix this, the minimal functionality malloc() has been removed. It has been replaced by original Newlib malloc(). As a result, you should see NO functionality issues. You might see a code size increase of around 4K. Because of the differences in which the new full functionality malloc() requests memory, user programs might need to review their heap size settings. If you see your malloc() calls returning NULL, where they used to work, try increasing your heap size. This change was essential to fix broken functionality.
For the rare cases where you still want the original light-weight, but broken malloc() functionality, the source code (malloc.S) can be included as one of the source files to be compiled to build your application. This will retain the old functionality, code size requirements, and dynamic memory requirements seen prior to EDK 8.2i.
xil_malloc()
MicroBlaze C library shipped with an alternative implementation of dynamic memory allocation called xil_malloc(). This routine has some limitations; it does not allocate memory from the heap, but rather from a fixed 64K buffer. This routine has now been deprecated. Though this routine is still available for linkage, its use is strongly discouraged. Please use malloc(); it is smaller than xil_malloc() and provides better functionality. When using malloc(), make sure to review your heap size settings to satisfy your dynamic memory requirements.
The standalone BSP contains a parameter "need_xil_malloc". This parameter was intended to allow you to write code that contains malloc(), yet wire it to the xil_malloc() implementation. Due to bugs in the implementation of the parameter and due to the deprecation of xil_malloc(), this parameter is deprecated as well.
Xilkernel contains a parameter "use_xil_malloc". This parameter was intended to allow the kernel message queue implementations to use xil_malloc() instead of malloc(). Due to the deprecation of xil_malloc(), this parameter is deprecated as well.
If you still want xil_malloc() source code for legacy reasons, the "xil_malloc.c" and "xil_sbrk.c" files can be downloaded and used.
C++ Applications
Prior to EDK 8.2i C++ applications might exhibit unusual behavior, memory corruption, etc. To fix these issues, include the attached source file (newlib_malloc.c) as part of your application compilation. This will fix the unexplained crashes. This work-around fixes bugs in the malloc() implementation in the MicroBlaze C library. This work-around has been incorporated into the C library starting in EDK 8.2i.
此信息似乎也可在以下位置获得:http://www.xilinx.com/support/answers/23345.html
关于c++ - MicroBlaze 上 C++ 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13242002/
我有一个简单的 microblaze 设置,带有两个 GPIO(按钮和开关)。我想处理两个设备的中断。 这是我当前的非工作代码。 #include #include #include #include
我想编写我的代码来处理 Microblaze 上的 TLB 未命中,当然还有页表等。这一切都在 OVPsim 上完成。 在我学习的过程中,我编写了这个小程序集来引用未映射的位置 (0x1000000)
我们可以使用 EDK 在 Microblaze C 编程中展开循环吗? 这是必需的,因为我需要更多性能。传统上,我的 C 代码将串行运行,因此使用一些编译器指令展开循环可以加速我的应用程序。 (例如,
当我对在 Microblaze 上运行的代码进行一些修改时,有时会发现遵循相同路径的代码执行在运行时存在很大差异。为了说明我所说的相同路径的真正含义,请举个例子, if ( condition )
我想构建一个可重定位的库(即除了局部变量之外什么都没有。我还想强制库的位置位于内存中的固定位置。我认为这必须在 makefile 中完成,但我很困惑我必须做什么才能强制将库加载到固定位置。这是使用 m
我正在使用运行 Linux(内核版本 3.0)的 Xililnx 开发板。板上配置了microblaze。 我的主机运行 Ubuntu 12.04 X86_64 并安装了工具链 (tools-4.1.
我有一个针对 MicroBlaze CPU 的“c”代码。 当我在 Eclipse + GCC 或 Visual Studio 中调试代码作为 c 程序时,我得到了我想要的结果。 然而,当我在目标上奔
用 Microblaze 创建计时器的最佳方法是什么,这将使我能够让它更类似于 delay_ms() 或 sleep() 中的函数更传统的脚本? 很容易,我可以像这样创建一个愚蠢的函数: void d
一年多来,我一直在使用 C++ 为 Microblaze 处理器开发嵌入式软件。我的设计并没有那么复杂,所以我没有使用该语言强大的、面向对象的特性。 一段时间以来,我一直在努力增强我的设计结构。为此,
我有两个结构: Struct _size1 { union{ short a; struct { char
我正在 microblaze xilinx 13.1 中实现 UART。我想将rx值存储在fifo中,这是使用VHDL中的xilinx ipcore实现的。 我收到的字节是这样的, while(1)
我有一个用 C 编写的应用程序,用于 Xilinx Microblaze核。然而,性能并不是我想要的,所以我正在考虑重写汇编中的一些核心功能。我无法弄清楚如何让 Xilinx Platform Stu
在 echo 示例中,我们有这个函数可以再次发送相同的数据包,以便回显数据,我想更改它以便发送固定数据,无论用户发送什么,所以我更改了这个: err = tcp_write(tpcb, p->
有没有人为 MicroBlaze 编写过多线程 C++ 应用程序? Xilinx 文档指出: The standard C library provided with EDK is not built
所以我在互联网上找不到比 microblaze 和 lwip 的 echo 程序更简单的例子,它对我来说工作正常,这里是他们的文件: 回声.c: /* * Copyright (c) 2009 Xi
我对汇编语言和 microblaze cpu 还很陌生,并且在中断处理工作方面遇到问题。 我被迫编写自己的启动和初始化例程。 (通常包含在 crt0 中的东西)我想我在分支到指定地址的中断处理程序时做
我想要实现的目标是使用户空间中的内存块可以通过 PCIe 直接由 FPGA 板中的 DMA 内核访问(不受内核的任何干扰)。 为此,我在用户空间中使用 posix_memalign() 在用户空间中分
我正在 for 循环中尝试 xil_printf() 并通过 uart 将其提供给 SendBuffer。如何打印字符而不是整数?它所打印的只是十六进制数... uint32_t IRAM; for(
我的团队正在使用 microblaze,但我们在 ip 堆栈方面遇到了一些问题。 我通常不是嵌入式程序员,但我想学习如何提供帮助。 有没有关于IP栈的教程?这些是什么?它们是如何编程的?如何解决 IP
我有一个用 C 语言编写的应用程序,带有 Xilinx Microblaze 内核的内联汇编。我的内联汇编有一个延迟任务。函数“_delay_loop_X_x”正好延迟处理器每个循环的 4 个周期。输
我是一名优秀的程序员,十分优秀!