性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

實時操作系統(tǒng)μC/OS-II在MCF5272上的移植

作為一個實時內(nèi)核,從1992年開始為人們熟悉,到現(xiàn)在已經(jīng)發(fā)展為.最多支持56個任務(wù),其內(nèi)核為占先式,總是執(zhí)行就緒態(tài)的優(yōu)先級最高的任務(wù),并支持Semaphore(信號量)、Mailbox(郵箱)、MessageQueue(消息隊列)等多種常用的進程間通信機制.與大多商用RTOS不同的是,公開所有的源代碼,并可以免費獲得,對商業(yè)應用收取少量License費用.一般商用操作系統(tǒng)如VxWorks、pSOS、WinCE,購買費用動輒數(shù)萬美元,而且每件產(chǎn)品都需要交納運行費,開發(fā)、使用成本高昂. 目前MCF5272是Motorola公司一款集成度最高的ColdFire處理器,采用ColdFireV2可變長RISC處理器核心和DigitalDNA技術(shù),在66MHz時鐘下能夠達到63Dhrystone2.1MIPS.其內(nèi)部SIM(SystemIntegratedModule)單元集成了豐富的通用模塊,如10/100MHz快速以太網(wǎng)控制器,USB1.1接口等,并且能夠與常用的外圍設(shè)備(如SDRAM、ISDN收發(fā)器)實現(xiàn)無縫連接,從而簡化了外圍電路設(shè)計,降低了產(chǎn)品成本、體積和功耗. 使用GNU工具鏈(包括交叉編譯器GCC、匯編器AS等)進行內(nèi)核的編譯,Host(宿主機)環(huán)境為16MBSDRAM.在宿主機上編譯出MCF5272處理器的可執(zhí)行代碼,通過MCF5272的BDM調(diào)試工具下載到目標板調(diào)試運行.應用程序處于整個系統(tǒng)的頂層,每個任務(wù)都可以認為自己獨占了CPU,因而可以設(shè)計成為一個無限循環(huán).處理器無關(guān)的代碼提供的系統(tǒng)服務(wù),應用程序可以使用這些API函數(shù)進行內(nèi)存管理、任務(wù)間通信以及創(chuàng)建、刪除任務(wù)等. 大部分的代碼是使用ANSIC語言書寫的,因此的可移植性較好.盡管如此,仍然需要使用C和匯編語言寫一些處理器相關(guān)的代碼.的移植需要滿足以下要求: (1)處理器的C編譯器可以產(chǎn)生可重入代碼; (2)可以使用C調(diào)用進入和退出CriticalCode(臨界區(qū)代碼); (3)處理器必須支持硬件中斷,并且需要一個定時中斷源; (4)處理器需要能夠容納一定數(shù)據(jù)的硬件堆棧; (5)處理器需要有能夠在CPU寄存器與內(nèi)存和堆棧交換數(shù)據(jù)的指令. 移值的主要工作就是處理器和編譯器相關(guān)代碼以及BSP的編寫. 2編寫 BSP(板級支持包)是介于底層硬件和操作系統(tǒng)之間的軟件層次,它完成系統(tǒng)上電后最初的硬件和軟件初始化,并對底層硬件進行封裝,使得操作系統(tǒng)不再面對具體的操作. 為編寫一個簡單的BSP.它首先設(shè)置CPU內(nèi)部寄存器和系統(tǒng)堆棧,并初始化堆棧指針,建立程序的運行和調(diào)用環(huán)境;然后可以方便地使用C語言設(shè)置MCF5272片選地址(CS0~CS7)、GPIO以及SDRAM控制器,初始化串口(UART0)作為默認打印口,并向操作系統(tǒng)提供一些硬件相關(guān)例程和函數(shù)如dprintf(),以方便調(diào)試;在CPU、板級和程序自身初始化完成后,就可以把CPU的控制權(quán)交給操作系統(tǒng)了. MCF5272處理器將系統(tǒng)上電作為2號異常,因此需要在異常矢量表中相應位置填寫第一條命令的物理地址,這可以在編譯時自動完成.該矢量表必須存放在CS0對應的FLASH中供CPU上電時自動讀取.如: _vectors://矢量表起始地址 .long0x0,_start,_fault,_fault,…//初始化1K字節(jié)矢量表 …… _start:nop//第一條指令 move.w#0x2700,%sr//屏蔽所有中斷 move.1#_vectors,?move.c?%VBR//#vectors->VBR move.1#0x10000001,?move.c?%MBAR//SIM單元基地址0x10000000 move.1#0x20000001,?/SRAM起始地址0x20000000 move.c?%RAMBAR0//初始化內(nèi)部SRAM move.1#0x20001001,?/設(shè)置堆棧指針 …… jsrcpu_init//調(diào)用cpu_init初始化SIM單元 jsrucos_start//啟動 …… 其中,cpu_init函數(shù)用于初始化CPU內(nèi)部SIM單元、SDRAM控制器、UART串口.值得注意的是SDRAM初始化,不同生產(chǎn)商的SDRAM的初始化時序有一定差異. BSP在完成片級和板級初始化后,還負責初始化程序自身,如將.data段的內(nèi)容從只讀的ROM復制到SDRAM中,建立運行時環(huán)境.以下是建立程序數(shù)據(jù)段的代碼: memcpy(&_sdata,&_etext,(&_edata-&_sdata));//拷貝.data段 memset(&_sbss,0,(&_ebss-&_sbss));//將.bss段清零 還需要為編寫4個簡單的匯編函數(shù).在每個硬件時鐘到來后,會在中斷服務(wù)例程中調(diào)用OSIntCtxSw()進行任務(wù)調(diào)度;另外,當某個任務(wù)因等待資源而被掛起時,沒有必要等到自己的時間片全都用完,可以自己主動放棄CPU,這可以通過調(diào)用一個任務(wù)級的任務(wù)調(diào)度函數(shù)OSCtxSw()來實現(xiàn).其中相對復雜的是OSIntCtxSw().由于OSTickISR()調(diào)用了OSIntExit(),OSIntExit()又再次調(diào)用了OSIntCtxSw(),如果進行任務(wù)切換,那么兩次調(diào)用都不會返回,而不同的C編譯器、不同的編譯選項處理C調(diào)用時對堆棧的使用也不盡相同.因此OSIntCtxSw()是編譯器相關(guān)的.GCC在使用2~4級優(yōu)化時,在主調(diào)函數(shù)中會是一個jsr跳轉(zhuǎn)指令,而被調(diào)函數(shù)以linkw%fp,#開始.這兩條指令都會影響堆棧指針.為了實現(xiàn)任務(wù)切換,必須重新調(diào)整堆棧指針以補償調(diào)用的影響.一個完整過程如下: OSIntCtxSw: adda.1#16,?/棧補償,GCC-O2->-04優(yōu)化 move.1(OSTCBCur),?move.1?(?//OSTCBCur->OSTCBStkPtr=SP jsrOSTaskSwHook//調(diào)和Hook鉤子函數(shù) /*OSTCBCur->OSTCBStkPtr=OSTCBHighRdy->OSTCBStkPtr*/ move.1(OSTCBHighRdy),?move.1?(OSTCBCur) move.b(OSPrioHighRdy),?move.b?(OSPrioCur)//OSPrioCur=OSPrioHighRdy move.1(?,?/SP=OSTCBCur->OSTCBStkPtr movem.1(?,????/恢復CPU寄存器,切換到新任務(wù) lea60(?,?rte 篇幅所限,其它三個函數(shù)就不述了. 3任務(wù)堆棧初始化 中每個任務(wù)都有自己的任務(wù)堆棧,在任務(wù)創(chuàng)建初期由OSTaskStkInit()初始化.初始化堆棧的目的就是模擬一次中斷.任務(wù)堆棧中保存了任務(wù)代碼的起始地址和一些CPU寄存器(初值是無關(guān)緊要的),這樣一旦條件滿足,就可以執(zhí)行該任務(wù)了.MCF5272在中斷發(fā)生時,會自動保存程序指針PC、狀態(tài)寄存器SR以及其它一些信息,為四字幀結(jié)構(gòu).除此以外,STaskStkInit()在完成堆棧初始化后,還要返回棧頂指針以用于該任務(wù)控制塊TCB結(jié)構(gòu)的初始化.該程序使用C語言編寫. 4系統(tǒng)時鐘 MCF5272處理器內(nèi)置了4個定時器,使用TIMER0產(chǎn)生周期10ms的定時中斷作為系統(tǒng)時鐘.當PIVR寄存器設(shè)置為0x40時,TIMER0為69號中斷,在矢量表的相應位置需填入時鐘服務(wù)程序OSTickISR()的入口地址,并初始化時鐘: volatileunsignedshort*pTimer; pTimer=(unsignedshort*)(0x100000000x200);//指向TIMER0 /*復位時鐘*/ *pTimer&=0xFFF9;//定時器處于STOP狀態(tài) *pTimer=(*pTimer&0x00FF)|0xFA00;//預分頻=250 *pTimer|=0x0018;//計數(shù)滿自動清零,中斷方式 pTimer[2]=165;//SetTRR=165 *pTimer=(*pTimer&0xFFF9)|0x0004;//CLK=Master/16,啟動 上述程序段時鐘節(jié)拍的周期為:(1/66MHz)×250×164×16=0.01秒.實時性要求高的場合可以使用更為精細的時鐘.TIMER0一旦完成初始化,就開始工作,但是要讓中斷發(fā)生,還必須設(shè)置ICR寄存器相應字段給該中斷分配IPL(InterruptPriorityLevel,中斷優(yōu)先級),并保證該中斷沒有初狀態(tài)寄存器SR屏蔽. 該時鐘初始化代碼可以放在第一個任務(wù)中,在OSStart()后執(zhí)行.一旦內(nèi)核可以進行正常的任務(wù)切換,移植工作也就基本完成了. 5內(nèi)核編譯與下載 所有的C和匯編源文件經(jīng)過編譯、鏈接,最終形成一個二進制映像文件.由于使用了自定義的數(shù)據(jù)類型,因此必須將其轉(zhuǎn)變成為GCC(GNUCCompiler)能識別的類型,如INT8U可以定義為unsignedchar.另外,還必須編寫一個LD(鏈接腳本)文件控制編譯,將程序定位到實際的ROM和RAM資源中.為了調(diào)試方便,通常是通過BDM工具將內(nèi)核下載到目標板SDRAM中運行,調(diào)試通過后再固化到FLASH中. RTOS是當前嵌入式應用的特點.應用RTOS,可以使產(chǎn)品更可靠、功能更強大而開發(fā)周期更短.有著良好的實時性和很小的代碼量,并被廣泛移植到x86、68K、ColdFire、MPC8xx、ARM、MIPS、C5409等許多處理器上.
全部回復(14)
正序查看
倒序查看
hao_zi
LV.4
2
2007-12-31 02:01
上面是有關(guān)μC/OS-II的一點介紹,近段時間本人針對"luyu"工程師提出的純軟件化控制思想,正在嘗試用μC/OS-II控制感應加熱過程,實驗的結(jié)果才是最好的解釋,等待結(jié)果中.......
0
回復
luyuc
LV.7
3
2007-12-31 13:18
@hao_zi
上面是有關(guān)μC/OS-II的一點介紹,近段時間本人針對"luyu"工程師提出的純軟件化控制思想,正在嘗試用μC/OS-II控制感應加熱過程,實驗的結(jié)果才是最好的解釋,等待結(jié)果中.......
.  我用匯編語言編寫幾十句,都要好幾個月來反復修改,平均一天寫一句都不到;要是用os平臺太復雜了,無論如何都無法做完軟件內(nèi)的 debug ,遺留的錯誤也許不是致命的,但是將導致意外發(fā)生;如果遺留致命的軟件錯誤,將導致驅(qū)動變壓器飽和、容性硬開通、嚴重的峰值閘斷反復發(fā)生、可能炸管或存在炸管的風險.
0
回復
luyuc
LV.7
4
2007-12-31 13:46
@luyuc
.  我用匯編語言編寫幾十句,都要好幾個月來反復修改,平均一天寫一句都不到;要是用os平臺太復雜了,無論如何都無法做完軟件內(nèi)的debug,遺留的錯誤也許不是致命的,但是將導致意外發(fā)生;如果遺留致命的軟件錯誤,將導致驅(qū)動變壓器飽和、容性硬開通、嚴重的峰值閘斷反復發(fā)生、可能炸管或存在炸管的風險.
AT91SAM7S32 的匯編正在學習,但是連一個志同道合的朋友都找不到,大家都不贊同完全用匯編語言編寫這ARM7,而且也不理解;但是我決心在2-3年內(nèi)完全熟練ARM7的匯編,把所有外設(shè)的控制寄存器、狀態(tài)寄存器、數(shù)據(jù)寄存器徹底理解并熟記應用;沒有匯編語言就沒有對控制徹底 DEBUG 的方法,診斷工作是無法深入的;就象醫(yī)生要學習生理學、病理學、藥理學一樣,這匯編語言就是“生理學”,只要有可能弄懂就要去下功夫去做;
0
回復
elegun
LV.1
5
2008-01-04 10:59
@luyuc
AT91SAM7S32的匯編正在學習,但是連一個志同道合的朋友都找不到,大家都不贊同完全用匯編語言編寫這ARM7,而且也不理解;但是我決心在2-3年內(nèi)完全熟練ARM7的匯編,把所有外設(shè)的控制寄存器、狀態(tài)寄存器、數(shù)據(jù)寄存器徹底理解并熟記應用;沒有匯編語言就沒有對控制徹底DEBUG的方法,診斷工作是無法深入的;就象醫(yī)生要學習生理學、病理學、藥理學一樣,這匯編語言就是“生理學”,只要有可能弄懂就要去下功夫去做;
用C 好.
0
回復
elegun
LV.1
6
2008-01-04 10:59
@luyuc
AT91SAM7S32的匯編正在學習,但是連一個志同道合的朋友都找不到,大家都不贊同完全用匯編語言編寫這ARM7,而且也不理解;但是我決心在2-3年內(nèi)完全熟練ARM7的匯編,把所有外設(shè)的控制寄存器、狀態(tài)寄存器、數(shù)據(jù)寄存器徹底理解并熟記應用;沒有匯編語言就沒有對控制徹底DEBUG的方法,診斷工作是無法深入的;就象醫(yī)生要學習生理學、病理學、藥理學一樣,這匯編語言就是“生理學”,只要有可能弄懂就要去下功夫去做;
用C 好.
0
回復
2012-01-12 16:02
@luyuc
AT91SAM7S32的匯編正在學習,但是連一個志同道合的朋友都找不到,大家都不贊同完全用匯編語言編寫這ARM7,而且也不理解;但是我決心在2-3年內(nèi)完全熟練ARM7的匯編,把所有外設(shè)的控制寄存器、狀態(tài)寄存器、數(shù)據(jù)寄存器徹底理解并熟記應用;沒有匯編語言就沒有對控制徹底DEBUG的方法,診斷工作是無法深入的;就象醫(yī)生要學習生理學、病理學、藥理學一樣,這匯編語言就是“生理學”,只要有可能弄懂就要去下功夫去做;
精神可嘉,佩服。
0
回復
貼片機
LV.8
8
2012-01-12 16:20
@luyuc
AT91SAM7S32的匯編正在學習,但是連一個志同道合的朋友都找不到,大家都不贊同完全用匯編語言編寫這ARM7,而且也不理解;但是我決心在2-3年內(nèi)完全熟練ARM7的匯編,把所有外設(shè)的控制寄存器、狀態(tài)寄存器、數(shù)據(jù)寄存器徹底理解并熟記應用;沒有匯編語言就沒有對控制徹底DEBUG的方法,診斷工作是無法深入的;就象醫(yī)生要學習生理學、病理學、藥理學一樣,這匯編語言就是“生理學”,只要有可能弄懂就要去下功夫去做;

