linux下ARM处理器对16位FPGA的访问问题

发布者:平和梦想最新更新时间:2016-08-08 来源: eefocus关键字:linux  ARM处理器  FPGA  访问问题 手机看文章 扫描二维码
随时随地手机看文章
有一个朋友在调试arm和FPGA接口的时候碰到了一个奇怪的问题,向我寻求帮助。

问题描述:

arm使用s3c2440,fpga和arm的接口为16位,使用地址线,片选线为ncs3,操作系统使用linux-2.4

测试程序为:test.c

#define FPGA_Address 0x18000000
int main( )
{
 unsigned char *sp;
 unsigned short mem;
 int memfd;
 memfd=open ("/dev/mem",O_RDWR);  
 sp=(unsigned char *)mmap(0,10000,PROT_READ|PROT_WRITE,MAP_SHARED,memfd,FPGA_Address);
 *(unsigned short*)(sp+0x20c)=0x5678;

 *(unsigned short*)(sp+0x20e)=0x1234; 
 munmap(sp,10000);
 close(memfd);

程序说明:因为linux下对不能对物理绝对地址进行访问,需要使用mmap函数进行内存映射;

编译方法:arm-linux-gcc -o test test.c

该程序在运行的时候不能正确的向fpga的地址内部写入16位的shor类型,经过逻辑分析仪观察,发现在向16位的地址空间写入0x5678的时候,实际上是向fpga内部写了两次,一次是:0x5656,另外一次是0x7878;同理,当写0x1234的时候,也是分为两次写入的:一次是0x1212,另外一次是0x3434。

如果将上述程序修改一下,在ads下直接编译运行,程序能够成功。这说明程序是没有问题的,fpga对arm的接口时序也应该是没有问题的。

这让我困惑不已。

明明是一个16位的short类型,arm和fpga的接口也是16位的,为什么要分为两次送入,看来是编译器的问题,准备使用反汇编的工具看看源代码。在ads下,可以直接看到反汇编后的代码,在linux下,

发现arm-linux-objdump工具也可以对目标代码进行反汇编:用法为

arm-linux-objdump -d -t test >aa

使用>aa重定向将输出信息打印到文件中:

    841c: e50b0010  str r0, [fp, -#16]
    8420: e3a03f83  mov r3, #524 ; 0x20c
    8424: e51b2010  ldr r2, [fp, -#16]
    8428: e0833002  add r3, r3, r2
    842c: e3a02078  mov r2, #120 ; 0x78
    8430: e3a01056  mov r1, #86 ; 0x56
    8434: e5c32000  strb r2, [r3]
    8438: e5c31001  strb r1, [r3, #1]
    843c: e3a03f83  mov r3, #524 ; 0x20c
    8440: e2833002  add r3, r3, #2 ; 0x2
    8444: e51b2010  ldr r2, [fp, -#16]
    8448: e0833002  add r3, r3, r2
    844c: e3a02034  mov r2, #52 ; 0x34
    8450: e3a01012  mov r1, #18 ; 0x12
    8454: e5c32000  strb r2, [r3]
    8458: e5c31001  strb r1, [r3, #1]

   通过反汇编,果然看到了使用了两条strb的指令将一个16位的数据分为两个8bit的数据送出;

   strb指令:从源寄存器将一个8bit的数据送到存储器,该字节为源寄存器的低8位。

    问题找到了,如何将一个16位的数据一次性的输出呢,在网络搜索了一下,发现有一篇文章也谈到了这个问题

     http://blog.csdn.net/liuqx/archive/2008/10/18/3094962.aspx

     只要在编译的时候指明-march=armv4选项即可:

使用下面的命令重新编译:

 arm-linux-gcc -march=armv4 -o test test.c

反汇编后得到的指令为:

    8494: e3a02c56  mov r2, #22016 ; 0x5600
    8498: e2822078  add r2, r2, #120 ; 0x78
    849c: e1a01002  mov r1, r2
    84a0: e1c310b0  strh r1, [r3]
    84a4: e3a03f83  mov r3, #524 ; 0x20c
    84a8: e2833002  add r3, r3, #2 ; 0x2
    84ac: e51b2010  ldr r2, [fp, -#16]
    84b0: e0833002  add r3, r3, r2
    84b4: e3a02c12  mov r2, #4608 ; 0x1200
    84b8: e2822034  add r2, r2, #52 ; 0x34
    84bc: e1a01002  mov r1, r2
    84c0: e1c310b0  strh r1, [r3]

  strh指令:从源寄存器将一个16bit的数据送到存储器,该字节为源寄存器的低16位。

关键字:linux  ARM处理器  FPGA  访问问题 引用地址:linux下ARM处理器对16位FPGA的访问问题

上一篇:ARM学习笔记(三)时钟分频器设置
下一篇:LPC ARM使用SPI总线控制8个LED灯

推荐阅读最新更新时间:2024-03-16 15:04

ARM平台嵌入式Linux下SPI设备连接
简介:在嵌入式ARM平台设备上,经常有在一个SPI bus上面挂接一个或者多个SPI设备的需求,由于挂载一个设备的情况比较简单,本文主要就在嵌入式Linux环境下挂载多个SPI设备进行说明。 本文所采用的硬件为Toradex 公司Colibri VF61计算机模块和开发载板,核心为Cortex-A5和M4异构双核,这里A5运行Toradex官方发布的Embedded Linux BSP V2.5,M4核心这里不做使用。 本文涉及Toradex发布Embedded Linux源码下载,Device Tree 定制编译,相关操作请参考下面文章,本文不做赘述。 http://developer.toradex.com/kno
[单片机]
基于DSP和FPGA的高精度数据采集卡设计
引言 当前,许多领域越来越多地要求具有高精度A/D转换和实时处理功能。同时,市场对支持更复杂的显示和通信接口的要求也在提高,如环境监测、电表、医疗设备、便携式数据采集以及工业传感器和工业控制等。传统设计方法是应用MCU或DSP通过软件控制数据采集的A/D转换,这样必将频繁中断系统的运行,从而减弱系统的数据运算能力,数据采集的速度也将受到限制。本文采用DSP+FPGA的方案,由硬件控制A/D转换和数据存储,最大限度地提高系统的信号采集和处理能力。 系统结构 整个采集卡包括信号调理、数据采集、数据处理和总线接口设计。系统结构如图1所示。 图1 系统结构框图 本文设计了具有信号衰减、增益放大和滤波等功能的
[缓冲存储]
基于Linux平台下的FPGA的ARM驱动开发方法
Linux操作系统的全称是GNU/Linux,它是由GNU工程和Linux内核两个部分共同组成的一个操作系统。该系统中所有组件的源代码都是自由的,可以有效保护学习成果,因而在嵌入式领域得到了广泛的应用。 FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,该器件是作为专用集成电路ASIC (Application Specific Integrated Circuit)领域中的一种半定制电路而出现的,它的出现既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。在通信行业、传输网、医疗仪器、各种电子仪器、安防监控、电力系统、汽车电子以及消费类电子中都大面积使用。随着产
[单片机]
基于<font color='red'>Linux</font>平台下的<font color='red'>FPGA</font>的ARM驱动开发方法
基于RTAI的嵌入式Linux硬实时性能的研究与实现
0 引言 Linux是一种能运行于多种平台、源代码公开、免费、功能强大、遵守POSIX标准、与Unix兼容的操作系统。随着嵌入式系统的不断发展和应用,嵌入式Linux操作系统也在各方面得到了广泛的应用。但是,作为通用操作系统的Linux,要应用在嵌入式领域,需要作必要的改进。在电能质量监控等对实时性要求较高的领域,需要将最初按照分时系统目标设计的Linux改造成能支持硬实时性的操作系统。 uClinux操作系统是Linux操作系统的一个嵌入式变种,它作为一种优秀的嵌入式操作系统具有很好的稳定性和优异的网络性能,但是它的实时性差,尤其不支持硬实时任务的特点却极大地限制了其应用。本文利用RTAI对uClinux的实时性进行了扩展
[单片机]
基于RTAI的嵌入式<font color='red'>Linux</font>硬实时性能的研究与实现
基于51单片机和FPGA的人机交互系统的设计
在现代各类仪器的开发中,人机交互功能正起着无可替代的作用。人机交互界面友好的仪器将更容易操作和使用,从而提高工作效率。液晶显示器(LCD)具有功 耗低、价格低、寿命长、接口控制方便等特点,在科研与设计领域正发挥着越来越大的作用。FPGA作为单片机外设的接口芯片,可以大大简化接口电路,通过对 FPGA进行编程,可以实现常用的译码、地址选通等功能。 本文以C8051F020单片机与FPGA互连系统为控制核心,以液晶显示控制器T6963C为例,结合行扫描键盘,简述了一种人机交互功能的设计。 1 系统设计方案 FPGA可在很大程度上扩展单片机的资源,然而人机交互功能仍应尽量减少对单片机及FPGA的资源消耗,以便将更多的片内资源
[单片机]
基于51单片机和<font color='red'>FPGA</font>的人机交互系统的设计
目标FPGA!TI推出66AK2L06多核DSP
日前,DSP领军者TI推出其最新基于KeyStone架构的66系列DSP处理器66AK2L06。66AK2L06 SoC集成了JESD204B接口标准,让总体电路板封装尺寸实现了高达66%的缩减。该集成也可帮助航空电子、防御系统、医疗以及测试与测量等市场领域的用户开发出具有更高性能同时能耗减少高达50% 的产品。此外,开发人员还可从TI数字信号处理器 (DSP)的可编程性与多个高速ADC、DAC和AFE的预验证中受益。凭借多核软件开发套件 (MCSDK) 与射频软件开发套件 (RFSDK), 66AK2L06 SoC进一步实现了TI的系统级解决方案,从而加快了产品上市的进程。 取代FPGA 以前做数据转换时
[嵌入式]
目标<font color='red'>FPGA</font>!TI推出66AK2L06多核DSP
OK6410A 开发板 (八) 30 linux-5.11 OK6410A 进程相关的寄存器
我们知道,linux运行的时候,其实是 各个进程的运行 虽然,会有下面几种状态 1. 不同进程的切换 2. 进程不同状态的切换 但整体上来讲,系统运行起来的时候 ,其实 是不同进程 运行的集合 进程分为以下三类 用户进程/用户线程 用户态 内核态 内核线程 我们讨论寄存器的时候,不关心 他是用户进程还是用户线程,所以归结为用户进程 所以依据寄存器来看,讨论分为以下三类 1.用户态的用户进程 2.内核态的用户进程 3.内核线程 内核线程 内核线程位于 svc mode , 有 17个寄存器 r0 - r15 , cpsr , spsr 以 idle 进程为例
[单片机]
安全通信系统的FPGA实现的方法
绪论   信息安全的解决方案目前主要集中于采取单一的措施来保证信息的安全性,针对各种攻击手段,防范措施主要集中于信息加密技术、安全交换机技术、防火墙技术、认证技术,入侵检测技术等,这些技术从不同的方面对安全性提供了较好的保障,但各有缺点和不足,这将成为网络防护的软肋,因此,本文也尝试性地提出了一种集数据加密技术和访问控制策略于一体的信息安全解决方案。   加密算法的硬件实现具有高速率、高可靠性、高安全等特点,因此,加密算法在 FPGA 平台中实现是一种很好的硬件实现方案。本文在xilinx公司的spartan-3e平台中构建一个嵌入式系统来实现安全网络通信。 系统设计   该系统主要针对信息传输过程中存在信息泄露、信
[嵌入式]
安全通信系统的<font color='red'>FPGA</font>实现的方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved