问题标签 [microblaze]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 带有 microblaze 的软件中断
我正在尝试让软件中断在 microblaze 中运行,但遇到了一个完整的障碍。因此,由 Vivado 设计生成的 xparameter.h 文件没有为我启用的 sw 中断生成的任何宏。
所以我开始研究打中断模块寄存器。从数据表中我可以看到 base_addr+0x0 是 ISR,base_addr+0x8 是 IER。然后是 IVAR。
我在代码中完成了以下操作。
然后开始中断我试图点击 ISR 寄存器
任何帮助将不胜感激。
c - 带有 freeRTOS 的 Microblaze 中断示例给出了 _interrupt_handler 的多个定义
我已经使用具有 FreeRTOS 的 Xilinx SDK 创建了一个简单的示例程序,但我遇到了一个似乎非常意外的问题。我想触发一个软件中断,所以我以这种方式设置了代码。
当我尝试编译它抱怨:
我检查了 portasm.S ,其中包含以下代码:
我不清楚如何解决这个问题,有没有其他人遇到过这个问题。
任何帮助是极大的赞赏。提前致谢。
c - FreeRTOS 中的抢占
我开始使用 FreeRTOS,我想要一个中断来抢占任何即将运行的任务并运行我需要严格运行的任务。
有没有办法在 FreeRTOS 中做到这一点?(这是通过任务优先级实现的吗?)
assembly - 如何使用 microblaze 组件将 32 位值加载到寄存器
我正在考虑使用 Microblaze 的汇编语言创建一些代码,但我不知道如何加载具有 32 位数字的通用寄存器。我浏览了指令集,但只看到可以加载的 16 位立即数。
有人可以提供一个如何做到这一点的例子。
我可以用
我很困惑。任何能帮助我指出正确方向的帮助都会很棒。
c - 如何在 microblaze 中为固定地址编译库
我想构建一个可重定位的库(即,除了局部变量之外什么都没有。我还想强制库的位置位于内存中的固定位置。我认为这必须在 makefile 中完成,但我我很困惑我必须做什么才能强制将库加载到固定位置。这是使用 mb-gcc。
我需要这个的原因是我想编写一个加载程序,我不想破坏实际上正在复制另一个程序的代码。因此,我希望正在执行复制的程序位于未使用的位置(即 ddr)的其他位置。
如果我将所有的函数都编译到库中,我需要什么特殊的 makefile 参数来强制将其加载到例如位置 0x80000000。
任何帮助将不胜感激。提前致谢。
c - GCC 变量对齐问题
我正在为 Microblaze 处理器使用 GCC 编译器。最近我遇到了一个变量对齐的问题。我注意到有时编译器会将静态变量分配给未对齐的地址(该地址不能被 4 整除),因此如果我将未对齐变量的指针发送给任何函数,我都会得到未对齐的访问硬件异常。
关于该主题,我有两个问题:
如何确保所有静态变量都对齐?有没有强制要求的标志?目前我正在使用变量属性:
但这很不舒服,因为我需要为我拥有的每个静态变量定义它,这没有意义。
- 有没有办法确保我的函数局部变量(在堆栈中分配)将对齐?我的意思是有没有办法确保我的堆栈头对齐,每个函数都使用堆栈的对齐部分,并且在堆栈中分配的任何变量都是对齐的。
谢谢。
c - 用 Microblaze 设置计时器?
用 Microblaze 创建计时器的最佳方法是什么,它可以让我让它更类似于类似功能delay_ms()
或sleep()
更传统的脚本工作?
很容易,我可以创建一个像这样的愚蠢函数:
...但这只会让处理器在完成之前什么都不处理,而实际上我需要它具有允许我在一段时间内停止一个进程而另一个进程继续工作的功能。
毫无疑问,这样的事情是可能的,但是解决这个问题的最简单的方法是什么?
(我使用的是 Spartan-3A,但我相信该解决方案也适用于不同的套件和 FPGA。)
vhdl - MicroBlaze MCS 中的指令和数据是如何组织的?
我实际上正在研究我在我的 FPGA 中实现的 MicroBlaze 微控制器系统。但我想了解这个 MCU 是如何工作的。让我们考虑这个框图:
我们可以看到处理器通过 2 条 32 位总线连接到 BRAM 模块中。这些总线之一是 ILMB(指令本地内存总线),另一个是 DLMB(数据本地内存总线)。我们可以看到两者都连接到 BRAM 模块的不同端口。所以我的问题是:在哈佛架构中,程序指令和随机存取存储器不应该分开吗?当我们使用 Xilinx IP 内核生成器生成系统时,我们放入的内存大小是程序指令的大小、RAM 还是两者兼而有之?
我搜索了 xparameters.h 头文件中的定义,以找到 ILMB 和 DLMB 的内存中的地址,我发现两者的地址范围相同。
指令和数据都在同一个地址引用的事实让我感到困惑。有人能告诉我哪里错了吗?
gcc - 为寄存器定义寄存器别名
如何在汇编文件('.S')中为 microblaze 定义寄存器别名?所以我可以用这个别名写指令,比如
对于 ARM 来说是ctx .req r12
。两者都不适用于 microblaze .req
。.register
文件是用 GCC 编译的。
linux - 在 MicroBlaze 处理器上运行的“并行 for”构造的 OpenMP 执行在插入 for 循环时被阻止
我对在 Microblaze 处理器上运行的 OpenMP 实现“GOMP”(即 GNU OpenMP)有疑问。MicroBlaze 处理器位于内核主线中,赛灵思为其提供了 pthread 实现。所以我从 pthread 实现开始交叉编译了 GOMP 库,并插入到运行在 Microblaze 上的 Linux 内核中(即 3.10 版本,名为 Petalinux)。具体来说,运行 Parsec 基准测试之一(这里是链接(http://parsec.cs.princeton.edu/download.htm)),即 blackscholes,突出显示了问题。显示问题的代码部分如下:
}
blackscholes 可以使用不同的输入集和不同的线程号启动,使用以下命令: blackscholes _num_threads_ _input_file_ _output_file_
使用 1、2、3、5、7 线程等启动它,遵循奇数,效果很好。使用 4、6、8、10 线程等启动它,在偶数之后,它会阻塞。同样,通过将常数 NUM_RUNS 减少到 1,应用程序运行良好。我的问题是:GOMP 实现是否有可能在 for 循环之后遭受工作共享构造插入(即 omp 并行)?
谢谢你。