2008年12月10日 星期三

memory copy-2

照著上一篇Bee的說法,實驗c compiler 附的memcpy( );函數。


做之前先做點功課,memcpy( ) 的介紹


真的快多了,比我自己寫的還要快很多倍,複製80個char 就只要85個指令時間。



在做這個的過程中發現一個有趣的現象,因為dsPIC是16bits的微控制器,當在跑for 迴圈時,如果變數宣告成char (8bits) 這樣運算會比宣告成int (16bits)的運算來的久一倍運算時間。



這樣以後在寫程式的時後要特別注意一下,為了省一個byte,卻浪費1倍的運算時間。


5 則留言:

  1. 二維矩陣本來就是C語言的謎。因為我就是用過動態記憶體直接用cast變成二維矩陣,真的不易成功。
    所以對於複製過的二維矩陣只好寫成*(*(matrix+1)+5)來代表matrix[1][5]。如果沒有複製過,這兩個寫法是可以互通(在X86下),這也是二維矩陣怪的地方。

    [版主回覆12/11/2008 16:22:51]對不起,看不是很懂,可以舉個例子嗎?
    謝謝!

    回覆刪除
  2. 二維矩陣在各CPU間沒有實現標準,所以使用上有一些問題。
    為了解決移植問題,還是會使用抓取一維矩陣的記憶體方式來取得記憶體。然後使用一個**matrix的指標指向此記憶體(matrix=address;),就開始當二維矩陣使用。用法就是*(*(matrix+1)+5)。
    但在X86下宣告matrix[10][10],一樣用上面的寫法去取,還真的取中matrix[1][5]的值。
    但使用指標和矩陣仍有不同,矩陣無法移動,指標可以移到別的記憶體區域工作,只是寫法不好看。

    回覆刪除
  3. 事隔太久,記錯了。使用**matrix不能代表二維矩陣。因為欠了一個維度長度。
    所以我當時成功的二維矩陣指標是用一維指標做的。
    *(martix+1*10+5),其中10就是矩陣維度長度。
    寫起來太長,用巨集解決
    #define  Matrix(x,y)   (*(matrix+x*10+y))
    使用上就可以為
    Matrix(1,5)=10;
    t=Matrix(1,5);

    [版主回覆12/11/2008 18:16:46]剛剛搞笑了,在寫多維矩陣的時後,在設初值的for迴圈忘計更改,而除錯位置顯示在memcpy9( ) 上,所以讓我覺得沒有辦法做memory copy,用同樣的方式,可以memcpy( ) 多維矩陣,看查了一下,MPLAB 的矩陣宣告也是一個連續的位址,所以大概是因為這樣所以才可以memcpy。

    回覆刪除
  4. 以下為實驗程式
    #define Mat(x,y) (*(pa+x*10+y))

    int main(int argc, char* argv[])
    {
        int a[10][10];
        int *pa;
        int t,r;

        a[1][5]=10;
        pa = a;
        t = Mat(1,5);
        r = *(*(a+1)+5);
        printf("%d\t%d\n",t,r);
        Mat(1,5) = 20;
        printf("\n%d\n\n",a[1][5]);
        printf("%p\n%p\n",&a[1][5],(pa + 1*10 + 5));
        getch();
        return 0;
    }


    [版主回覆12/11/2008 17:54:41]複製這段程式,會出現
    CORE-E0001: Trap due to stack error, occurred from instruction at 0x000fce
    似乎在我的compiler是不可行的。

    回覆刪除
  5. 那個錯誤訊息表示堆疊不足。把a[10][10]改到main()外面,然後改為a[2][10]再試試。
    [版主回覆12/11/2008 18:24:34]和剛剛一樣,搞笑- -,我實驗的程式一直在開記憶體,忘了關掉,關掉就好了。
    沒有錯,執行的結果確實一樣。
    謝謝您。又多學了一課。

    回覆刪除