|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
ICCAVR 的一個BUG,大家看看有什么辦法處理 |
| 作者:shuaihu 欄目:單片機 |
int gao(int x); #pragma ctask task1 void task1(void*x) { gao(3);//此處如果注釋掉則傳遞參數(shù)正常。 for(;(int)x-1;); } int gao(int x) { return x; } void main(void) { task1((void*)1); //此處不管給task1傳遞什么參數(shù),參數(shù)X都為零 } |
| 2樓: | >>參與討論 |
| 作者: NE5532 于 2006/9/24 14:05:00 發(fā)布:
你看過反匯編了嗎? |
|
| 3樓: | >>參與討論 |
| 作者: shuaihu 于 2006/9/24 14:17:00 發(fā)布:
看過了,編譯的有問題。 看過了,他編譯后如果沒有調(diào)用別的函數(shù)時,他直接從R16,R17取參數(shù),但如果你在使用參數(shù)前調(diào)用了其它的函數(shù),他便不再保存R16,R17的值而在后面使用的時候從R20,R21取參數(shù),這里如果你不用C任務(wù)的話,他編譯的是把參數(shù)保存到R20,R21然后再調(diào)用GAO函數(shù),也就是說用了C任務(wù),他便省掉了這個過程。 |
|
| 4樓: | >>參與討論 |
| 作者: shuaihu 于 2006/9/24 14:18:00 發(fā)布:
大家最好試一下,我想這個問題應(yīng)該是個BUG |
|
| 5樓: | >>參與討論 |
| 作者: shuaihu 于 2006/9/24 14:19:00 發(fā)布:
我現(xiàn)在在寫一個MiniOS操作系統(tǒng),出現(xiàn)這個問題還請大家研究一下 |
|
| 6樓: | >>參與討論 |
| 作者: 平常人 于 2006/9/24 14:40:00 發(fā)布:
關(guān)于編譯BUG的疑問 有一種傳遞函數(shù)參數(shù)的方式是通過堆棧,不知樓主的#pragma ctask task1是否用來轉(zhuǎn)換堆棧,若果真如此而你的編譯選項是用堆棧傳遞參數(shù),問題就出在這里了。 main調(diào)用task1時把參數(shù)放在main的堆棧中,可到了task1卻換了另一個堆棧,他到哪里找參數(shù)呢? 不要輕易地懷疑編譯有BUG,除非你對編譯器的各種用法很熟悉了。 |
|
| 7樓: | >>參與討論 |
| 作者: shuaihu 于 2006/10/3 8:01:00 發(fā)布:
樓上,你好 首先這里的問題不是堆棧的問題,我們都知道ICCAVR是通過Y來處理堆棧的,在這個程序里還并沒有使用到操作系統(tǒng),所以Y寄存器是沒有做任何處理的,所以堆棧還是我們的堆棧,不可能出現(xiàn)找不到堆棧的情況,你可以仔細(xì)的看一下匯編后的代碼,即使C任務(wù)的規(guī)棧是由操作系統(tǒng)處理,那他也只會出現(xiàn)MAIN的堆棧指針被破壞的情況,不會傷及到TASK1的堆棧的。另外,我們在這個程序里只傳遞了一個INT的參數(shù),根據(jù)ICCAVR的幫助文件,C語言在傳遞參數(shù)時是通過R16,R17傳遞第一個參數(shù),R18,R19傳遞第二個參數(shù),其他的參數(shù)能通過堆棧來傳遞。 下面的程序是我用匯編寫的一個操作系統(tǒng)內(nèi)核。你參考一下。 http://bbs.21ic.com/upfiles/img/2006103812404.rar |
|
| 8樓: | >>參與討論 |
| 作者: shuaihu 于 2006/10/3 8:03:00 發(fā)布:
#pragma ctask task1 #pragma ctask task1 這是干什么用的,請樓上兄弟仔細(xì)看一下ICCAVR的說明。我想你還沒有看過,看過后你會明白的。 |
|
| 9樓: | >>參與討論 |
| 作者: 壞孩子 于 2006/10/13 1:27:00 發(fā)布:
同意樓上意見 As described in the Assembly Interface and Calling Conventions page, the compiler normally generates code to save and restore the preserved registers. Under some circumstances, this behavior may not be desirable. For example, if you are using a RTOS (Real Time Operating SYSTEM), the RTOS manages the saving and restoring of the registers as PART of the task switching PROCESS and the code inserted by the compiler becomes redundant. To disable this behavior, you use the "#pragma ctask". For example, #pragma ctask drive_motor emit_siren .... void drive_motor() { ... } void emit_siren() {...} The pragma must appear before the definitions of the functions. Note that by default, the routine "main" has this attribute set since main should never return and it is unnecessary to save and restore any register for it. 當(dāng)然啦,你用ctast聲明了task1不保存現(xiàn)場,自然,在里面出現(xiàn)函數(shù)調(diào)用以后,x的值就變化了哈。 |
|
| 10樓: | >>參與討論 |
| 作者: mu_mzj 于 2006/10/24 20:49:00 發(fā)布:
非常感謝 學(xué)到了很關(guān)心的東西了, 非常感謝 學(xué)到了很關(guān)心的東西了, |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |