精华内容
下载资源
问答
  • 1 引言 4 2 DSPLINK介绍 5 2.1 GPP端 5 2.2 DSP端 5 2.3 DSPLINK关键组件 6 2.3.1 PROC 6 2.3.2 CHNL 6 2.3.3 MSGQ 7 2.3.4 POOL 7 2.3.5 NOTIFY 7 2.3.6 MPCS 7 2.3.7 MPLIST 8 ...5.2.7 MPCSXFER 40
  • 关键部分代码如下所示: // 把sin_buffer这个数组的值写到共享内存上 SRBuffer *buffer = SR_buffer_new(SHARED_BUFFER_ADDR, SHARED_BUFFER_SIZE);(1) char *data = (char *)SR_buffer_data(buffer);...

    关键部分代码如下所示:

    	 // 把sin_buffer这个数组的值写到共享内存上
     	SRBuffer *buffer = SR_buffer_new(SHARED_BUFFER_ADDR, SHARED_BUFFER_SIZE);(1)
        char *data = (char *)SR_buffer_data(buffer);(2)
        memcpy(data, sin_buffer, SR_buffer_size(buffer));(3)
    
        sleep(2);
    
        // 产生起始信号,触发DSP的中断
        Trigger *trigger = trigger_new();(4)
        trigger_line(trigger, EVENT_LINE_2_ARM_DSP);(5)
        trigger_destroy(trigger);(6)
    
        // 等待结束信号,即等待DSP触发ARM的中断
        IRQEvent *event = irq_event_new("/dev/input/c674x_irq_events");(7)
        uint32_t line;
        assert(irq_event_wait(event, &line) && line == EVENT_LINE_0_ARM);
        irq_event_destroy(event);
    
        // 从共享内存中读出内容,存到freq_buffer数组里
        float freq_buffer[1024];
        memcpy(freq_buffer, data, SR_buffer_size(buffer));
        SR_buffer_destroy(buffer);
    

    #define SHARED_BUFFER_ADDR 0xC2000000
    #define SHARED_BUFFER_SIZE 0x1000
    首先分析(1): SRBuffer *buffer = SR_buffer_new(SHARED_BUFFER_ADDR, SHARED_BUFFER_SIZE);
    SRBuffer是一个结构体,其内容如下:
    struct _SRBuffer {
    int fd;
    void *map_base;
    void *data;
    uint32_t size;
    bool is_bad;
    };

    SRBuffer *buffer = SR_buffer_new(SHARED_BUFFER_ADDR, SHARED_BUFFER_SIZE);
    ->
    SRBuffer *SR_buffer_new(uint32_t phy_addr, uint32_t size) {
        SRBuffer *buffer = (SRBuffer *)calloc(1, sizeof(SRBuffer));
    
        buffer->fd = open("/dev/mem", O_RDWR | O_SYNC);
    /*/dev/mem是物理内存的全映射,包括整个处理器的地址空间,具体包含地址总线上的所有可寻址空间和IO空间,
    但要保证这些物理地址是有效的,可以从这些地址上访问到数据。理论上可以映射0-0xffffffff的地址空间。*/
        if (buffer->fd < 0) {
            fprintf(stderr, "fail to open /dev/mem\n");
            buffer->is_bad = true;
        }
        else {
            off_t addr = phy_addr ;
            off_t off_page = addr & ~(sysconf(_SC_PAGE_SIZE) - 1); 
    /*sysconf(_SC_PAGE_SIZE)可以得到一页的大小,一般是4096k,因为映射的地址必须的是一页大小的整数倍,所
    以可以通过与0x111取反后做与运算,从而将0-3位清零。假如phy_addr是0xE8000020,经过运算之后就是0xE8000000*/
            buffer->map_base = mmap(NULL,  addr + size - off_page, 
                                    PROT_READ | PROT_WRITE, MAP_SHARED, buffer->fd, off_page);
    /*mmap就是把一个文件的内容在内存里面做一个映像。映射成功后,用户对这段内存区域的修改可以直接反映到内
    核空间,同样,内核空间对这段区域的修改也直接反映用户空间*/                                                    
            if (buffer->map_base == (void *) -1) { 
                fprintf(stderr, "fail to map %x\n", (uint32_t)addr);
                close(buffer->fd); 
                buffer->is_bad = true;
            }
    
            buffer->data = buffer->map_base  + addr - off_page;
            buffer->size = size;
            buffer->is_bad = false;
        }
    
        return buffer;
    }
    

    再来分析(2) char *data = (char *)SR_buffer_data(buffer);

    void *SR_buffer_data(const SRBuffer *buffer) {
        assert(buffer);
        return buffer->is_bad ? NULL : buffer->data;
    }
    

    如果前面的映射没有出错的话,就返回buffer->data,以后用户对buffer->data的操作就相当于对
    SHARED_BUFFER_ADDR 0xC2000000进行操作。
    同理SR_buffer_size(buffer),就是返回要操作的内存的大小。

    uint32_t SR_buffer_size(const SRBuffer *buffer) {
        assert(buffer);
        return buffer->is_bad ? 0 : buffer->size;
    }
    

    所以(3) memcpy(data, sin_buffer, SR_buffer_size(buffer))就是把size大小(4094byts)的sin_buffer数组的值复制到从SHARED_BUFFER_ADDR 0xC2000000起始的一段地址上。
    接下来,通过触发DSP的中断来通知DSP。
    Trigger *trigger = trigger_new();(4)

    Trigger *trigger_new() {
        Trigger *trigger = (Trigger *)calloc(1, sizeof(Trigger));
    
        trigger->fd = open("/dev/mem", O_RDWR | O_SYNC);
    
        if (trigger->fd < 0) {
            fprintf(stderr, "fail to open /dev/mem\n");
            trigger->is_bad = true;
        }
        else {
            off_t addr = SOC_SYSCFG_0_REGS + SYSCFG0_CHIPSIG ;
            uint32_t size = sizeof(uint32_t);
            off_t off_page = addr & ~(sysconf(_SC_PAGE_SIZE) - 1); 
    
            trigger->map_base = mmap(NULL,  addr + size - off_page, 
                                    PROT_READ | PROT_WRITE, MAP_SHARED, trigger->fd, off_page);
            if (trigger->map_base == (void *) -1) { 
                fprintf(stderr, "fail to map %x\n", (uint32_t)addr);
                close(trigger->fd); 
                trigger->is_bad = true;
            }
    
            trigger->chipsig = trigger->map_base  + addr - off_page;
            trigger->size = size;
            trigger->is_bad = false;
        }
    
        return trigger;
    }
    

    与(1)中分析类似,经过上述初始化后,就可以通过chipsig来对位于01C1 4174h的Chip Signal Register寄存器进行操作。
    这个寄存器的描述如下:
    DSP可以访问ARM中断映射中的4个ARM中断事件:SYSCFG_CHIPINT0,
    SYSCFG_CHIPINT1, SYSCFG_CHIPINT2, and SYSCFG_CHIPINT3。ARM可以访问3个DSP中断事件映射中的中断事件:SYSCFG_CHIPINT2, SYSCFG_CHIPINT3, 和 NMI。
    ARM可以通过设置CHIPSIG[3-2]两位中的一个来生成对DSP的中断,或通过设置CHIPSIG[4]生成NMI中断。DSP可以通过设置CHIPSIG[3-0]四位中的一个来中断ARM。将1写入这些位将设置中断,写入0无效。读取返回这些位的值,也可以用作状态位。
    在这里插入图片描述
    在这里插入图片描述
    trigger_line(trigger, EVENT_LINE_2_ARM_DSP);(5)
    这个函数的原型是:

    void trigger_line(Trigger *trigger, uint32_t line) {
        assert(trigger);
        assert(line < EVENT_LINE_4_DSP_NMI/* unsupported now */);
    
        if (! trigger->chipsig) {
            fprintf(stderr, "fail to trigger line(%d) by previous error\n", line); 
            return;
        }
    
        *trigger->chipsig = 1 << line;
    }
    

    经过前面的判断之后,最后实际起作用的是:

    *trigger->chipsig = 1 << line;
    

    *trigger->chipsig = 1 << EVENT_LINE_2_ARM_DSP;
    

    EVENT_LINE_2_ARM_DSP在这里实际表示的含义是2,它是枚举类型,定义在event_line.h中,

    typedef enum {
        EVENT_LINE_0_ARM = 0,
        EVENT_LINE_1_ARM,
        EVENT_LINE_2_ARM_DSP,
        EVENT_LINE_3_ARM_DSP,
        EVENT_LINE_4_DSP_NMI,
        EVENT_LINE_MAX,
    } EventLine;
    

    第一个枚举成员的值为整型的0,后续枚举成员的值在前一个成员上加1。
    所以执行完(5)之后,就将CHIPSIG2位置1,生成对DSP的中断。
    trigger_destroy(trigger);(6)中会解除映射,并释放内存。

    void trigger_destroy(Trigger *trigger) {
        if (! trigger)
            return;
    
    	munmap(trigger->map_base, trigger->size); 
        close(trigger->fd);
    
        free(trigger);//释放内存,与calloc搭配使用
    }
    

    以上就完成了触发DSP中断的任务,下面就是ARM等待DSP中断的过程。
    IRQEvent *event = irq_event_new("/dev/input/c674x_irq_events");(7)
    这里的/dev/input/c674x_irq_events是通过相应的驱动产生的,源文件位于:https://download.csdn.net/download/qq_40788950/10910219 写一个很简单的Makefile即可运行生成
    c674x_irq_events.ko文件,然后insmod c674x_irq_events.ko即可添加这个驱动。下一篇文章简单分析一下这个驱动文件。

    展开全文
  • 接着分析下半部分ARM等待DSP的中断 // 等待结束信号,即等待DSP触发ARM的中断 IRQEvent *event = irq_event_new("/dev/input/c674x_irq_events");(1) uint32_t line assert(irq_event_wait(event, &...

    接着分析下半部分ARM等待DSP的中断

     // 等待结束信号,即等待DSP触发ARM的中断
        IRQEvent *event = irq_event_new("/dev/input/c674x_irq_events");(1)
        uint32_t line
        assert(irq_event_wait(event, &line) && line == EVENT_LINE_0_ARM);(2)
        irq_event_destroy(event);(3)
    
        // 从共享内存中读出内容,存到freq_buffer数组里
        float freq_buffer[1024];
        memcpy(freq_buffer, data, SR_buffer_size(buffer));
        SR_buffer_destroy(buffer);
    

    IRQEvent *event = irq_event_new("/dev/input/c674x_irq_events");(1)

    在加载c674x-irq-events.ko驱动后,就可以生成生成/dev/input/c674x_irq_events的设备节点了。

    IRQEvent *irq_event_new(const char *dev) {
        IRQEvent *event = (IRQEvent *)calloc(1, sizeof(IRQEvent));
    /*以只读的方式打开/dev/input/c674x_irq_events该设备节点,并指向event->fd*/
        event->fd = open(dev, O_RDONLY);
        if (event->fd < 0) {
            fprintf(stderr, "fail to open %s\n", dev);
        }
    
        return event;
    }
    

    IRQEvent 是一个结构体,它的内容如下:
    struct _IRQEvent {
    int fd;
    };
    assert(irq_event_wait(event, &line) && line == EVENT_LINE_0_ARM);(2)

    bool irq_event_wait(IRQEvent *event, uint32_t *line) {
        assert(event);
    
        if (event->fd < 0) {
            fprintf(stderr, "fail to wait event by previous error\n");
            return false;
        }
    
    
        // wait event
        int i = 0;
        for (i = 0; i < 4; i++) {
            fd_set input;
            /*将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在
            系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。*/
            FD_ZERO(&input);
            /*;用于在文件描述符集合中增加一个新的文件描述符。*/
            FD_SET(event->fd, &input);
            /*检查input是否可读,不需要监测可写的或者异常的描述符,且超时设置为NULL,select将一直阻塞,直到
            某个文件描述符上发生了事件*/
            int ret = select(event->fd + 1, &input, NULL, NULL, NULL);
            if (ret < 0) {
                fprintf(stderr, "fail to wait event : %s\n", strerror(errno));
                return false;
            }
    
            // read event
            struct input_event buf;
            /*将buf整个清零*/
            memset(&buf, 0, sizeof(struct input_event));
            /*将从event->fd中读到的内容存到buf中*/
            if (read(event->fd, &buf, sizeof(struct input_event)) < 0) {
                fprintf(stderr, "fail to read event : %s\n", strerror(errno));
                return false;
            }
    
            if (i == 0) {        // 一次只能处理一个中断,
        /*后续还可能有KEY_PROG3、KEY_PROG4的处理,但目前只用到前两个*/
                switch(buf.code) {
                case KEY_PROG1:
                        *line = EVENT_LINE_0_ARM;     break;
                case KEY_PROG2:
                        *line = EVENT_LINE_1_ARM;     break;
                default:    
                    fprintf(stderr, "unexpected key code");
                    return false;
                }
            }
        }
    
        return true;//表示接收到了中断
    }
    

    综上,(2)的作用就是表示收到了中断,且是中断0。
    (3)的作用是关闭相应的文件描述符,释放内存。

    void irq_event_destroy(IRQEvent *event) {
        if (! event)
            return;
    
        close(event->fd);
        free(event);
    }
    
    展开全文
  • 代码为基于TI公司OMAPL138双核器件C语言实现,基于SYSLINK实现双核通信,ARM端基于linux3.3, DSP端基于SYSBIOS实时操作系统,以UPP以8位并行口中断方式回环通信,对于需要使用双核通信与UPP的项目,绝对值得拥有
  • OMAPL138双核通信组件DSPLINK开发入门.
  • 以SEED—DIM138开发板作为硬件开发平台,利用SYSLINK驱动设计了一种可用于DSP和ARM之间通信的握手机制。ARM端运行Linux操作系统,进行人机交互;DSP端运行SYSBIOS操作系统,进行数据存储和买时运算。两者使用SYSLINK...
  • OMAPL138基于SYSLINK的双核通信LED实例
  • Linux及OMAPL138双核开发学习

    千次阅读 2015-09-08 11:38:32
    虽然编程5年,但是最近才开始学Linux,初学一头雾水,决定写个技术博客,以激励自己进步,也便于以后复习。...本人学习的Linux-3.3,芯片用的OMAPL138双核心构架(ARM+DSP)。 计划持续更新,求大神指点。

     IPC: Inter-Process Communication 进程间通信
     GPP: General Purpose Processor
     PRU: Pragramable Real-Time Unit
     EMIF: external memory interface
     uPP: universal parallel port  通用并行接口
     终端ZOC:终端模拟器,用于通过Serial,Telnet等方式访问基于字符通信的主机。
     TI官方提供的交叉编译工具链arm-2009q1压缩包,在Windows下解压会报错,原因是Windows文件名对大小写不不明感,但是在Linux端不会报错,Linux系统对字符的大小写是敏感的,就这还浪费了3个小时。以后一定要注意,能在Linux端做的尽量在Linx端作。
     AISgen:用于生成ais文件,*.ais文件可以用串口下载到FLASH中运行。CCS编译生成的*.out文件用于仿真器下载。
    ----------------------------------------------------------------------------------------------
    虚拟机VMware 10.0.1,调试的同时连接外网的方法:
    调试:用网线直接连接开发板。     外网:主机(Win7)用WIFI连接路由器。
    第1步   【虚拟机】->【设置】->【添加】->【适配器】(选择桥接模式,其余用默认参数)
    第2步   【编辑】->【虚拟网络编辑器】->选中桥接模式的那个网络->将【VMnet信息】中的【桥接模式】改为有线连接而非WIFI
    >>理解及解释:VMware会根据【虚拟网络编辑器】中的配置来使用新添加的适配器。如这里添加的【桥接模式】,则所添加的网络就会按照【虚拟网络编辑器】中【桥接模式】的配置来使用。在【虚拟网络编辑器】中可以看到三个网络,分别为对应【VMnet信息】中的三种模式。第二步的目的就是修改新添加的适配器的桥接方式,避免其连到WIFI上去,导致无法调试开发板。
    第3步   sudo gedit /etc/network/interfaces,然后按照需要配置,看看应该能懂的。
    auto loiface lo inet loopback
    auto eth0iface eth0 inet dhcp
    #address 192.168.1.99
    #gateway 192.168.1.1
    #netmask 255.255.255.0
    #network 192.168.1.0
    #broadcast 192.168.1.255

    auto eth1
    iface eth1 inet static
    address 192.168.2.128
    gateway 192.168.2.1
    netmask 255.255.255.0
    network 192.168.2.0
    broadcast 192.168.2.255

    # 改完后运行此脚本,立即生效
    service network restart

    -------------------------------------------------------------------------------------------
    Ubuntu(linux)中查看端口等信息,用 dmesg 命令,比如查看串口 dmesg | grep serial
    ----------------------------------------------------------------------------------------
    通过串口查看开发板上所有进程:ps -A  //更多ps命令 ps -h
    ----------------------------------------------------------------------------------------
    Linux环境下使用代码编辑器(查看器)
    方案一:先安装wine,
    Wine是一个转换层(或程序装入器),能够实现在Linux上运行Windows程序(但并非全部Win程序),但是亲测Beyond Compare 4 和 Source Insight 恰好可以,QQ和有道词典No。
    方法二:使用kscope
    : 安装教程参考    http://blog.chinaunix.net/uid-25885064-id-2747802.html
    ---------------------------------------------------------------------------------------------
    获取shell脚本自身所在目录的Shell脚本,
    #!/bin/bash
    SOURCE="$0"
    while [ -h "$SOURCE"  ]; do # resolve $SOURCE until the file is no longer a symlink
        DIR="$( cd -P "$( dirname "$SOURCE"  )" && pwd  )"
        SOURCE="$(readlink "$SOURCE")"
        [[ $SOURCE != /*  ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
    done
    DIR="$( cd -P "$( dirname "$SOURCE"  )" && pwd  )"

    ---------------------------------------------------------------------------------------------
    编译linux-3.3内核
    清理了整个内核源码编译目录:
    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean
    配置内核:
    Host# make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- da850_omapl138_tl_defconfig
    Host# make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
    编译内核:
    Host# make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage -j4 > /dev/null

    ---------------------------------------------------------------------------------------------------
    关于SD卡启动:
      boot盘里的boot.scr是boot的启动参数,而boot.scr可以通过boot.cmd编译得来,用mkimage编译,编译命令:
      mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n 'Execute Boot Script' -d boot.cmd boot.scr

    -----------------------------------------------------------------------------------------------



    mount  mydirectory   /dev/mydev;  # 即便mydirectory目录下已经有其他文件或文件夹,也能正常挂载  






    展开全文
  • OMAPL138基于SYSLINK的双核例程,用于大家熟悉DSP异构结构下的通信方式
  • OMAPL138的DVSDK双核开发教程

    千次阅读 2014-07-15 14:57:13
    基于OMAPL138的DVSDK双核开发教程 1 DVSDK安装  本文提供的DVSDK双核开发步骤的开发环境如下: PC操作系统:Win7-64bit 虚拟机版本:VMwareWorkstation 7.0.0 Ubuntu版本:Ubuntu10.04-32bit DVSDK版本:...
  • OMAPL138的DSPLINK开发入门

    千次阅读 2014-07-15 09:59:00
    OMAPL138双核通信组件DSPLINK开发入门 1 DSPLINK介绍  DSPLINK的软件架构如下图示:   1.1 GPP端  GPP(General Purpose Processor)是指和DSP端通信的通用处理器,在本文特指OMAPL138平台的ARM端。 ...
  • 首先,本文根据塞拉门系统功能要求,提出详细的功能设计方案,然后介绍了双核通信的基本架构及双核通信的实现基础,确定了采用双核芯片作为塞拉门控制器的核心控制芯片。并通过与早期的塞拉门系统控制的设计方式的对比,...
  • OMAPL138初体验

    2013-09-11 19:26:12
    前段时间就一直有关注OMAPL138,听说它的性能很强大,也对,毕竟是ARM+DSP双核的,对于我这种算是渣渣的技术宅来说,可谓先进技术啊,大神请别吐槽!  最近终于有用到了OMAPL138,是和创龙电子科技有限公司合作的...
  • OMAPL138核间中断

    2016-03-01 10:02:00
    1、采用TI官方提供的syslink 组件作为双核通信的驱动,会存在设计复杂,占用资源比较多 2、OMAPL138有核间中断如图: 其中,SYSCFG_CHIPINT的0和1用作ARM中断,2和3用作DSP中断。 内存分配:32MLinux----16...
  • OMAPL138多核MCSDK开发

    千次阅读 2014-07-14 20:31:09
     EXEC_DIR =/home/tl/omapl138/demo-rootfs  //syslink 驱动和演示程序安装路劲,一般设置为 nfs 或者 SD 卡的文件系统   (4)  DEPOT =_your_depot_folder_ 改为  DEPOT = /home/tl/ti  //MCSDK 的...
  • 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 一、简介 TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然现在也有管脚全兼容的单核。本文要介绍的就是其中的一款低功耗...
  • 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 一、简介 TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然现在也有管脚全兼容的单核。本文要介绍的就是其中的一款低...
  • 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 一、简介 TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然现在也有管脚全兼容的单核。本文要介绍的就是其中的一款低...
  • OMAPL138调试笔记

    2019-09-28 05:15:48
    nfsroot=192.168.0.5:/home/tl/omapl138/rootfs: 挂载的是 IP 地址为 192.168.0.5 的虚拟机 nfs 服务器/home/tl/omapl138/rootfs 目录下的文件系统。 nfsaddrs=192.168.0.8:192.168.0.5:192.168.0.1:255.255.255....
  • DSP+ARM多核异构开发环境搭建OMAPL138 ...OMAPL138属于多核异构平台(DSP+ARM),多核通信是多核异构平台的精髓部分,目前市面上流行的还有ZYNQ平台(FPGA+ARM),同样通信机理复杂。德州仪器OM...
  • 1.OMAPL138中的nandwritter是运行在ARM上的,用于把AIS格式UBL和U-Boot烧到Nandflash上的一个程序,使用CCS编译,然后用仿真器加载在ARM核上运行,通过交互式对话框就可以把UBL和U-Boot烧到指定设备上。 2.UBL...
  • 610E - OMAPL138开发入门

    2012-06-01 22:16:40
    本文要介绍的就是其中的一款低功耗处理器OMAPL138OMAPL138包括一个主频300M的ARM9处理器内核和一个300M的C6748DSP内核(均是32位处理器)。此外还有大量外设在此不做说明,与通用的ARM与DSP内核相比有如下一些...
  • OMAPL138 定位系统开发(一)

    千次阅读 2016-04-29 15:22:52
    OMAPL138 定位系统开发(一) ...经过一些列的资料搜索加上个人尤其钟爱TI公司的芯片,选择了OMAPL138这一块ARM+DSP双核的芯片。主要是这一款芯片的应用还算是比较多,赶紧买了一块开发板,紧锣密鼓的开始学习Lin

空空如也

空空如也

1 2 3 4 5
收藏数 87
精华内容 34
关键字:

omapl138双核通信