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];