打印

嵌入式linux下通信的方案咨询、感谢大拿指点

[复制链接]
1680|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuniu711|  楼主 | 2008-7-7 23:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
---------------------------------------------------------------------

/目标/:

实现 " ARM(s3c2410)-Linux2.4.18 " 与 " DSP LF2812 模块 " 
两个系统之间大约 18KB/s 的三维实时数据通信。

两个板子系统预留的通信接口方式有:CAN 或 串行RS422
(由于ARM系统上图形处理的需要,所以构建了系统,采用Linux)
(ARM系统由我负责硬件设计与系统构建,DSP模块为别人设计的)

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

/现有问题/:

目前我一直采用CAN的方式,但是ARM系统的CAN接口是通过MCP2510外扩,
每帧数据都会产生一个中断,在CAN驱动程序中处理中断,
感觉ARM-linux对中断的频繁处理响应太慢,不能满足 18KB/s 的数据通信。

我做过测试,在CAN驱动里加入内核定时器,在中断处理程序中加入中断计数,
来测试CAN接口的吞吐率,发现系统可能对中断响应太频繁,每秒最多响应200~300个中断。
并且此时对应用程序影响很大。

(如果采用CAN,若要满足通信要求,每秒需约4000个中断,即250us一次中断
并且还需要考虑在现有平台下,这些频繁中断对应用程序的影响)

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

/问题请教/:

1. 我是否就不应该采用这种频繁中断的方式来进行 18KB/s 的数据传输?
   这种方案本来就是行不通的?是幼稚的?

2. 目前在现有平台(ARM9 S3C2410 - Linux2.4.18)下
   我是否可以采用RS422, 通过串口DMA传输的方式来满足通信?

3. 大家觉得这种通信最好采用什么样的方式呢?双口RAM?还是?
   (系统硬件目前没有设计双口RAM)



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

附件压缩包里包括:

linux2.4.18_ARM9-S3C2410_MCP2510_CAN_driver (s3c2410-can-mcp2510.c 与相关头文件)
CAN通信测试应用程序
ARM9-S3C2410_CAN接口扩展_硬件设计.JPG

请高手给我看看,给我个建议的方案,感谢
相关链接:https://bbs.21ic.com/upfiles/img/20078/2007822234936464.rar

相关帖子

沙发
chunyang| | 2008-7-8 11:11 | 只看该作者

什么叫“三维实时数据通讯”?

18Kb/s的速度根本就是很低的速度,做好任务调度就是,中断可用可不用,由程序的整体结构和风格决定。建议楼主学习一下实时操作系统的思想,在操作系统下实现或者“裸奔”都行。

使用特权

评论回复
板凳
niuniu711|  楼主 | 2008-7-8 11:51 | 只看该作者

感谢 chunyang

“裸奔”程序不行,因为得支持图形重构,所以须加操作系统。

中断可用可不用,是什么意思?

MCP2510接收到数据后,将数据放到它的接收缓冲器中(它有2个接收缓冲器)
然后就会向ARM产生中断,通知ARM通过SPI接口来读取这一帧数据。
这样,我感觉,必须是每一帧产生一个中断。

驱动程序中中断处理程序,如下:

static void s3c2410_isr_mcp2510(int irq, void *dev_id, struct pt_regs *reg)
{
    unsigned char byte;

    DPRINTK("enter interrupt! ");

    byte=MCP2510_Read(CANINTF);
    
    if(byte & RX0INT){
        MCP2510_Read_Can(3,&(mcp2510dev.MCP2510_Candata[mcp2510dev.nCanRevpos]));
        MCP2510_WriteBits(CANINTF, ~RX0INT, RX0INT); // Clear interrupt
        NextCanDataPos(mcp2510dev.nCanRevpos);
        DPRINTK("mcp2510dev.nCanRevpos= %d ", mcp2510dev.nCanRevpos);
        DPRINTK("mcp2510dev.nCanReadpos= %d ", mcp2510dev.nCanReadpos);

    }

    if(byte & RX1INT){
        MCP2510_Read_Can(4,&(mcp2510dev.MCP2510_Candata[mcp2510dev.nCanRevpos]));
        MCP2510_WriteBits(CANINTF, ~RX1INT, RX1INT); // Clear interrupt
        NextCanDataPos(mcp2510dev.nCanRevpos);
    }

    if(byte & (RX0INT|RX1INT)){
        wake_up_interruptible(&(mcp2510dev.wq));
    }
}

使用特权

评论回复
地板
chunyang| | 2008-7-8 15:16 | 只看该作者

没有什么行不行的,只是要看是否必要

经验以及对相关技术的理解深度、广度将决定判断时的眼光。
是否使用中断同样要根据程序总体结构和任务的特性决定,即使使用中断,中断服务程序也可以只是简单的标志置位,大段的中断服务程序在多任务下是不明智的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

9

帖子

0

粉丝