都上操作系統(tǒng)了,只能用C了;用匯編的話,普通8位機,做小程序可以.ARM7你還用純匯編的話,你就慢慢寫吧...

0
回復
貼片機
LV.8
9
2012-01-12 16:24
@貼片機
都上操作系統(tǒng)了,只能用C了;用匯編的話,普通8位機,做小程序可以.ARM7你還用純匯編的話,你就慢慢寫吧...
有時候,做事情不能一味地要求從源頭做起.就拿做電源我們不可能電阻電容每個器件都自已做,一個道理.有更加快捷和高效的辦法為什么不用呢,況且有些情況下是你想從源頭做起都做不了的...
0
回復
stevenpe
LV.4
10
2012-01-13 08:49
@貼片機
有時候,做事情不能一味地要求從源頭做起.就拿做電源我們不可能電阻電容每個器件都自已做,一個道理.有更加快捷和高效的辦法為什么不用呢,況且有些情況下是你想從源頭做起都做不了的...

不太認同貼片機的觀點。

C和匯編相比較而言,固然C更高級,更進一步,但具體選擇還是要看應用場合和自己的擅長。相對于匯編而言,C語言是更簡單,更傻瓜式的語言。有些時候,不是說做事情一味的要從源頭做起,只是同樣的功能的程序,用匯編和C編寫,運行效率和程序大小大不相同。

