达夫设备

http://www.oschina.net/question/583160\_66329

void send_duff(char *to, char *from, int count)
{
        int  n = (count + 7) / 8;
        switch(count % 8) {
        case 0: do {    *to++ = *from++;
        case 7:         *to++ = *from++;
        case 6:         *to++ = *from++;
        case 5:         *to++ = *from++;
        case 4:         *to++ = *from++;
        case 3:         *to++ = *from++;
        case 2:         *to++ = *from++;
        case 1:         *to++ = *from++;
                } while(--n > 0);
        }
}

1、我们意在不经过一个char 
,一个char的传递。尽可能拔取已有可控的带宽。例如64位系统,我们就用64位传递。128位系统,就用128传递,当然这些和数码存储地点也有涉嫌。有的系统,外部MEM到片上是32位的,而片内L2到TCM是64位的。而TCM到寄存器是128位的。同时你是 C语言设计程序,仍旧设计DMA等总线控制器的一有的也不一样。但基本精神不变,就是最大化的接纳可控的软硬件资源。落到C程序上,就是尽量使用编译器能支撑的大位宽数据类型。

2、由于函数接口要求,对大位宽,例如64位或32位,没有另外约束,包括伊始地址边界对齐问题和传输量的题目。由此需要各自对待。

3、首先需要关注传输量的问题。

4、其次关注开头地址偏移量不同的题目。

5、实际在循环中多次的,存在一个位移的业务,例如五次可传输64位,则需要两组64位数据,依照源地址,和对象地址偏移量的差值做适当运动,向左向右,需要遵照实际偏移量哪个大,还有电脑的大数在前或者小数在前的情景,实际确定。

主导思想就是这么,不用顾虑数据COPY中设有移动等统计。总计机有pipeline的,数据预读和储存与这么些总计都是可以出现操作的。所以全体性能远比char
一个个传的快。尽管char一个个传,如下面代码这样,看似干净,但达到实际系统实施时,也仍旧需要各种等待之中总线可采用。除非编译器自动识别,暴发了DMA的机理操作。貌似除了特定书写规范的代码,按照编译器的要求来书写,否则编译器不可能落实这种动态识别。