|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
求救:uC/OS中信號量函數(shù)的用法 |
| 作者:zhf0964 欄目:嵌入式系統(tǒng) |
我在一個(gè)中斷中發(fā)出一個(gè)信號量,在主任務(wù)中接收這個(gè)信號量進(jìn)行處理。 但是在接收到這個(gè)信號量之后,I2C的中斷進(jìn)不去了。 如果在這個(gè)信號量有效之前進(jìn)行I2C的操作一切正常。 用的是PLC2136,Keil3編譯器。 我的程序如下: 中斷部分: void EINT0_Exception(void) { EXTINT=0x01; //清除EINT0中斷標(biāo)志 OSSemPost(PowerDown);//發(fā)出了信號量 } 主任務(wù)部分: . . . I2c1Write(); //進(jìn)行寫24C256的操作 //此時(shí)寫操作成功! . . . OSSemPend(PowerDown, 4, &i); //等待信號量 if(i==OS_NO_ERR) {//如果信號量有效,進(jìn)行處理 . . . I2c1Write(); //進(jìn)行寫24C256的操作 //此時(shí)寫操作失敗! . . . } 請教高手這是什么原因? 先行謝過! * - 本貼最后修改時(shí)間:2006-11-27 17:05:04 修改者:zhf0964 |
| 2樓: | >>參與討論 |
| 作者: xinzha 于 2006/11/27 17:23:00 發(fā)布:
沒有接觸過你用的器件,但是感覺程序有一個(gè)比較不安全的地方 void EINT0_Exception(void) { EXTINT=0x01; //清除EINT0中斷標(biāo)志 OSSemPost(PowerDown);//發(fā)出了信號量 } 清除中斷不要這么寫吧,萬一此時(shí)也有其他中斷發(fā)生就會被你給殺掉。 應(yīng)該用‘a(chǎn)nd’或者‘or’的辦法清除中斷,只清除你要清除的中斷位 |
|
| 3樓: | >>參與討論 |
| 作者: zhf0964 于 2006/12/2 13:14:00 發(fā)布:
首先謝謝樓上的指正! 經(jīng)過多日的查證、調(diào)試,剛才終于發(fā)現(xiàn)問題所在。 原來需要在中斷程序最后加上一句,通知操作系統(tǒng)中斷完成。 修正如下: void EINT0_Exception(void) { EXTINT|=0x01; //清除EINT0中斷標(biāo)志 OSSemPost(PowerDown);//發(fā)出了信號量 VICVectAddr = 0; //通知中斷控制器中斷結(jié)束 //必須加上這一句。 //這一句類似于51匯編中的RETI指令。 } 該問題的出現(xiàn)實(shí)乃本人粗心大意,閱讀資料不仔細(xì)造成! 望各位同仁吸取本人教訓(xùn),細(xì)心有加,在研發(fā)工作中少走彎路。 * - 本貼最后修改時(shí)間:2006-12-2 16:16:26 修改者:zhf0964 |
|
| 4樓: | >>參與討論 |
| 作者: longwu810 于 2006/12/30 11:34:00 發(fā)布:
我也犯過這樣的錯(cuò)誤 我又一次調(diào)試程序,發(fā)現(xiàn)中斷進(jìn)了一次之后,后面老是不進(jìn)來了,后來才發(fā)現(xiàn)也是少了那一句. |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |