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

ckuangling   2008-7-8 10:49 楼主
嵌入式linux下通信的方案咨询、感谢大拿指点

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

/目标/:

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

两个板子系统预留的通信接口方式有:CAN串行RS422
或者通过另一个FPGA模块进行通信(DSP->FPGA->ARM)

(由于ARM系统上图形处理的需要,所以构建了系统,采用Linux)
(ARM系统由我负责硬件设计与系统构建,DSP模块为别人设计的)
(DSP LF2812没有HPI接口)

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

/现有问题/:

目前我一直采用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. 另一种通信方法是通过FPGA模块,即:(DSP->FPGA->ARM)
   但这个时候存在一种问题,这三个模块是三个电路板,
   FPGA和ARM通过接插件并行连接,可以吗?信号驱动能力够吗
   (这种方法其实就是在FPGA里定义双口RAM,ARM对双口RAM进行访问)


4. 大家觉得这种通信最好采用什么样的方式呢?双口RAM?还是?
   (系统硬件目前没有设计双口RAM,但可以通过中间的FPGA来实现)

   我的第2,第3种,哪种好呢?


回复评论 (12)

LINUX本身就不是实时的系统,而硬中断的优先级又比较高,频繁切中断的话当然影响应用程序
这么麻烦干吗呢? 难道不能用以太网? 你的2410板子就没有设计网口?
点赞  2008-7-8 12:06
感谢 sherlock_lai

由于数据是通过DSP模块采集的,DSP模块上没有网络接口,所以只有通过现有的硬件接口来通信了。

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

3. 另一种通信方法是通过FPGA模块,即:(DSP->FPGA->ARM)
  但这个时候存在一种问题,这三个模块是三个电路板,
  FPGA和ARM通过接插件并行连接,可以吗?信号驱动能力够吗
  (这种方法其实就是在FPGA里定义双口RAM,ARM对双口RAM进行访问)


4. 大家觉得这种通信最好采用什么样的方式呢?双口RAM?还是?
  (系统硬件目前没有设计双口RAM,但可以通过中间的FPGA来实现)

  我的第2,第3种,哪种好呢?   或者还有什么方式呢?

点赞  2008-7-8 14:41
这里的问题不是你的通信速率,而是你的通信帧率。你既然熟悉CAN就用CAN来传递好了。

设置一个帧缓冲区,比如100帧一传,那你每秒就只有40个中断。

问题是有一点延时。但是延时应该不大。


具体的缓冲机制,可以根据你的实际情况来设计,权衡一下。

点赞  2008-7-8 15:06
18KB/s,没必要用双口RAM,除非有经验,或者时间和精力足够耗的起。

串口422,需要考虑串口的波特率。目前ARM9体系常用的UART波特率是115200bps, 按照8数据位1停止位无校验,加1开始位,相当于10bit传送1字节,其实是11520B/S=11.25KB/S,不够。

所以,只能用CAN了。

MCP2510配置完之后,准备开始大数据量传输前,设置成发送完不产生中断的。你将数据填到2410的SPI的FIFO中,通讯事情就交到SPI控制器了,只有在SPI通讯错误,或者SPI数据全部发送完毕才会产生中断来打断CPU进程。
点赞  2008-7-8 17:17
thank you fouryu and shuiyan

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!\n");

    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\n", mcp2510dev.nCanRevpos);
        DPRINTK("mcp2510dev.nCanReadpos= %d\n", 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));
    }
}

从这可以看到,SPI对MCP内部的接收缓冲器驱动一帧数据还是比较复杂的。我不是很理解你说的:
引用: 引用 4 楼 shuiyan 的回复:
MCP2510配置完之后,准备开始大数据量传输前,设置成发送完不产生中断的。你将数据填到2410的SPI的FIFO中,通讯事情就交到SPI控制器了,只有在SPI通…


请多多指点,感谢
点赞  2008-7-9 10:14
sorry,之前我想错了,瓶颈是在ARM接收的时候,而不是发送的时候。你的担心的确是正确的。

18KB/S,相当于18432B/S,每次要中断一下,会有百微妙级的中断频率,对于系统是个负担。造成这个问题的原因是:CAN是针对环境比较恶劣的系统通讯设计的,最常见在车载。linux是非实时操作系统,中断响应大概在几毫秒-10毫秒级别,的确不适用。就是说,两者不应该用在一个系统中。

既然ARM这边由你们设计,那不如这样做一下:MCP2510和CPU之间加一个小单片机,单片机通过SPI跟MCP2510通讯获取CAN有效报文,以及发送有效报文给MCP2510。
CPU和单片机之间随便用什么方式。
单片机内部是有RAM和flash的,哪怕只有256B的RAM,也可以用来做一个BUFFER,等从MCP2510读到200B的有效报文时,再通知CPU来读取这些数据。确保不会溢出就行。

