|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
注意ARM Image for uCOSII for lpc213x 模板中的TargetInit() |
| 作者:上善若水 欄目:ARM技術(shù) |
對(duì)于很多使用ZLG ARM Image for uCOSII for lpc213x 模板的初學(xué)者,常常會(huì)置疑使用該模板后自動(dòng)生成的target.c文件,和在程序中調(diào)用的TargetInit()函數(shù),我和 Zgpswh都是如此,這個(gè)問(wèn)題當(dāng)初困擾了很久:當(dāng)用戶程序中不調(diào)用TargetInit()時(shí),發(fā)現(xiàn)內(nèi)核能運(yùn)行,但是等待機(jī)制失靈,調(diào)用TargetInit(),很多硬件中斷打不開(kāi),后來(lái),在很多熱心人的指點(diǎn)下解決了,現(xiàn)重新總結(jié)如下: 請(qǐng)仔細(xì)察看ZLG模板里的target.c文件,這里的TargetInit()如下: void TargetInit(void) { OS_ENTER_CRITICAL(); srand((uint32) TargetInit); VICInit(); Timer0Init(); OS_EXIT_CRITICAL(); } 其中的Timer0Init();用于硬件定時(shí)器0的初始化,事實(shí)上,ZLG的移植代碼的μC/OS-Ⅱ的時(shí)鐘節(jié)拍是通過(guò)定時(shí)器0提供的,不在主程序里調(diào)用這個(gè)函數(shù),μC/OS-Ⅱ的時(shí)鐘源就無(wú)法打開(kāi);但是,沒(méi)有開(kāi)啟時(shí)鐘源的μC/OS-Ⅱ是同樣能運(yùn)行的,只是內(nèi)核提供的延時(shí)和等待時(shí)限機(jī)制都不起作用,系統(tǒng)雖能將就運(yùn)行,但因沒(méi)調(diào)用TargetInit()而使內(nèi)核功能不健全。 請(qǐng)注意,TargetInit()中的另一個(gè)函數(shù)VICInit()是用來(lái)中斷的初始化,它其中含有對(duì)UART0中斷的分配,在用戶程序里需要根據(jù)使用的硬件中斷修改這部分代碼,否則,這些硬件中斷無(wú)法開(kāi)啟;再者,在不調(diào)用TargetInit()的時(shí)候,硬件的中斷初始化是在硬件初始化函數(shù)中完成,這也就是Zgpswh提到的現(xiàn)象:不調(diào)用TargetInit()內(nèi)核運(yùn)行異常,調(diào)用了卻開(kāi)不了UART0的中斷。 解決的方法如下: 這在《ARM嵌入式系統(tǒng)基礎(chǔ)教程》的430頁(yè)7.4.3節(jié)中論述的很清楚: ……關(guān)鍵在于把程序與芯片相關(guān)中斷源掛接,使芯片在產(chǎn)生相應(yīng)的中斷后會(huì)調(diào)用相應(yīng)的處理程序。這需要做兩方面事情: 1. 增加匯編接口的支持! 2. 初始化向量中斷控制器! 按照一下方法完成中斷源的的掛接: 1、增加匯編接口的支持。方法是修改IRQ.s文件,在末尾添加本句代碼: UART0_Handler HANDLER UART0_Exception 追加定義了通用串口0 中斷句柄。 2、初始化向量中斷控制器。將target.c文件中的VICInit()修改如下: void VICInit(void) { extern void IRQ_Handler(void); extern void Timer0_Handler(void); extern void UART0_Handler(void); VICIntEnClr = 0xffffffff; VICDefVectAddr = (uint32)IRQ_Handler; VICVectAddr0 = (uint32)Timer0_Handler; VICVectCntl0 = (0x20 | 0x04); VICIntEnable = 1 << 4; VICVectAddr14 = (uint32)UART0_Handler; VICVectCntl14 = (0x20 | 0x06); VICIntEnable = 1 << 6; } 此為初始化向量中斷控制器。包括定時(shí)器0和串口0,特別要注意的是,一定不可以省略對(duì)定時(shí)器0的初始化 |
| 2樓: | >>參與討論 |
| 作者: zgpswh 于 2006/3/14 15:45:00 發(fā)布:
我按你的方法試過(guò)了,還是進(jìn)不了中斷。! 我按你的二種步驟試過(guò)了,還是進(jìn)不了中斷!。 中斷 void UART0_Exception(void) { IO1CLR=LED; OSTimeDly(OS_TICKS_PER_SEC/50); IO1SET=LED; OSTimeDly(OS_TICKS_PER_SEC/50); } 我不知問(wèn)題出在哪里,真搞暈了,不知上善若水兄弟有沒(méi)有試出來(lái)該程序? |
|
| 3樓: | >>參與討論 |
| 作者: wlq_9 于 2006/3/14 15:52:00 發(fā)布:
中斷里面調(diào)延時(shí)??? 你真幽默! |
|
| 4樓: | >>參與討論 |
| 作者: zgpswh 于 2006/3/14 16:11:00 發(fā)布:
幽默!請(qǐng)指點(diǎn)... 幽默!請(qǐng)指點(diǎn)... 幽默!請(qǐng)指點(diǎn)... 幽默!請(qǐng)指點(diǎn)... |
|
| 5樓: | >>參與討論 |
| 作者: 上善若水 于 2006/3/14 17:31:00 發(fā)布:
中斷里,不可以調(diào)用延時(shí) 請(qǐng)注意,中斷里面是不支持等待機(jī)制的。請(qǐng)用自己編的一個(gè)軟件延時(shí),問(wèn)題就可以解決了。中斷源掛接正確是沒(méi)問(wèn)題的。 |
|
| 6樓: | >>參與討論 |
| 作者: 上善若水 于 2006/3/14 17:38:00 發(fā)布:
需要補(bǔ)充的是, 盡管μC/OS-II的中斷服務(wù)程序中,不可以調(diào)用延時(shí),但并不是說(shuō)調(diào)用了延時(shí)后內(nèi)核就不動(dòng)了,而是,不執(zhí)行延時(shí),你的中斷服務(wù)程序里,先點(diǎn)亮緊接著熄滅,肉眼看來(lái)就好像沒(méi)亮過(guò),還以為沒(méi)進(jìn)過(guò)中斷,其實(shí),進(jìn)去了,你沒(méi)察覺(jué)而已。 |
|
| 7樓: | >>參與討論 |
| 作者: zgpswh 于 2006/3/15 10:20:00 發(fā)布:
好!多謝上善若水兄弟! 有幫助,好!多謝上善若水兄弟! |
|
| 8樓: | >>參與討論 |
| 作者: 上善若水 于 2006/3/15 14:56:00 發(fā)布:
不必客氣 如果想感謝我就回答我在本版上提的問(wèn)題,并給以關(guān)注。我的一些積累有百分之八十來(lái)源于本論壇,特別是幾個(gè)高手的無(wú)私指點(diǎn)。 更重要的是,請(qǐng)以感恩的心態(tài)面對(duì)所有人的帖子,如果看到哪個(gè)帖子自己有能力回答,就請(qǐng)盡力回復(fù),切不可草草兩句,別人再問(wèn)時(shí),沒(méi)了回音。哪怕會(huì)因此浪費(fèi)一些自己的時(shí)間。須知,有所得便應(yīng)有所付出。 |
|
| 9樓: | >>參與討論 |
| 作者: zgpswh 于 2006/3/16 13:49:00 發(fā)布:
你的想法很對(duì),大家應(yīng)該相互幫助! 你的想法很對(duì),大家應(yīng)該提供力所能及的幫助! |
|
| 10樓: | >>參與討論 |
| 作者: armuclinux 于 2006/4/14 13:09:00 發(fā)布:
有問(wèn)題如何請(qǐng)教你? 高手,可否告知e-mail,有問(wèn)題可以及時(shí)請(qǐng)教你,謝謝! |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |