问题标签 [nios]
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.
exception - 硬件或软件中断或陷阱指令异常?
手册说_
陷阱指令
当程序发出陷阱指令时,处理器会产生软件陷阱异常。当程序需要操作系统提供服务时,程序通常会发出软件陷阱。操作系统的通用异常处理程序确定陷阱的原因并做出适当的响应。
但是,当我之前询问它时,答案说这是一个软件中断:
对于不同的架构,异常和中断之间的差异似乎也略有不同,因此可以有 4 种组合 (?) 的硬件、软件、异常和中断。
现在我正在为一个小型系统研究这个程序集,我认为我可以自己学习个别指令,但我正在寻求帮助以理解更大的图景,为什么事件完全是软件异常而不是硬件异常,硬件中断,软件中断。
c - 此代码保存了有关中断线程的哪些信息?
我的分析是程序集将被中断线程的堆栈指针保存到数组中。那是对的吗?我一直在看的我认为这样做的代码是:
我认为第一条指令ldw
(加载字)将堆栈指针保存到 r4 寄存器,然后 r4 将成为线程开关的参数:
看来我理解正确了吗?计时器中断线程,该线程保存有关被中断线程的信息,这就是上面的代码所做的,而保存的有关线程的信息是它的堆栈指针?
完整的汇编:
C
c - 绕过 Nios II 处理器中的数据缓存
我有以下 C 源文件,需要删除一些代码并添加一些代码以绕过 Nios_2_r2c 处理器上的数据缓存。我不知道该怎么做。
文件:switch.c
文件:ledr.c
通过使用 I/O 读取和写入的内联汇编获得它:
文件:switch.c
文件:ledr.c
assembly - 请帮助我理解这个 nios2 代码
我们为 nios2 提供了一些我不完全理解的程序集。如果我们可以从这条指令开始,那么我不明白它的用途:
.set noat # required since we push r1
这是什么意思?我查看了手册,但没有与此匹配的内容。
除了上面的说明之外,我认为我可以理解个别说明,但我仍然无法真正掌握该程序的用途。我们将它与我们的 C 代码一起用于计算机工程课程的实验室练习,现在我有点忘记了代码的作用,我想知道您是否可以提供帮助。谢谢
c - NIOS II 中的内存写入 - 值放入错误的地址
首先,我应该承认我已经在altera 论坛(http://www.alteraforum.com/forum/showthread.php?t=40494)上提交了这个问题。我也在这里问,因为我认为它可能是完全不同的观众。如果这个重复的帖子违反任何堆栈溢出规则或礼仪,请告诉我,我会删除它。如果不是,我会用我在这里收到的任何答案更新论坛提交,反之亦然。
我正在尝试将来自 opencores 的 I2C 内核集成到我的 Cyclone IV 设备中。显然,我正在使用的版本应该只是放入 SOPC 并在连接到某些输出(alterawiki.com/wiki/I2C_(OpenCores))后工作。核心编译时没有错误或警告。
带有内核的 I2C 文档显示了 6 个相关寄存器依次寻址(PRERlo、PRERhi、CTR、TXR、RXR、CR、SR)。但是,当我尝试写入这些寄存器时,无论是从我的代码中还是在调试内存窗口中手动写入,都会被放入错误的地址。
为了调查这一点,我将寄存器设置为 VHDL 中的初始值,以在调试窗口中查看结果。这表明 TXR 和 CR 的寄存器地址不是文档中建议的。
但是,这很好,当我尝试写入地址 09866174 (TXR) 时,值将插入到 09866164 (PRERhi)。同样,当我写入 09866178 (CR) 时,该值将插入 09866168(CTR)。无论写入来自代码还是手动来自调试窗口,都会发生这种情况。这尤其令人困惑,因为在 VHDL 中写入这些寄存器可以正常工作。
我也试图从信号抽头调试这个。但是,从未实现任何寄存器上的触发器。
如果有人能在这里指出正确的方向,我将不胜感激。
谢谢!
-update:我一直在使用 VHDL 版本的内核。但是,我决定暂时放弃并使用 Verilog 版本,当我连接它时,它几乎可以立即工作。我打算在我的应用程序完成后回到 VHDL 核心,然后再更新它。
c - 为什么我的生产者 - 消费者模式有意外的输出?
在这个练习(生产者 - 消费者)中,3 个生产者各有一个线程并产生质数。但是当我运行程序时,消耗的第一个素数不是它产生的第一个素数,所以我没有得到预期的输出。你能帮我找到并纠正错误吗?
这是带有模式的主文件:
其余文件可在此处获得。
当我运行代码时,我从生产者那里得到了预期的输出,但我没有得到消费者的预期输出:
你能告诉我为什么前 30 个素数会被覆盖,而我所做的只是遵循规范并从代码中删除注释以激活教师为我们准备的学习内容吗?由于没有得到任何好的帮助,我已经好几个月没能完成这个练习了。前 30 个素数被神秘地覆盖,程序不应更改(这是家庭作业)。我问了教练,他没有,说我正在使用更新版本的软件。我可以尝试使用旧版本的软件,但这似乎不是一个可能的解决方案。
更新
我能想到的策略是开始使用调试器并在执行期间检查 FIFO ADT。我没有太多使用 gdb 的经验,所以如果可以,请帮助我。
fpga - uClinux 可以在 Altera DE2-115 上运行吗?
我正在寻找有趣的方式来使用我的 FPGA(Altera DE2 和 DE2-115),似乎 uClinux 在其发行版中包含一些 DE2-115 的文件,但没有文档说明如何使用它。如果不是在 DE2-115 上运行 Linux,那么 DE2-115 目录中的文件有什么用?
c - 'dev_addr' 未声明(在此函数中首次使用)
我正在使用 NIOS II - Eclipse 这是我的代码示例我基本上是在尝试调用一个函数
几行之后我尝试调用它
当我尝试构建它时,会抛出未声明的错误“dev_addr”(在此函数中首次使用),它指向该行
我试图使代码简短,只写我认为必要的。如果有人想查看更多详细信息,我很乐意为他们提供。
c - 我正在尝试写入寄存器 hi 的某些位以启动电源模式进入睡眠状态
我的问题是我读取了 ADI_DEV_CORE_STATUS 的值,它仍然为 0x2A,即使在我在位 22 上写入断言 1 以启用电源模式请求之后,我在值没有改变后直接打印出该值。
我正在尝试发送一个进入休眠模式的请求,
在 ADI DEV CORE STATUS 寄存器中,
第 26 位定义为电源模式失败(只读),
第 25 位定义为处于睡眠状态的核心(只读),
第 24 位定义为部分休眠(读/写)的电源模式请求,
第 23 位定义为休眠模式(读/写)的电源模式请求,
第 22 位定义为启用主机发起的电源模式请求(读/写),
第 21 位定义为启动发送 COMWAKE Burst 模式以从休眠中唤醒(读/写)
第 5 位被定义为 Phy-Ready(只读),
位 4 定义为复位(读/写),
第 3 位定义为指示设备状态机处于空闲状态(只读),
bits[2:0] 定义为当前接口速度(0h:无连接)(1h:已建立 Gen1 速率)(2:h:已建立 Gen 2 速率)(3h:已建立 Gen3 速率)(为后代保留的其他值)
代码中定义的其他值
我所有的 alt_printf(值是 %x”,读取);打印出 0x2a,我应该在启用电源模式时读取 0x40002a,在启用电源模式时读取 0xC0002a,并且我正在发送休眠模式的电源请求和 0x2000000当核心处于睡眠状态时。
assembly - 为什么要使用 TRAP 指令?
我研究了陷阱指令,但对我来说它没有什么意义,并且看起来与throws exception
Java 或类似的类似,它是相似的还是有什么作用?它只是说TRAP
指令总是会产生异常,我为什么要这样做?没有足够的信息让我理解为什么以及在哪里使用TRAP
.