相当于在CPU和MCP2510之间加一个FIFO了。谁让MCP2510的接收缓冲器只有1个字节呢。

或者,考虑换一个带fifo的CAN转发器。
点赞  2008-7-9 11:21
Thanks a million, shuiyan

/目前硬件已经完成/ 所以无法改动硬件了。
怎么说呢,我们这项目是学校里的一国家项目。也是我毕业课题,
现在看来,我感觉从一开始系统方案上就有些问题,
事已至此,下次做这样的东西,我绝不会这样弄了。

我这边硬件为s3c2410,可提供的接口有:
1. CAN (s3c2410不含CAN控制器,所以通过MCP2510外扩,mcp2510只有2个接收缓冲器)
2. 串口(用max491的可选RS485/422)(另RS232也有,速度应该最高115200,不够)
3. 预留的并行接口(不用的很多信号线控制线都预留出来了)

DSP模块端的接口可有CAN,RS422

如果通过DSP直接给ARM,那么CAN不行了的话,只能通过RS422了。
硬件为: UART2通过max491的RS422,我想通过DMA通道,定义缓冲区,
UART2接收到N个字节后,才通过DMA产生中断。 希望这种方式能够达到18KB/s
用RS422的话,需要修改驱动,linux下原有的串口驱动应该都是通过中断读取每个字节的。


如果通过DSP->FPGA->ARM,也是一种方式。那么就用并行的方式。
FPGA内定义一块双口RAM区,FPGA与ARM通过并行接口通信,在linux下写这个并行访问的驱动。
(但有个问题就是两者在两个电路板上,目前只能通过接插件连接,是否会信号驱动能力不够)


我自己打算从现在开始花3天的时间,弄好RS422驱动(利用DMA方式)。 这条路不会行不通吧?



点赞  2008-7-9 12:22
UART方式,在4楼已经计算过,不是DMA能否实现,而是UART的速率无法满足传输要求。
这个是CPU方面的限制,你外面用芯片转RS422,只是电平协议的转换,就像用MAX232转成RS232的电平协议一样,通讯波特率,数据位这样的设置其实还是一样的。

S3C2440倒是可以提升PCLK到60M,使得UART可以设926100Kbps,这个速度可以满足需求。
但是2410好像没看到这样的可能。
点赞  2008-7-9 14:40
thank you, shuiyan

the UART can generate an interrupt or a DMA request to transfer data between CPU and the UART.
The UART can support bit rates of up to 230.4K bps using system clock

当选择CPU内部时钟时:
UBRDIVn=(int)(PCLK/(bps*16))-1,
bps为所需要的波特率值,
PCLK为CPU内部外设总线(APB)的工作时钟。

感觉不是由PCLK来决定bps,是通过PCLK与所需的bps,计算出值,然后赋值给UBRDIVn。
这样不是bps可以设置得更高吗。不止115200


我测试一下。

点赞  2008-7-9 16:11
为何不用spi传输。
12Mbps,相当于1500KB/s。
完全能够达得到。
spi在linux下,是内部DMA传输的,也就是说,你设置一个缓冲区长度,在接收满这个缓冲区之前,系统通过内部的DMA传输,将spi数据传到内部RAM中。
这个时间很快,我测试过,系统平均一个字节可以达到12us的传输。不过,要改一下内核,因为内核默认是有个延迟的。

内核配置是可以改成硬实时,抢占式的,只要你任务不是很多,完全能够满足你的应用。
linux的中断不能在你用户空间使用,应该利用它的内核来实现。你的任务就是从内核缓冲区取数,这样才能达到要求。
点赞  2008-7-17 14:53
谢谢 flylonginsky , shuiyan ...

我重新计算了需要的数据传输速率:363600 bps

请问现在采用串口(我通过UART2扩展MAX491的RS422接口),是否能达到这个速率呢?

采用串口 UART2扩展MAX491的RS422 通信的话, 关于波特率:
1. UEXTCLK
查手册:The UART can support bit rates up to 115.2K bps using system clock. If an external device provides the UART with UEXTCLK, then the UART can operate at higher speed.是说当用系统时钟(system clock)时UART波特率最高可达到115200,但是如果用这个UEXTCLK(external clocks for the UART operation)串口外设时钟,可以设置115200以上的波特率。

采用系统时钟时,最高可达115200 bps。需要更高的话,需采用UEXTCLK。
请问这个 UEXTCLK 串口外设时钟 由什么提供呢? 需要通信接口中,由外设提供UART的时钟?
我现在硬件没有留这样的设计。

我的ARM上留的接口是CAN,UART(RS422),SPI,并行接口
采用并行接口,需要与其他CPU之间采用双口RAM的传输,另一模块的FPGA好像资源有限。

看来我只有通过SPI与FPGA直接通信来实现 363600 bps 的速率了。对吗?
点赞  2008-7-21 12:01
mark
点赞  2010-4-26 17:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复