- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我还没有找到任何资源来准确回答我在我正在使用的软件中看到的问题,所以我会问这里的天才!
首先,我在 PowerPC 处理器上运行 VxWorks。
在尝试调试一个单独的问题时,我尝试在中断处理例程中抛出一些快速而肮脏的调试代码。它涉及一个 double 浮点运算来存储一个感兴趣的值(即,自从我看到最后一次中断进入以来已经过了多长时间),我后来在运行线程的处理程序之外使用了它。我没有看到这方面的问题(当然,它需要更长的时间,但在时间上我很满意;中断不会来得太快)但是 VxWorks 肯定不喜欢它。当它到达该代码时,它始终会崩溃,这是导致系统重新启动的严重崩溃之一。我花了一些时间才找到问题的根源是双重操作,我意识到它甚至不是双重“操作”,甚至从中断中调用的例程中返回常量 double 值也惨遭失败。
在 PowerPC(或其他一般体系结构)上,在中断处理程序中执行浮点运算并在中断处理程序调用的函数中返回浮点(或其他类型)值通常会出现问题吗?我不知道为什么这会导致程序崩溃。
(解决方法是将自上次中断以来的“滴答”转换为自上次中断以来的“时间”,直到代码超出处理程序为止,因为它似乎可以很好地处理长整数操作。)
最佳答案
在 VxWorks 中,每个使用浮点的任务都必须在创建任务时指定,以便在上下文切换期间保存 FP 寄存器,但仅当从使用浮点的任务切换时。这允许非浮点任务具有更快的上下文切换时间。
然而,当中断抢占浮点任务时,很可能是 FP 寄存器未保存的情况。为此,中断处理程序需要确定哪个任务被抢占,以及它是否已被指定为浮点任务;这会使中断延迟更高且可变,这在实时系统中通常是不可取的。
因此,要使其正常工作,任何使用 float 的中断例程都必须明确保存和恢复 FP 寄存器本身。任何使用 float 的任务在任何情况下都必须如此指定,但如果您只有一个这样的任务,您可以不用它。
如果浮点任务被抢占,您的中断将修改该任务使用的浮点寄存器值,当 FP 任务恢复时的结果是不确定的,但包括导致浮点异常 - 如果例如,先前非零寄存器变为零,随后用作除法运算的右侧。
然而在我看来,在这种情况下,浮点运算可能完全没有必要。您的“解决方法”实际上是最传统、最安全和最具确定性的方法,应该被视为对您的设计的修正,而不是解决方法。
关于c++ - 中断处理程序中的浮点运算(PowerPC、VxWorks),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6597030/
我需要在裸机 PowerPC 系统上编写程序。作为没有操作系统/ bootstrap 的裸机编程的新手,我决定编写一个 hello world 程序来开始。我在谷歌上搜索了一些关于这个的帖子,并发现了
我听说过很多有关 Altivec 寄存器的信息,但我什至在 POWER9 ISA 上都没有找到它。 。在该文档中,我只在第 6 章“矢量设施”和第 7 章“矢量标量浮点运算”下找到 VR 和 VSR
我无法在 PowerPC 440EP 上运行 node.js,我只收到错误“非法指令”。 硬件信息: cat /proc/cpuinfo processor : 0 cpu
如何从内存转储中反汇编一些指令?我只有原始转储,objdump 只理解对象格式。 我的处理器是 PowerPC 440(PowerPC Book E 架构)。 最佳答案 事实上,objdump 可以很
我有兴趣为我自己的学习目的开发一个 PowerPC 模拟器。我已经找到了大量有关 PowerPC 程序集编程的资源,但是经过一段时间的查找,我还没有在任何地方找到指令/操作码映射表。当然,我需要操作码
我有一个问题,我被要求声明一个结构数组,其中有一个结构,如下所示: typedef struct { int a; int b; int c; }blah; int main() { blah
我这里有一个 MPC5668G。我想从引导加载程序中的 asm 代码跳转到独立生成的主程序的主例程。因此,我使用一些编译指示和链接器将 main 方法(无论它链接到哪里)的地址放到内部闪存的末尾。那将
我正在为 C 程序编写一个汇编宏,并且对此很陌生,我陷入了一些困境。我正在尝试编写一个宏,用于将数据从通用寄存器移动到专用寄存器。 我的问题是,我发现将数据从 GPR 移动到 SPR 的语法采用恒定的
所以,我一直在为 Xbox 的简单逆向项目学习 PowerPC,但我总是在这样的事情上纠结。 lwz r11, 0(r29) # Loads 0x34 from 0x10710
交叉编译 Maliit 框架源代码时面临问题。 inputcontextdbusaddress.cpp: In member function 'virtual void Maliit::InputC
我有一个使用 Mysql 5.6 作为数据库的 Web 应用程序。该应用程序在 x64 系统中运行速度很快。但我们必须为客户端在 PowerPC 64 位机器上安装此应用程序。问题是应用程序在 x64
我有一个运行软处理器 (PowerPC) 的 Xilinx FPGA。我最近为 PowerPC 交叉编译了 Boost 库并想测试它。因此,我使用了其中一个示例程序并尝试针对我的目标对其进行交叉编译。
我对编码和构建应用程序还比较陌生,我想通过软件包为 PowerPC Linux 做出贡献。因此,我尝试将应用程序和工具移植到平台上,然后将它们打包到平台上,并尝试将它们打包到不同的发行版上,例如 ub
我们正在为 PowerPC 604 用嵌入式 C 编写实时软件. 接下来是我的两位同事之间的对话。我很难理解他们在说什么。 员工 1: In the PPC architecture, must in
我下载了MySQL-5.5.34的源码,按照说明编译。然后在/usr/local/mysql/bin 文件夹中我做了 ./mysqld_safe --user=root &mysql 服务器立即启动并
我还没有找到任何资源来准确回答我在我正在使用的软件中看到的问题,所以我会问这里的天才! 首先,我在 PowerPC 处理器上运行 VxWorks。 在尝试调试一个单独的问题时,我尝试在中断处理例程中抛
我有大量可在 PowerPC 上运行的源代码。我需要将它移植到 ARM。但是,ARM 在未对齐的内存访问上生成硬件异常。所以,我想找到所有可能发生未对齐内存访问异常的实例。我考虑了以下选项。 在 gc
我正在尝试打印 float 。尽管可变参数函数不适用于 float ,因此它们被提升为 double 。我可以通过将其转换为 double 来设法消除警告。在某些 powerpc 架构上打印结果时,如
我想在汇编代码中创建一个 ifdef 条件,类似于 C 中的预处理器。 例如: ifdef UNIT_TEST b somewhere else b somewhere else 我使用的是 e200
我有以下来自 PowerPc 内核源代码的代码片段 #define SPRN_IVOR32 0x210 /* Interrupt Vector Offset Register 32 */
我是一名优秀的程序员,十分优秀!