就感應加熱控制器而言,這么簡單的功能,用上16位的DSP已是足矣實現(xiàn)控制所需和人機界面所需的各種功能,更別說用ARM,甚至再加UCOS-II這樣的小系統(tǒng)了。編寫這樣的軟件,你去用C語言固然很簡單,但真正在單片機里面運行的實用性確是不太理想。如果用匯編來寫,那就相對較好了。

也有C和匯編互通偷懶的方法,如果不愿意用匯編來寫,你可以用C先寫完了,然后編譯,出來相應的匯編,再在此基礎(chǔ)上做調(diào)試修改,那就方便了。

0
回復
uuniao
LV.5
11
2012-01-15 14:52
@stevenpe
不太認同貼片機的觀點。C和匯編相比較而言,固然C更高級,更進一步,但具體選擇還是要看應用場合和自己的擅長。相對于匯編而言,C語言是更簡單,更傻瓜式的語言。有些時候,不是說做事情一味的要從源頭做起,只是同樣的功能的程序,用匯編和C編寫,運行效率和程序大小大不相同。就感應加熱控制器而言,這么簡單的功能,用上16位的DSP已是足矣實現(xiàn)控制所需和人機界面所需的各種功能,更別說用ARM,甚至再加UCOS-II這樣的小系統(tǒng)了。編寫這樣的軟件,你去用C語言固然很簡單,但真正在單片機里面運行的實用性確是不太理想。如果用匯編來寫,那就相對較好了。也有C和匯編互通偷懶的方法,如果不愿意用匯編來寫,你可以用C先寫完了,然后編譯,出來相應的匯編,再在此基礎(chǔ)上做調(diào)試修改,那就方便了。
早就有基于OS的方案了,現(xiàn)在的編譯器編譯出來的匯編代碼比你自己用匯編寫的好很多的……
0
回復
stevenpe
LV.4
12
2012-01-15 18:44
@uuniao
早就有基于OS的方案了,現(xiàn)在的編譯器編譯出來的匯編代碼比你自己用匯編寫的好很多的……
,估計是偷懶一族,你的理由是電腦比人腦好使,人編出來的編譯器比人好使。
0
回復
uuniao
LV.5
13
2012-01-16 09:10
@stevenpe
[圖片],估計是偷懶一族,你的理由是電腦比人腦好使,人編出來的編譯器比人好使。

呵呵,做電源的兄弟硬件的居多,對軟件精通的很少,小程序固守在匯編的世界里還好,大的程序就很難嘍……

咱們不討論編譯器,但是有一點,如果平臺更換的時候匯編和C那個更有優(yōu)勢呢,如果代碼上幾萬行呢……

0
回復
stevenpe
LV.4
14
2012-01-16 15:38
@uuniao
呵呵,做電源的兄弟硬件的居多,對軟件精通的很少,小程序固守在匯編的世界里還好,大的程序就很難嘍……咱們不討論編譯器,但是有一點,如果平臺更換的時候匯編和C那個更有優(yōu)勢呢,如果代碼上幾萬行呢……
你說的沒錯,我們討論的就是在電源的應用,試問你說的這個如果在電源這行業(yè)的應用里成立的有多少?當然,如果你編個交換機或者工控機的底層軟件,那就另當別論了,別說用匯編來做,就是用C來做,也得累死個人啊。
0
回復
駱記123
LV.5
15
2012-04-18 17:26
@stevenpe
你說的沒錯,我們討論的就是在電源的應用,試問你說的這個如果在電源這行業(yè)的應用里成立的有多少?當然,如果你編個交換機或者工控機的底層軟件,那就另當別論了,別說用匯編來做,就是用C來做,也得累死個人啊。
Arm7剛開始裸奔的路過。
0
回復
發(fā)