DAT_copy 產生的問題

來源:互聯網
上載者:User

http://blog.csdn.net/adrianfeng/article/details/5894584

//這個轉載的東西,經我實驗沒有發現錯誤。就當學習了吧。

//我分析應該不會出錯,因為編譯器有一套維護cache的機制,否則不累死程式員了

 

#include <csl.h>
#include <csl_cache.h>
#include <csl_dat.h>
#include <stdio.h>

#pragma DATA_SECTION(external, "quickdata")
char external[352*416];                              // 片外

#pragma DATA_SECTION(internal, "quickdata")
char internal[16 * 352];                              // 片內

void main()
{
int i, j, id;
char x = 0;

CSL_init();                                             
CACHE_clean(CACHE_L2ALL, 0, 0);
CACHE_setL2Mode(CACHE_128KCACHE);       
CACHE_enableCaching(CACHE_EMIFA_CE00);
CACHE_enableCaching(CACHE_EMIFA_CE01);

for(i = 0; i < 352 * 416;++i)
{
   external[i] = (i & 0xff);
}

DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
id = DAT_copy2d(DAT_2D1D, &external[0], internal, 352, 16, 416);
DAT_wait(id);

for(i = 0; i < 16; ++i)   // 檢查搬移是否正確
{
      if(memcmp(&external[i * 416], &internal[i * 352], 352) != 0)
   {
    fprintf(stderr, "error/n");
   }
}
fprintf(stderr, "end/n");
}

測試回合失敗。DMA傳輸後片內與片外資料不一致。經分析後確認是因為程式開始開啟了L2Cache,並且允許對片外儲存空間進行緩衝,因此開始對external的初始化實際上實在L2Cache中做的,並未即時更新到片外external,故DMA不正確,解決辦法是在external初始化之後調用下面的語句請求二級緩衝立刻重新整理資料:

CACHE_wbInvL2(external, 352*416, CACHE_WAIT);

則測試正確,注意這個函數的第二個參數有最大為65536*4的限制,如果要重新整理的資料大小超過了這個值,則應該分為幾塊分別調用該函數。

 

 

###############################################################################

The DATA_SECTION pragma allocates space for the symbol in a section called section name. 
The syntax for the pragma in C is:

#pragma DATA_SECTION (symbol, "section name");

我個人的理解是:

定義一個資料區段: 
          段名為:    "section name"
          段的內容在: symbol 裡 
在CCS編程中,如果我們不指定變數的存放位置,編譯器會自動的給變數分配一個位置,但是如果有的時候需要把變數放在一個特定的空間內,我們應該如何操作呢,CCS提供了如下的兩個指令
#pragma CODE_SECTION
#pragma DATA_SECTION
其中data_section是針對資料空間的,code_section是針對程式空間的,具體的使用辦法是
#pragma DATA_SECTION(bufferB, ”my_sect”)
char bufferB[512];
在.cmd檔案中建立對應的section就可以使用了。

注意:在使用#pragma DATA_SECTION時,應該先開闢一個空間,即:#pragma DATA_SECTION(bufferB, ”my_sect”),然後再定義該空間的大小:char bufferB[512];

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.