在VDSP中編譯uclinux(3) 編譯器的差異

2021-04-13 23:56:23 字數 2514 閱讀 1302

雖然vdsp和gcc3.2有很好的相容性,但是還是有一些差異的,以下列出已經碰到的一些差異及處理辦法:

1

__builtin_expect(exp, val)這是gcc的乙個內建函式,而vdsp無此函式,它用於為編譯器提供分支**資訊,其返回值是整數表示式exp的值,val的值必須是編譯時常數。這個內建函式的語義是 exp 的預期值是 val,編譯器可以根據這個資訊適當地重排語句塊的順序,使程式在預期的情況下有更高的執行效率。因此在移植時直接用:

#define __builtin_expect(exp, val)

(exp)

2

__builtin_constant_p(exp)此內建函式用於判斷乙個值是否為編譯時常數,如果引數exp 的值是常數,函式返回 1,否則返回 0。很多計算或操作在引數為常數時有更優化的實現,在 gnu c 中用上面的方法可以根據引數是否為常數,只編譯常數版本或非常數版本,這樣既不失通用性,又能在引數是常數時編譯出最優化的**。在移植時使用:

#define __builtin_constant_p(x)

(0)3

__builtin_return_address (level)

#define __builtin_return_address(level)

()4、彙編中的

jump 1f或者

jump 1b之類的跳轉語句:在vdsp中不支援這種方式的跳轉,只能將其中的標號改為絕對標號,並修改相應的jump語句。

5、彙編中的

.macrovdsp不支援.macro,必須將其改為#define語句,如果在.macro的中間出現了條件彙編#ifdef之類的東西,必須將這些條件移到#define語句之外。

6、彙編中的

.rept世間最痛苦的事情莫過於此,無奈,使用最原始的方法,copy/paste。

7

__cmpxchg函式:這個函式是用嵌入彙編寫的,但在vdsp下無法編譯,因此用c重寫,雖然效率有所降低,但我們的目標是首先有乙個可以執行的版本,不是嗎?/*

* atomic compare and exchange. compare old with mem, if identical,

* store new in mem. return the initial value in mem. success is

* indicated by comparing return with old. */

static

inline

unsigned

long __cmpxchg(volatile

void *ptr, unsigned

long old,

unsigned

long

new, int size)

local_irq_restore(flags);

return tmp; }

8

jiffies_64的定義問題:在uclinux中,jiffies_64的定義為:

#define

__jiffy_data __attribute__((section(".data")))

extern

u64 __jiffy_data jiffies_64;

這樣的定義本身沒有問題,但是在編譯kernel/timer.c時卻造成了其它地方**的編譯失敗,這是乙個非常奇怪的問題,出錯提示為:

[error ea1008] "e:/temp/acc08143dff000/acc08143dff001.s":3601 '.epcdata':

the symbol has already been defined and cannot be redefined.

[error ea1008] "e:/temp/acc08143dff000/acc08143dff001.s":3608 '.epcdata.end':

the symbol has already been defined and cannot be redefined.

但是如果將定義改為:

extern

u64 /*__jiffy_data*/ jiffies_64;

則沒有問題。

還有一些其它的問題,但是沒有及時記錄下來,以後再補上。

讓vdsp與uclinux共舞(15) 總結

快樂蝦 本文適用於 adsp bf561 visual dsp 5.0 update 6 bfin uclinux 2009r1.6 忙乎了兩個星期,做個總結。1 開發了乙個核心驅動。2 開發了乙個引導程式。3 在vdsp 下移植了 uclibc 裡面的libc 部分。4 修改了核心中 smp部分的...

在uClinux下使用Flash

flash memory 有兩種 nor nand。讀 nor flash 就像讀sram 一樣,可以從任一位址讀取,可以直接從 nor flash 中執行 因此在小型系統中,選擇 nor flash 是一種好的選擇。nor flash 大小主要從幾百kb到 64mb nand flash 一般一次...

uClinux在skyeye下測試hello

有待修改 cd testsuit cd uclinux cd at91 cd uclinux cs8900a skyeye e linux c skyeye.conf 執行,一直報錯 1.2.8版本的skyeye有很多問題,重新裝乙個1.2.6 sudo apt get build essentia...