以下是我在 ucosii 裡實作 critical section 保護方式,這個方式在進入 critical section 前,將 CPSR 的值存到變數 cpu_sr 裡,同時 disable IRQ 及 FIQ,而當離開 critical section 後,則將存放在 cpu_sr 的原 CPSR 值存回 CPSR裡,這是比較複雜的 inline assembly,因為我們會利用到 C 函式裡宣告的變數 cpu_sr,記住底下是一個 #define,在許多 usosii 的 C function 裡都會被使用到
#define OS_ENTER_CRITICAL() \
/* \
* Disable both IRQ and FIQ \
*/ \
__asm__ __volatile__( \
"mrs %0, cpsr\n\t" \
"orr r8, %1, #0xC0\n\t" \
"msr cpsr_c, r8\n\t" \
: "=r" (cpu_sr) \
: "r" (cpu_sr) \
: "memory");
#define OS_EXIT_CRITICAL() \
/* \
* Restore the cpsr(IRQ and FIQ) \
*/ \
__asm__ __volatile__( \
"msr cpsr_c, %0\n\t" \
: \
: "r" (cpu_sr) \
: "memory");
分成四個部份,分別是 arm assembly instruction、output operand list、input operand list 及 clobber list,後面若不需要的話,就留空即可
所有的 assemble instructions 都放在這裡,有些很單純就跟一般的 arm instruction 沒兩樣,有些則是會稍有變化,因為利用到 C 的變數,如果宣告了變數,但在 inline assembly 中需要去存取它們,例如 line 2 及 line 3,此時,就需要 output operand 及 input operand 的搭配使用
"mov r0, r0\n\t"output operand list
"mrs %0, cpsr\n\t"
"orr r8, %0, #0xC0\n\t"
"msr cpsr_c, r8\n\t"
: "=r" (cpu_sr)input operand list
: "r" (cpu_sr)你可以把想對 compiler 說的話放在 clobber list 裡,例如 "memory" 是告訴 compiler 記憶體裡的資料是可能被改變的,所以不要去做最佳化,每次要存取該記憶體內容時,都要重新讀取到 register 裡,在 embedded 的世界裡,這是很重要的,也許在某個 ISR 裡某個變數被改變了,如果你直接讀取上次存在 register 的值而不是重新讀取到 register 裡,那,事實上,在 C 裡宣告變數時,可以使用 volatile 去做修飾,都是為了相同的目的。
: "memory");[Download]
[ARM GCC Inline Assembler Paper]
1 則留言:
小雄:請問一下改變google engine的搜查方式的難度會不會很高,我看一般的自訂search的功能太簡陋了,好奇說!
(1)那個之前做的企業分析網站已經被wiki捷足先登了,它才剛起步,所以我之前花的時間都浪費掉了,就當做是繳學費算了,有興趣可以參考它們做的東西:
http://www.wikinvest.com/stock/Apple_(AAPL)
(2)另外另一個電力顧問公司在英國也已經有人做了,所以也算fail了,有空可以看這家公司的服務內容http://www.engage-consulting.co.uk/.我覺得有些好奇,為何台北市健保局一年要消耗250億的電費,其中必定浪費很多無胃的電費,所以我才會認為能源消耗與監測最佳化軟體會有搞頭.在網路的世界,資訊是一種資源,網站可以讓資訊重整達到最佳化,在能源的世界中,電力是一種資源,為何沒有人將它最佳化.臺灣目前沒有能源分析專家,真是可惜,我研究過上市公司裡,每一個公司耗電費用都是以"億"為單位,竟然沒有人去改善,如果這是中型股本的公司,這是一個月的淨利丫,當台灣唯一的能源顧問看起來也不錯呀!
Mac
張貼留言