const UINT32 buffer_4[100] = {
0x83FC1E00,0x1FF0F803,0x7F83C01F,0xFE0F0078,0xF87C01E0,0xC1E00F87,0x07803C1F,0x3E00F07F,
0xF00783FE,0xC01E0FF0,0x00783FC1,0x03C1FF0F,0x0F07F83C,0x3C1FE0F0,0xF0FF87C0,0x83FC1E00,
0x0FF07803,0x803FE00F,0x00FF0783,0x07C3C1FF,0xE0F007F8,0x803FC1E0,0x01F0F07F,0xF803C1FE,
0xC00F0F87,0x007FC3E1,0xC1E0FF07,0x07F83C01,0x3C1FF0F0,0xF07F803E,0xFC1E0F00,0x0FF87801,
0x3FC01E0F,0xFF00783C,0x83FC00F0,0x1F0F0783,0x7FC01E0F,0x1E0F0078,0x07FC3E1E,0xE1E0F078,
0x787FC1E1,0x1E1F0078,0xF0783C1E,0x3C1E0FF8,0x00783FC0,0xC3E1FF07,0xF00783C1,0xC3C1E0F0,
0xF0F0783F,0x83C1E0F0,0x0FF007C3,0x83C01E0F,0xE0F0783F,0xFC3C01F0,0x0F0F0783,0x783FE1E0,
0x1E0F0780,0x87C3FE0F,0xE00F0783,0x8783C1E0,0x1E00F07F,0x07FC3C1E,0xC1E0F007,0xFF83C01F,
0x01E0FF00,0x0787FC1E,0xC1E00F07,0xFF8783C1,0x3C1E0F00,0x0F07FC3C,0x3FC1E0F0,0xFF07803C,
0x03C1FE00,0x0FF0783C,0x803FE0F0,0x0F00783F,0x7801E1FF,0xE0F0787C,0x803C1E0F,0x1E00FF83,
0x7803C1FE,0x1E0FF078,0x78783FE0,0x1E00F078,0x07F83C1E,0x3C1FF0F8,0x00783FC0,0xC1E1E0FF,
0x0F0783C1,0x3FC1E0F0,0x0F07803C,0x83FC1E0F,0xE0F00783,0xF0001FE0,0xFFFFFFFF,0xFFFFFFFF,
0xFFFFFF80,0x00000000,0x00000000,0x00000000
};
DMA快取中有100個字。遍歷100個字,當連續出現3-5個零(一)記錄為0b0(0b1).當連續出現6-10個零(一)記錄為0b00(0b11).然后每32bit組成一個字。
例如buffer_4[99], buffer_4[98], ... buffer_4[1], buffer_4[0]
0x00000000, 0x00000000, ... 0x1FF0F803, 0x83FC1E00
0001 1111 1111 0000 1111 1000 0000 0011 1000 0011 1111 1100 0001 1110 0000 0000
11 0 1 00 1 0 11 0 1 0 0
現在最原始的方法,一位一位的右移,在跳變的時候判斷之前的零(一)的個數。但是這樣效率不夠高。
各位大神,有沒有其他高效率的判斷方法。
uj5u.com熱心網友回復:
void sample_2(void) {
UINT8 last_bit=0,current_bit=0;
UINT8 cnt=0,pos=0,j;
UINT32 temp,result=0;
UINT16 i=0;
for (i=0;i<100;i++) {
temp = buffer_4[i];
for (j=0;j<32;j++) {
current_bit = temp & 0x01;
if (current_bit ^ last_bit) {
if ((cnt >= 7) && (cnt <= 12)) { //00
if (last_bit)
result |= (3 << pos);
pos += 2;
} else if ((cnt >= 2) && (cnt <= 6)) { //0
if (last_bit)
result |= (1 << pos);
pos++;
}
cnt = 0;
}
last_bit = current_bit;
cnt++;
temp >>= 1;
if (pos >= 32) {
pos = 0;
printf("word:%X\n",result);
result = 0;
}
}
}
}當前采用該方法,速度還不夠快。
uj5u.com熱心網友回復:
上個Verilog?反正你既然搞DMA就不在乎上塊芯片
uj5u.com熱心網友回復:
DMA是原封不動地搬運資料的,不存在“過濾”的問題。過濾,可以在啟動DMA之前,或者DMA完成后進行。
uj5u.com熱心網友回復:
正面的,從演算法角度看,你的資料從頭到尾擼了一遍,O(n)的,已經很難優化了。反面的,你的代碼似乎和上方設定不一致啊,我是說連續位的數量。
另外,輸出的result,兩次之間不夠連續啊,如果上次的有了31位,這次再來2位,那就33位了,會丟棄1位啊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254555.html
標籤:C語言
