首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用32位操作来执行ioread/write64 64

使用32位操作来执行ioread/write64 64
EN

Stack Overflow用户
提问于 2013-11-20 05:53:11
回答 1查看 2.7K关注 0票数 3

我使用旋风V执行读/写双口RAM (HPS_主->FPGA_从)。对于32位数据,它可以使用ioread32和iowrite32执行,但它不能满足我们的数据传输的目标速度(仅调优400 the后,在信号选项卡中需要更长的周期).Cyclone V使用ARM Cortex-A9 MPCore处理器(32位),但正如数据表中所述,AXI总线可以配置多达64位。asm/io.h只支持ioread32/iowrite32 32。我们尝试使用altera软件在HPS-FPGA中配置64位,我尝试使用下面的代码进行读/写,但是我得到了错误的数据。是否有适当的解决方案和方法来验证这一点?

代码语言:javascript
复制
static void iowrite64(u64 val,  u64 addr)
{
iowrite32((u32)val,  (u32) addr);
iowrite32(val >> 32, (u32)addr + 1);
}
static u64 ioread64 (u64 addr)
{
return ioread32(addr) | ((u64)ioread32((u32)addr + 1) << 32);
}

更新/解决方案:我们可以从日志中读取64位数据。下面是我们所做的改变。-驱动程序/amba/bus.c,我们将u32更改为u64。-we在io.h中添加另一个内联函数

代码语言:javascript
复制
    static inline u64 __raw_readq(const volatile void __iomem *addr)
    {
      u64 val;
      asm volatile("ldrd r2, %0" : "+Qo" (*(volatile u64 __force *)addr));
      register u32 v1 asm ("r2");
      val = v1;
      register u32 v2 asm ("r3");
     val=(val<<32) | v2; 
     return val;
   }

-printk可以打印32位,但我们打印2次。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-20 16:55:15

ARM版本的这些都是在https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/include/asm/io.h中。iowrite32宏最终将调用这些宏。您可以查看32位的实现。

代码语言:javascript
复制
static inline void __raw_writel(u32 val, volatile void __iomem *addr)
{
    asm volatile("str %1, %0"
             : "+Qo" (*(volatile u32 __force *)addr)
             : "r" (val));
}

有一个名为ARMv5+的strd指令,它接受两个寄存器并写入它们。如果对总线结构进行了适当的配置,则可能会将其作为单个周期运行。但是,您需要正确地设置许多其他东西。MMU对I/O页面的权限,以及ARM AXI与您的FPGA设备的物理/FPGA连接。

对于64位ARM汇编程序值,没有公开的gcc约束。当调用约定将它们放在r0r1中时,我们可以使函数永不内联。

代码语言:javascript
复制
static noinline void __raw_write64(u64 val, volatile void __iomem *addr)
{
    register u32 v1 asm ("r0") = val >> 32;
    register u32 v2 asm ("r1") = val & 0xfffffffUL;
    asm volatile("strd r0, %0"
             : "+Qo" (*(volatile u64 __force *)addr)
                 : "r" (v1), "r" (v2));
}

这至少是用objdump生成了好的代码,但是为了提高产品质量,您可能需要改进它。

这至少是所需的代码。我认为设备内存在默认情况下应该是不可缓存的和不可缓冲的。您可能需要障碍类型的说明以及。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20088419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档