我正在开发一个GBA仿真器,并致力于实现CPU周期。我只知道它的基本知识,每一个指令的手臂和拇指模式,作为每一组不同的周期为每一个指令。目前,我只是简单地说,每个手臂指令花费4个周期和拇指指令花费2个周期。但是,如何像CPU文档所说的那样实现它呢?指令周期是否取决于它当前访问的内存的哪个部分?http://nocash.emubase.de/gbatek.htm#cpuinstructioncycletimes根据上面的规范,它说不同的内存区域有不同的等待状态,但我不知道它的确切含义。此外,什么是非序贯循环,序贯循环,内循环,协处理器循环?我在一些GBA源代码中看到,他们正在使用PC来计算每条指令需要多少个周期才能完成,但是他们是如何做到的呢?
发布于 2013-11-15 00:46:20
这只是部分答复,因此可能不允许:
目前,我只是简单地说,每个手臂指令花费4个周期和拇指指令花费2个周期。
实际上,如果我正确地记住了ARM,实际发生的是,在一个记忆周期中,您可以获取一个32位的ARM指令,或者两个16位的拇指指令。当然,执行时间与指令有关.
指令周期是否取决于它当前访问的内存的哪个部分?http://nocash.emubase.de/gbatek.htm#cpuinstructioncycletimes根据上面的规范,它说不同的内存区域有不同的等待状态,但我不知道它的确切含义。
不同的内存区域可能有比CPU更多的数据客户端。尤其是在图形/视频存储器中,需要从RAM中提取像素才能发送到显示器。除非您使用更快(读:更贵)内存,CPU和图形硬件将不得不轮流访问RAM。因此,取决于有多少其他RAM客户端,在CPU到达RAM之前可能需要几个周期。
它甚至可能不是那么高尚--制造商可能只是决定他们可以用更慢的(读到:更便宜的) RAM来处理大部分的程序和数据空间,并且只对那些绝对需要它的东西使用一小块快速内存。
此外,什么是非序贯循环,序贯循环,内循环,协处理器循环?
顺序与非顺序是指按顺序或无序读取内存位置.RAM被安排为按行和列地址索引的存储单元的二维数组。如果您按升序访问内存位置(例如,0、1、2、3、4、5等),则只需更改(大多数情况下)列地址,并且每次连续读取比非顺序访问地址更快。从链接到的文档判断,您似乎可以免费获得CAS增量,但是完整的RAS+CAS需要额外的周期。
内部循环意味着CPU正在运行,“哇,这太复杂了,给我一些额外的时间来解决这个问题。”( MUL指令就是这方面的典型例子。)
协处理器周期是指与ARM协处理器交谈所需的时间。我不知道,如果有的话,ARM协处理器在GBA中。
至于实现:这不适合于一个单一的答案。如果是我,我会独立于指令执行时间来模拟RAM访问时间。当CPU读取/写入内存时,将访问的内存地址与所访问的前一个内存地址进行比较。如果它们是相邻的(M(当前) == M(前一个)+ 4),那么它是免费的;否则添加一个循环惩罚。然后添加您要访问的内存区域所施加的延迟。
https://softwareengineering.stackexchange.com/questions/216421
复制相似问题