|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
今天本人現(xiàn)場技術(shù)支持,在線解答所有人的有關(guān)操作系統(tǒng)問題。 |
| 作者:caluova 欄目:嵌入式系統(tǒng) |
哥哥今天高興,在線解答所有人的問題,有需要支持的請跟貼,或發(fā)新貼。 |
| 2樓: | >>參與討論 |
| 作者: coolJoe 于 2006/4/16 13:07:00 發(fā)布:
感謝幫忙! 呵呵!先謝謝了! 我還是想問一下昨天發(fā)的那個smallRTOS的問題! 那段源程序在我發(fā)的下面那個帖子上! 我想問TaskFunction[i]為什么要強制轉(zhuǎn)換為uint16類型的變量! 還有這樣轉(zhuǎn)換后%256和/256得到的數(shù)據(jù)是什么意義? 初始化堆棧前*cp--=0的意義是什么? 再謝謝了! |
|
| 3樓: | >>參與討論 |
| 作者: lczsx2000 于 2006/4/16 13:33:00 發(fā)布:
牛B! 樓主大蝦,我對linux內(nèi)核關(guān)于SMP處理的技術(shù)一直比較模糊,請給我說說。 1:說說我沒有操作系統(tǒng)的時候我應該怎么實現(xiàn)多處理器執(zhí)行同一段函數(shù)代碼? 2:處理器應該具有哪些硬件電路才能真正支持SMP的操作系統(tǒng)? |
|
| 4樓: | >>參與討論 |
| 作者: caluova 于 2006/4/16 13:50:00 發(fā)布:
RE:coolJoe 就你這段程序回答你上述兩個問題: *cp++ = ((uint16)(TaskFuction[0])) % 256; SP = (uint8) cp; *cp = ((uint16)(TaskFuction[0])) / 256 %256和/256分別是求除法的余數(shù)和除法的得數(shù), 用任何一個16位數(shù)%256,得到的是余數(shù),也就是舍棄了16位數(shù)的高8位獲得低8位, 同樣的道理,用16位數(shù)/0x256,得到的是除法的得數(shù),也就是16位數(shù)的高8位。 強制轉(zhuǎn)換是為了上述計算。 用在你這里,第一句表示獲得TaskFuction[0]的低8個字節(jié),第三句表示獲得高8個字節(jié), 其最終目的是把TaskFuction[0]的低8字節(jié)存在8位指針*cp++的地方,高8字節(jié)存在*cp的地方 你這個堆棧是向下生長的,一般地講,除了數(shù)據(jù)指針,堆棧指針之外還要對有傳遞寄存器初始化,*cp--=0應該是對參數(shù)傳遞寄存器的初始化,具體還要看你用的處理器和進程控制塊的數(shù)據(jù)結(jié)構(gòu)。 |
|
| 5樓: | >>參與討論 |
| 作者: caluova 于 2006/4/16 14:26:00 發(fā)布:
re :lczsx2000 linux中SMP是以進程為單位進行處理的,只有當系統(tǒng)中有多個進程時,分別分配給不同的處理器進行處理,這種技術(shù)才有意義。 因為進程的空間是相互獨立的,所以理論上可以在多CPU上同時處理多個進程,需要解決的僅僅是對內(nèi)存硬件訪問的互斥、緩存和內(nèi)存的一致性等問題。簡單講就是這樣。 若你不跑操作系統(tǒng),則表明你所處理的事情本質(zhì)上還是單線程的,雖然邏輯上你可能會做多件事情。所以應用SMP也就沒有什么意義。 若你的目的是做冗余備份系統(tǒng),則完全不能套用到SMP中來,因為SMP系統(tǒng)和冗余系統(tǒng)的區(qū)別是SMP是多CPU共享內(nèi)存,而冗余系統(tǒng)是多CPU,多內(nèi)存,相互之間可以獨立同步運行。 處理器至少要具備cache和MMU才能支持SMP的操作系統(tǒng),硬件上,總線要求能并在一起。 |
|
| 6樓: | >>參與討論 |
| 作者: coolJoe 于 2006/4/16 15:28:00 發(fā)布:
有個地方問一下! *cp++是不是應該是先*cp,再++,所以我覺得應該是TaskFuction[0]的低8字節(jié)存在8位指針*cp的地方,高8字節(jié)存在*cp++的地方! 不知道是不是這個樣子的!實際SP指向的是高8字節(jié)的地方! |
|
| 7樓: | >>參與討論 |
| 作者: caluova 于 2006/4/16 15:42:00 發(fā)布:
RE 你說的沒錯,*cp++是CP所指地址的下兩個字節(jié),這個我在上面已經(jīng)說過了,不知道你還有什么不明確的? |
|
| 8樓: | >>參與討論 |
| 作者: coolJoe 于 2006/4/16 15:47:00 發(fā)布:
剛才忘加一句了! 那我認為這個堆棧應該是一個向上增長型的。 不知是不是! |
|
| 9樓: | >>參與討論 |
| 作者: terrence 于 2006/4/16 20:13:00 發(fā)布:
同受益了 |
|
| 10樓: | >>參與討論 |
| 作者: yewuyi 于 2006/4/17 10:11:00 發(fā)布:
不懂OS,問一個菜問題 假設使用ARM,用芯片的兩個IO口,電路結(jié)構(gòu)如下: IO1————電阻————電容————GND | | IO2 要求:當IO1輸出高電平的時候,對電容充電,然后不斷的讀IO2管腳狀態(tài),當IO2從低電平向高電平跳變的時候,ARM準確計算出電容此時的充電時間。 簡單說應當是一個獨占的任務(充電計時),如果用OS調(diào)度,以保證別的任務多線程執(zhí)行的時候,該任務能正確執(zhí)行??? |
|
| 11樓: | >>參與討論 |
| 作者: DaytoDay 于 2006/4/17 15:28:00 發(fā)布:
請看看陳明計的這個例子 #include "config.h" #include "display.h" void TaskA(void); void TaskB(void); void TaskC(void); void main(void) { OSInit(); PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); PC_DispStr(15, 0, "Small RTOS(51), the Real-Time Kernel(For Keil c51)", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK); PC_DispStr(35, 1, "ChenMingJi", DISP_FGND_WHITE); PC_DispStr(35, 3, "EXAMPLE #3", DISP_FGND_WHITE); TMOD = (TMOD & 0XF0) | 0X01; TL0 = 0x0; TH0 = 0x0; TR0 = 1; ET0 = 1; TF0 = 0; OSTaskCreate(TaskA, NULL, 0); OSTaskCreate(TaskB, NULL, 1); OSTaskCreate(TaskB, NULL, 2); OSTaskCreate(TaskB, NULL, 3); OSTaskCreate(TaskB, NULL, 4); OSTaskCreate(TaskB, NULL, 5); OSTaskCreate(TaskB, NULL, 6); OSTaskCreate(TaskB, NULL, 7); OSTaskCreate(TaskB, NULL, 8); OSTaskCreate(TaskB, NULL, 9); while(1) { PCON = PCON | 0x01; /* CPU進入休眠狀態(tài) */ } } uint8 ShowChar; void TaskA(void) { uint8 x,y; while (1) { OSWait(K_SIG,0); x = random(80); y = random(20); PC_DispChar(x, y + 5, ShowChar, DISP_FGND_LIGHT_GRAY); } } void TaskB(void) { while (1) { ShowChar = OSRunningTaskID()+'0'; OSSendSignal(0); OSWait(K_TMO,1); } } /* void TaskC(void) { uint8 x,y; while (1) { x = random(80); y = random(20); PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); } } 我把最后一個任務該成TASKC,任務數(shù)沒增加,只是最后一個任務變了變,結(jié)果單步執(zhí)行的時候,到建立最后一個任務的時候就開始運行了,請分析以下原因 |
|
| 12樓: | >>參與討論 |
| 作者: 老狼 于 2006/4/17 17:47:00 發(fā)布:
我想問一個問題 您認為對于arm,linux or wince那個更有前途。 如果做工控,哪個實時操作系統(tǒng)比較適合,rtlinux,vxwork,ucos or threadx? |
|
| 13樓: | >>參與討論 |
| 作者: 老狼 于 2006/4/17 17:48:00 發(fā)布:
目前您都用過那些操作系統(tǒng) 做過什么樣的設備,能夠舉例說明一下,如何選擇不同的操作系統(tǒng)! |
|
| 14樓: | >>參與討論 |
| 作者: caluova 于 2006/4/17 19:42:00 發(fā)布:
RE 不好意思,白天上班,晚上繼續(xù)解答各位的問題! 首先回復yewuyi: 你這實際上是模仿西格碼-德爾塔AD轉(zhuǎn)換的土辦法,早年我用51的定時器做過,當電容電阻參數(shù)設的比較大時,誤差基本能夠接受,若用OS的TIMER來做,是有些問題的,因為OSTimer通常是以1ms為基本單位,基本上你要采集1000個單位,也就是1秒以上,你的數(shù)據(jù)才有些意義,而這樣以來電容要很大。前面講的單片機定時器則精度遠高于此,故可以勝任。 如果實在要做可以試試,計數(shù)器不要放在普通的進程里,要放在OS的TICK里即可,可以做到?jīng)]有誤差。但TICK的間隔要計算準確,因為有時候說是1ms實際卻是1.00幾ms。 |
|
| 15樓: | >>參與討論 |
| 作者: caluova 于 2006/4/17 19:57:00 發(fā)布:
RE:DaytoDay RE:DaytoDay 你這里只有一部分代碼,創(chuàng)建任務的函數(shù)實現(xiàn)你沒有列出來,因此我只能猜測: 在你的 OSTaskCreate里面,在初始化進程堆棧,初始化進程控制塊之后,應該有Hook這一操作,也就是講進程暫時掛起,你檢查看看有沒有,確保你創(chuàng)建的所有進程都先掛起。 |
|
| 16樓: | >>參與討論 |
| 作者: lczsx2000 于 2006/4/19 21:40:00 發(fā)布:
樓主還是沒有講出來啊 你講的這些我都知道,而且自認為精通了C。我現(xiàn)在要在雙core的DSP上做視頻信號處理,我們知道做視頻是不能上操作系統(tǒng)的(你偏要上我也沒辦法),有的人這樣做:一個core跑uclinux,一個跑編解碼,但是這樣的話,效率提不上來。所以我們這樣做:兩個都跑視頻編解碼,一個做奇場,一個做偶場。但是這樣以來開發(fā)難度很大,我想問你有什么好的原則建議沒有? 我現(xiàn)在已經(jīng)看了三個os的源碼了,到現(xiàn)在為止看了一年多的linux源碼,前面兩個不是多用戶的,你也可以向我提一些操作系統(tǒng)的問題!如果我不知道的話,我還可以繼續(xù)看下去來回復你。 |
|
| 17樓: | >>參與討論 |
| 作者: terrence 于 2006/4/20 8:06:00 發(fā)布:
牛啊~~ |
|
| 18樓: | >>參與討論 |
| 作者: thinkey 于 2006/4/26 16:19:00 發(fā)布:
pv操作 用來做同步的話需要保持其原語性質(zhì)嗎? |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |