當前位置:首頁 » 編程軟體 » uc編譯器

uc編譯器

發布時間: 2022-11-20 12:45:50

① uc/os iii應該使用什麼編譯

找到適合你的arm板的編譯器(常用的有ADS、Keilforarm(也就是keilMDK)、IAR等),將uc/os源碼進行編譯,前提是這里的源代碼已經經過移植,可以在你的arm上運行,也就是us/os官方所謂的「port」。然後,一般通過jlink或Ulink下載到電路板,如果你的電路板有類似於bootloader之類的啟動代碼,一般還可以用串口或網線或USB下載

② UC,C,C++,VC,C#,.NET的區別與聯系,簡單說下。謝謝!

UC 好像是手機瀏覽器吧。
C 是一種面向過程的語言。
C++ 是一種面向對象的編程語言。
VC是C ,C++ 程序的編輯軟體。
C# 是一種面向對象的編程語言。
.NET 是一個開發平台。

③ 嵌入式實時操作系統uc/uo-II在ARM上的移植 這個設計有做過嗎,給點線索 非常感謝

所謂移植,就是使一個實時內核能在某個微處理器或微控制器上運行。為了方便移植,大部分的µC/OS-Ⅱ代碼是用c語言寫的;但仍需要用C和匯編語言寫一些與處理器相關的代碼,這是因為µC/OS-Ⅱ在讀寫處理器寄存器時只能通過匯編語言來實現。由於µC/OS-Ⅱ在設計時就已經充分考慮了可移植性,所以µC/OS-Ⅱ的移植相對來說是比較容易的。[5,6]
要使µC/OS-Ⅱ正常運行,處理器必須滿足以下要求:
(1) 處理器的C編譯器能產生可重入代碼。
(2) 用C語言就可以打開和關閉中斷。
(3) 處理器支持中斷,並且能產生定時中斷(通常在10至100Hz之間)。
(4) 處理器支持能夠容納一定量數據(可能是幾千位元組)的硬體堆棧。
(5) 處理器有將堆棧指針和其它CPU寄存器讀出和存儲的指令
圖2-1說明了µC/OS-Ⅱ的結構以及它與硬體的關系。從圖中可以看到整個系統的架構。最底層是硬體層,該層主要涉及到CPU處理器的架設,以及它與外部各功能模塊的連接,對於CPU處理器的初始化也是構架嵌入式系統的重要內容,特別是對定時器的設置,將是構建操作系統的基礎,它決定整個系統的性能。對於軟體部分,最底層是與處理器相關的程序代碼,該段代碼直接對CPU處理器進行初始化,這部分代碼就是移植操作系統的主要內容,也是最難以理解的部分。這段代碼絕大部分程序是用匯編語言編寫的,因為在程序運行的時候,這部分代碼的調用次數最頻繁。在向上的代碼就與處理器沒有任何的關系,其中一部分包括操作系統的配置文件,像OS_CORE.c,OS_FLAG.c等文件。這部分代碼是用來編寫一些基本的底層函數,這些函數將作為以後應用部分的基本函數庫進行調用,這部分函數構成了操作系統的基本構架,不同的操作系統所對應的系統的設計思想不同,主要體現在這些函數的設計中。除了系統的基本函數外,還有應用部分的基本配置文件。該文件聲明的是與具體的應用配置有關的一些設置文件。比如,各任務的一些基本參數,所使用的信號量的聲明,以及液晶的參數配置等。不同的應用程序對應的該文件參數配置也不同。有了底層的基本配置文件,就可以編寫具體的應用程序了,最上層就是應用程序,針對不同的應用需求,編寫不同的應用程序。
μCOS-II不使用C語言中的short、int、long等數據類型的定義,因為它們與處理器類型有關,隱含著不可移植性。代之以移植性強的整數數據類型,這樣,既直觀又可移植,不過這就成了必須移植的代碼。根據ADS編譯器的特性,這些代碼如程序清單圖2-2所示。
與所有的實時內核一樣,µC/OS-Ⅱ需要先禁止中斷再訪問代碼的臨界段,並且在訪問完畢後重新允許中斷。這就使得µC/OS-Ⅱ能夠保護臨界段代碼免受多任務或中斷服務常式(ISRs)的破壞。為了隱藏編譯器廠商提供的具體實現方法,µC/OS-Ⅱ定義了兩個宏來禁止和允許中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。
μCOS-II使用結構常量OS_STK_GROWTH中指定堆棧的生長方式:置OS_STK_GROWTH為0表示堆棧從下往上長。置OS_STK_GROWTH為1表示堆棧從上往下長。雖然ARM處理器核對於兩種方式均支持,但ADS的C語言編譯器僅支持一種方式,即從上往下長,並且必須是滿遞減堆棧,所以OS_STK_GROWTH的值為1。
µC/OS-Ⅱ的移植實例要求用戶編寫四個簡單的匯編語言函數: OSStartHighRdy();OSCtxSw();OSIntCtxSw();OSTickISR()。如果用戶的編譯器支持插入匯編語言代碼的話,用戶就可以將所有與處理器相關的代碼放到OS_CPU_C.C文件中,而不必再擁有一些分散的匯編語言文件。
使就緒狀態的任務開始運行的函數叫做OSStart(),如下示意函數所示。在用戶調用OSStart()之前,用戶必須至少已經建立了一個任務。OSStartHighRdy()假設OSTCBHighRdy指向的是優先順序最高的任務的任務控制塊。為了簡單一點,堆棧指針總是儲存在任務控制塊(即它的OS_TCB)的開頭。換句話說,也就是要想恢復的任務堆棧指針總是儲存在OS_TCB的0偏址內存單元中。
如果當前任務調用µC/OS-Ⅱ提供的系統服務,並使得更高優先順序任務處於就緒狀態,µC/OS-Ⅱ就會藉助上面提到的向量地址找到OSCtxSw()。在系統服務調用的最後,µC/OS-Ⅱ會調用OSSched(),並由此來推斷當前任務不再是要運行的最重要的任務了。軟中斷 (或陷阱) 指令會強制一些處理器寄存器(比如返回地址和處理器狀態字)到當前任務的堆棧中,並使處理器執行OSCtxSw()。這些代碼必須寫在匯編語言中,因為用戶不能直接從C中訪問CPU寄存器。注意在OSCtxSw()和用戶定義的函數OSTaskSwHook()的執行過程中,中斷是禁止的。

OSIntExit()通過調用OSIntCtxSw()來從ISR中執行切換功能。因為OSIntCtxSw()是在ISR中被調用的,所以可以斷定所有的處理器寄存器都被正確地保存到了被中斷的任務的堆棧之中。實際上除了需要的東西外,堆棧結構中還有其它的一些東西。OSIntCtxSw()必須要清理堆棧,這樣被中斷的任務的堆棧結構內容才能滿足人們的需要。
要想了解OSIntCtxSw(),大家可以看看µC/OS-Ⅱ調用該函數的過程。假定中斷不能嵌套(即ISR不會被中斷),中斷是允許的,並且處理器正在執行任務級的代碼。當中斷來臨的時候,處理器會結束當前的指令,識別中斷並且初始化中斷處理過程,包括將處理器的狀態寄存器和返回被中斷的任務的地址保存到堆棧中。至於究竟哪些寄存器保存到了堆棧上,以及保存的順序是怎樣的,並不重要。
接著,CPU會調用正確的ISR。µC/OS-Ⅱ要求ISR在開始時要保存剩下的處理器寄存器。一旦寄存器保存好了,µC/OS-Ⅱ就要求或者調用OSIntEnter(),或者將變數OSIntNesting加1。在這個時候,被中斷任務的堆棧中只包含了被中斷任務的寄存器內容。現在,ISR可以執行中斷服務了。並且如果ISR發消息給任務(通過調用OSMboxPost()或OSQPost()),恢復任務(通過調用OSTaskResume()),或者調用OSTimeTick()或OSTimeDlyResume()的話,有可能使更高優先順序的任務處於就緒狀態。
假設有一個更高優先順序的任務處於就緒狀態。µC/OS-Ⅱ要求用戶的ISR在完成中斷服務的時候調用OSIntExit()。OSIntExit()會告訴µC/OS-Ⅱ到了返回任務級代碼的時間了。調用OSIntExit()會導致調用者的返回地址被保存到被中斷的任務的堆棧中。
OSIntExit()剛開始時會禁止中斷,因為它需要執行臨界段的代碼。根據OS_ENTER_CRITICAL()的不同執行過程,處理器的狀態寄存器會被保存到被中斷的任務的堆棧中。OSIntExit()注意到由於有更高優先順序的任務處於就緒狀態,被中斷的任務已經不再是要繼續執行的任務了。在這種情況下,指針OSTCBHighRdy會被指向新任務的OS_TCB,並且OSIntExit()會調用OSIntCtxSw()來執行任務切換。調用OSIntCtxSw()也同樣使返回地址被保存到被中斷的任務的堆棧中。
用戶切換任務的時候,用戶只想將某些項保留在堆棧中,並忽略其它項。這是通過調整堆棧指針(加一個數在堆棧指針上)來完成的。加在堆棧指針上的數必須是明確的,而這個數主要依賴於移植的目標處理器(地址空間可能是16,32或64位),所用的編譯器,編譯器選項,內存模式等等。另外,處理器狀態字可能是8,16,32甚至64位寬,並且OSIntExit()可能會分配局部變數。有些處理器允許用戶直接增加常量到堆棧指針中,而有些則不允許。在後一種情況下,可以通過簡單的執行一定數量的pop(出棧)指令來實現相同的功能。一旦堆棧指針完成調整,新的堆棧指針會被保存到被切換出去的任務的OS_TCB中。
這些代碼必須寫在匯編語言中,因為用戶不能直接從C語言中訪問CPU寄存器。如果用戶的編譯器支持插入匯編語言代碼的話,用戶就可以將OSIntCtxSw()代碼放到OS_CPU_C.C文件中,而不放到OS_CPU_A.ASM文件中。正如用戶所看到的那樣,除了第一行以外,OSIntCtxSw()的代碼與OSCtxSw()是一樣的。這樣在移植實例中,用戶可以通過「跳轉」到OSCtxSw()中來減少OSIntCtxSw()代碼量。
µC/OS-Ⅱ要求用戶提供一個時鍾資源來實現時間的延時和期滿功能。時鍾節拍應該每秒鍾發生10-100次。為了完成該任務,可以使用硬體時鍾,也可以從交流電中獲得50/60Hz的時鍾頻率。
這些代碼必須寫在匯編語言中,因為用戶不能直接從C語言中訪問CPU寄存器。如果用戶的處理器可以通過單條指令來增加OSIntNesting,那麼用戶就沒必要調用OSIntEnter()了。增加OSIntNesting要比通過函數調用和返回快得多。OSIntEnter()只增加OSIntNesting,並且作為臨界段代碼中受到保護。
µC/OS-Ⅱ的移植實例要求用戶編寫六個簡單的C函數:OSTaskStkInit(); OSTaskCreateHook();OSTaskDelHook();OSTaskSwHook();OSTaskStatHook(); OSTimeTickHook()。唯一必要的函數是OSTaskStkInit(),其它五個函數必須得聲明但沒必要包含代碼。
OSTaskCreate()和OSTaskCreateExt()通過調用OSTaskStkInt()來初始化任務的堆棧結構,因此,堆棧看起來就像剛發生過中斷並將所有的寄存器保存到堆棧中的情形一樣。顯示了OSTaskStkInt()放到正被建立的任務堆棧中的東西。注意,在這里我假定了堆棧是從上往下長的。下面的討論同樣適用於從下往上長的堆棧。
在用戶建立任務的時候,用戶會傳遞任務的地址,pdata指針,任務的堆棧棧頂和任務的優先順序給OSTaskCreate()和OSTaskCreateExt()。雖然OSTaskCreateExt()還要求有其它的參數,但這些參數在討論OSTaskStkInt()的時候是無關緊要的。為了正確初始化堆棧結構,OSTaskStkInt()只要求剛才提到的前三個參數和一個附加的選項,這個選項只能在OSTaskCreateExt()中得到。
該函數主要是對相關的幾個寄存器進行初始化工作,初始化的寄存器對應於

④ UC瀏覽器電腦版禁用java的功能在哪裡設置

  • 瀏覽器禁止了java功能

  • 可以根據下面操作打開它。A.打開IE,選擇「工具」-「Internet選項」-「高級」-「JAVA VM」下的第一個選項「啟用JavaJIT編譯器」。(有些瀏覽器版本沒有這一項,可以不管它。)B.打開IE打開「工具」-「Internet選項」-「安全」-「自定義級別...」對話框,(1).把「Microsoft VM」中的java許可權設置為「安全等級-中」,(2)把「腳本」中的「java小程序腳本」設置為「啟用」和「活動腳本」設置為「啟用」。完成上面操作後,您需要把你的瀏覽器關掉再重新打開一下。

⑤ uc/os操作系統是怎樣啟動的

uc/os和uclinux操作系統是兩種性能優良源碼公開且被廣泛應用的的免費嵌入
式操作系統,可以作為研究實時操作系統和非實時操作系統的典範。本文通過對
uc/os和uclinux的對比,分析和總結了嵌入式操作系統應用中的若乾重要問題,
歸納了嵌入式系統開發中操作系統的選型依據。
兩種開源嵌入式操作系統介紹
uc/os和uclinux操作系統,是當前得到廣泛應用的兩種免費且公開源碼的嵌入
式操作系統。uc/os適合小型控制系統,具有執行效率高、佔用空間小、實時性
能優良和可擴展性強等特點,最小內核可編譯至2k。uclinux則是繼承標准linux
的優良特性,針對嵌入式處理器的特點設計的一種操作系統,具有內嵌網路協議、
支持多種文件系統,開發者可利用標准linux先驗知識等優勢。其編譯後目標文
件可控制在幾百k量級。
uc/os是一種免費公開源代碼、結構小巧、具有可剝奪實時內核的實時操作系統。
其內核提供任務調度與管理、時間管理、任務間同步與通信、內存管理和中斷服
務等功能。
uclinux是一種優秀的嵌入式linux版本。uclinux是micro-conrol-linux的縮寫。
同標准linux相比,它集成了標准linux操作系統的穩定性、強大網路功能和出
色的文件系統等主要優點。但是由於沒有mmu(內存管理單元),其多任務的實
現需要一定技巧。
兩種嵌入式操作系統主要性能比較
嵌入式操作系統是嵌入式系統軟硬體資源的控制中心,它以盡量合理的有效方法
組織多個用戶共享嵌入式系統的各種資源。其中用戶指的是系統程序之上的所有
軟體。所謂合理有效的方法,指的就是操作系統如何協調並充分利用硬體資源來
實現多任務。復雜的操作系統都支持文件系統,方便組織文件並易於對其規范化
操作。
嵌入式操作系統還有一個特點就是針對不同的平台,系統不是直接可用的,一般
需要經過針對專門平台的移植操作系統才能正常工作。
進程調度、文件系統支持和系統移植是在嵌入式操作系統實際應用中最常見的問
題,下文就從這幾個角度入手對uc/os和uclinux進行分析比較。
進程調度
任務調度主要是協調任務對計算機系統內資源(如內存、i/o設備、cpu)的爭奪
使用。進程調度又稱為cpu調度,其根本任務是按照某種原則為處於就緒狀態
的進程分配cpu。由於嵌入式系統中內存和i/o設備一般都和cpu同時歸屬於
某進程,所以任務調度和進程調度概念相近,很多場合不加區分,下文中提到的
任務其實就是進程的概念。
進程調度可分為"剝奪型調度"和"非剝奪型調度"兩種基本方式。所謂"非剝奪型
調度"是指:一旦某個進程被調度執行,則該進程一直執行下去直至該進程結束,
或由於某種原因自行放棄cpu進入等待狀態,才將cpu重新分配給其他進程。
所謂"剝奪型調度"是指:一旦就緒狀態中出現優先權更高的進程,或者運行的進
程已用滿了規定的時間片時,便立即剝奪當前進程的運行(將其放回就緒狀態),
把cpu分配給其他進程。
作為實時操作系統,uc/os是採用的可剝奪型實時多任務內核。可剝奪型的實時
內核在任何時候都運行就緒了的最高優先順序的任務。uc/os中最多可以支持64
個任務,分別對應優先順序0"63,其中0為最高優先順序。調度工作的內容可以分
為兩部分:最高優先順序任務的尋找和任務切換。
其最高優先順序任務的尋找是通過建立就緒任務表來實現的。uc/os中的每一個任
務都有獨立的堆棧空間,並有一個稱為任務控制塊tcb(task control block)數據
結構,其中第一個成員變數就是保存的任務堆棧指針。任務調度模塊首先用變數
ostcbhighrdy記錄當前最高級就緒任務的tcb地址,然後調用os_task_sw()
函數來進行任務切換。
uclinux的進程調度沿用了linux的傳統,系統每隔一定時間掛起進程,同時系
統產生快速和周期性的時鍾計時中斷,並通過調度函數(定時器處理函數)決定進
程什麼時候擁有它的時間片。然後進行相關進程切換,這是通過父進程調用fork
函數生成子進程來實現的。
uclinux系統fork調用完成後,要麼子進程代替父進程執行(此時父進程已經
sleep),直到子進程調用exit退出;要麼調用exec執行一個新的進程,這個時候
產生可執行文件的載入,即使這個進程只是父進程的拷貝,這個過程也不可避免。
當子進程執行exit或exec後,子進程使用wakeup把父進程喚醒,使父進程繼續
往下執行。
uclinux由於沒有mmu管理存儲器,其對內存的訪問是直接的,所有程序中訪
問的地址都是實際的物理地址。操作系統隊內存空間沒有保護,各個進程實際上
共享一個運行空間。這就需要實現多進程時進行數據保護,也導致了用戶程序使
用的空間可能佔用到系統內核空間,這些問題在編程時都需要多加註意,否則容
易導致系統崩潰。
由上述分析可以得知,uc/os內核是針對實時系統的要求設計實現的,相對簡單,
可以滿足較高的實時性要求。而uclinux則在結構上繼承了標准linux的多任務
實現方式,僅針對嵌入式處理器特點進行改良。其要實現實時性效果則需要使系
統在實時內核的控制下運行,rt-linux就是可以實現這一個功能的一種實時內
核。
文件系統
所謂文件系統是指負責存取和管理文件信息的機構,也可以說是負責文件的建
立、撤銷、組織、讀寫、修改、復制及對文件管理所需要的資源(如目錄表、存
儲介質等)實施管理的軟體部分。
uc/os是面向中小型嵌入式系統的,如果包含全部功能(信號量、消息郵箱、消
息隊列及相關函數),編譯後的uc/os內核僅有6"10kb,所以系統本身並沒有
對文件系統的支持。但是uc/os具有良好的擴展性能,如果需要的話也可自行
加入文件系統的內容。
uclinux則是繼承了linux完善的文件系統性能。其採用的是romfs文件系統,
這種文件系統相對於一般的ext2文件系統要求更少的空間。空間的節約來自於
兩個方面,首先內核支持romfs文件系統比支持ext2文件系統需要更少的代碼,
其次romfs文件系統相對簡單,在建立文件系統超級塊(superblock)需要更少的存
儲空間。romfs文件系統不支持動態擦寫保存,對於系統需要動態保存的數據采
用虛擬ram盤的方法進行處理(ram盤將採用ext2文件系統)。
uclinux還繼承了linux網路操作系統的優勢,可以很方便的支持網路文件系統
且內嵌tcp/ip協議,這為uclinux開發網路接入設備提供了便利。
由兩種操作系統對文件系統的支持可知,在復雜的需要較多文件處理的嵌入式系
統中uclinux是一個不錯的選擇。而uc/os則主要適合一些控制系統。
操作系統的移植
嵌入式操作系統移植的目的是指使操作系統能在某個微處理器或微控制器上運
行。uc/os和uclinux都是源碼公開的操作系統,且其結構化設計便於把與處理
器相關的部分分離出來,所以被移植到新的處理器上是可能的。
以下對兩種系統的移植分別予以說明。
(1)uc/os的移植
要移植uc/os,目標處理器必須滿足以下要求;
·處理器的c編譯器能產生可重入代碼,且用c語言就可以打開和關閉中斷;
·處理器支持中斷,並能產生定時中斷;
·處理器支持足夠的ram(幾k位元組),作為多任務環境下的任務堆棧;
·處理器有將堆棧指針和其他cpu寄存器讀出和存儲到堆棧或內存中的指令。
在理解了處理器和c編譯器的技術細節後,uc/os的移植只需要修改與處理器
相關的代碼就可以了。具體有如下內容:
·os_cpu.h中需要設置一個常量來標識堆棧增長方向;
·os_cpu.h中需要聲明幾個用於開關中斷和任務切換的宏;
·os_cpu.h中需要針對具體處理器的字長重新定義一系列數據類型;
·os_cpu_a.asm需要改寫4個匯編語言的函數;
·os_cpu_c.c需要用c語言編寫6個簡單函數;
·修改主頭文件include.h,將上面的三個文件和其他自己的頭文件加入。
(2)uclinux的移植
由於uclinux其實是linux針對嵌入式系統的一種改良,其結構比較復雜,相對
uc/os,uclinux的移植也復雜得多。一般而言要移植uclinux,目標處理器除了
應滿足上述uc/os應滿足的條件外,還需要具有足夠容量(幾百k位元組以上)外
部rom和ram。
uclinux的移植大致可以分為3個層次:
·結構層次的移植,如果待移植處理器的結構不同於任何已經支持的處理器結構,
則需要修改linux/arch目錄下相關處理器結構的文件。雖然uclinux內核代碼的
大部分是獨立於處理器和其體系結構的,但是其最低級的代碼也是特定於各個系
統的。這主要表現在它們的中斷處理上下文、內存映射的維護、任務上下文和初
始化過程都是獨特的。這些例行程序位於linux/arch/目錄下。由於linux所支持
體系結構的種類繁多,所以對一個新型的體系,其低級常式可以模仿與其相似的
體系常式編寫。
·平台層次的移植,如果待移植處理器是某種uclinux已支持體系的分支處理器,
則需要在相關體系結構目錄下建立相應目錄並編寫相應代碼。如mc68ez328就
是基於無mmu的m68k內核的。此時的移植需要創建
linux/arch/m68knommu/platform/ mc68ez328目錄並在其下編寫跟蹤程序(實現
用戶程序到內核函數的介面等功能)、中斷控制調度程序和向量初始化程序等。
·板級移植,如果你所用處理器已被uclinux支持的話,就只需要板級移植了。板
級移植需要在linux/arch/?platform/中建立一個相應板的目錄,再在其中建立相應
的啟動代碼crt0_rom.s或crt0_ram.s和鏈接描述文檔rom.ld或ram.ld就可以了。
板級移植還包括驅動程序的編寫和環境變數設置等內容。

通過對uc/os和uclinux的比較,可以看出這兩種操作系統在應用方面各有優劣。
uc/os佔用空間少,執行效率高,實時性能優良,且針對新處理器的移植相對簡
單。uclinux則佔用空間相對較大,實時性能一般,針對新處理器的移植相對復
雜。但是,uclinux具有對多種文件系統的支持能力、內嵌了tcp/ip協議,可
以借鑒linux豐富的資源,對一些復雜的應用,uclinux具有相當優勢。例如cisco
公司的 2500/3000/4000 路由器就是基於uclinux操作系統開發的。
總之,操作系統的選擇是由嵌入式系統的需求決定的。簡單的說就是,小型控制
系統可充分利用uc/os小巧且實時性強的優勢,如果開發pda和互聯網連接終
端等較為復雜的系統則uclinux是不錯的選擇。

⑥ UC/OS與Linux操作系統的區別

uc/os比較簡單一點,開始學的uc/os,感覺沒意思了就開始學linux,感覺ucos只是在單片機上跑跑,像arm9的一般是跑linux。其實先學哪個都差不多,因為學習方法大不相同,差別太大了,ucos太簡單,就一些信號量,郵箱什麼的,懂了也就會了,linux有點難,涉及知識太多,光是涉及內核以外的編程就需要大把大把的經典書籍去看。興趣很重要,都靠興趣過來的。

⑦ uC/OS-II的解決方法

對於這樣的設計方式,CPU必須能夠:
◆ 有相應的CPU寄存器能夠模仿SP的一些功能,能使用相應的指令來完成類似SP的一些操作;
◆ 作為SP使用的寄存器在編譯過程中最好不被編譯器默認使用。在IAR的編譯器中,有一個選項可以避免在編譯過程中使用到R4、R5。
這兩點MSP430都可以做到。
下面對一個正在運行的優先順序為6的任務中斷後,會發生的幾種情況進行分析。
1)在中斷的處理過程中沒有更高優先順序的中斷產生,即不會產生中斷嵌套。
圖3所示為中斷發生後對於任務優先順序為6的任務堆棧所進行的操作。中斷發生後,PC和SR被系統壓棧②,對於IAR C編譯器來說,會按照復雜度不同的中斷服務程序的要求,默認地進行一些寄存器的壓棧操作③。因為我們要求的堆棧格式是如圖2所示的,我們要把SP調整到SR後面④,然後進行R4~R15的壓棧操作,形成我們所要求的堆棧格式⑤。
進行任務堆棧的壓棧工作以後,就可以調整SP的指針到系統堆棧了,如圖4所示。壓棧後的SP指向最後一個壓棧內容①。我們把SP的值賦值給優先順序6任務的TCB->OSTCBStkPtr,以便進行任務調度的時候出棧使用②。接著,就把SP調整到系統堆棧處③。在中斷處理過程中,可能會出現壓棧的操作,那麼這種情況下SP的指針會隨之移動。由於是中斷堆棧中,所以不會破壞任務堆棧的格式。
由於沒有中斷嵌套,在中斷處理中沒有別的中斷發生,那麼返回的步驟和上述的進棧操作正好相反。在中斷處理完了以後,SP會自動回到圖4中③的SP位置。接著,系統會查詢到優先順序最高的任務,然後把SP的指針移到優先順序最高的任務的任務堆棧,進行R15~R4的出棧工作,最後用RETI中斷返回指令返回到新的任務。因為我們把所有的任務堆棧都規定成相同的格式,所以它們之間不會產生問題。這里需要注意的是,因為系統在C編譯器的中斷處理中會對中斷進入時默認壓棧的寄存器出棧,所以在設計出棧的程序時,要先把這些內容壓棧,這樣才能正確出棧。
2)在中斷的處理過程中,有別的中斷產生,產生中斷嵌套。
如圖5所示,由於在處理中斷的時候,SP已經被移到系統堆棧去了,只有當中斷退出的時候才可能把SP移到別的任務的任務堆棧中。所以在中斷的時候進行中斷嵌套,那麼對於中斷的處理和第一次是一樣的,所不同的是,這次保存在堆棧中的不是任務運行中的寄存器,而是中斷處理中的寄存器,而且是保存在系統堆棧中而不是任務堆棧中。從這里就可以看出優化內存的效果。所有的中斷嵌套中的寄存器壓棧都壓在系統堆棧中,這樣對於任務堆棧內存大小的要求大大降低。
因為μC/OS-II在進入中斷中,會把全局變數OSIntNesting++;在退出中斷的時候,又會把OSIntNesting--。在退出中斷進行任務切換之前,μC/OS-II會先判斷OSIntNesting是否為0,是0才會進行任務調度。當第二中斷運行結束以後,退出中斷嵌套的時候,OSIntNesting不為0,也就不會進行任務調度。因此,仍舊在系統堆棧出棧,那麼系統會繼續前面沒有完成的中斷服務程序。
接著退出中斷的順序和非中斷嵌套的順序是一樣的。在中斷處理完以後,SP會自動回到圖4中③的SP位置。接著,系統會查詢到優先順序最高的任務,然後把SP的指針移到優先順序最高的任務的任務堆棧。進行R15~R4的出棧工作,最後用RETI中斷返回指令返回到新的任務。
中斷的情況基本上就是上述兩種。對於有些文獻中提到的在中斷中會調度到更高優先順序的任務的情況,筆者覺得是不應該發生的。因為從上面的分析可以看出,默認的(μC/OS-II的設計思路)中斷處理會同時對全局變數OSIntNesting進行增減處理,以給出是否需要任務調度的條件。那麼即使在中斷服務程序中把更高優先順序的任務就緒,也會等到中斷退出以後再進行調度,除非是在中斷中直接調用更高優先順序的任務函數。但這種方法應該是和μC/OS-II的原則相違背的,沿用的是以前前後台設計的思路。
對於這樣的設計方式,時鍾節拍的處理方式必須和一般的中斷處理方式是一樣的。一般來說,MSP430使用WATCHDOG時鍾中斷作為時鍾節拍的產生源。從本質上來說,時鍾節拍本身也是中斷處理過程,所以對於時鍾節拍的處理應該和其它的中斷處理過程相同。實際上,在時鍾節拍的處理過程中也可能會存在中斷嵌套的問題。
中斷堆棧和任務堆棧分離設計的程序流程如圖6所示。

⑧ 什麼是UC/OS-2怎樣學習它

uC/OS II(Micro Control Operation System Two)是一個可以基於ROM運行的、可裁減的、搶占式、實時多任務內核,具有高度可移植性,特別適合於微處理器和控制器,是和很多商業操作系統性能相當的實時操作系統(RTOS)。為了提供最好的移植性能,uC/OS II最大程度上使用ANSI C語言進行開發,並且已經移植到近40多種處理器體繫上,涵蓋了從8位到64位各種CPU(包括DSP)。 uC/OS II可以簡單的視為一個多任務調度器,在這個任務調度器之上完善並添加了和多任務操作系統相關的系統服務,如信號量、郵箱等。其主要特點有公開源代碼,代碼結構清晰、明了,注釋詳盡,組織有條理,可移植性好,可裁剪,可固化。內核屬於搶占式,最多可以管理60個任務。從1992年開始,由於高度可靠性、魯棒性和安全性,uC/OS II已經廣泛使用在從照相機到航空電子產品的各種應用中。
uC/OS是嵌入式實時系統,主要是MCU(51, AVR, STM, ARM等)上運行,你可以在Keil環境下學習uC/OS,但是,由於Keil為交差編譯器,編譯的程序都是針對於具體MCU,並不能直接在Windows平台下運行,所以你要運行程序只能在特定硬體平台(比如開發板)上運行或模擬軟體上運行了。
如果初學,推薦使用51單片機上學習uC/OS,因為51歷史悠久,資料極其豐富,網上有大量uC/OS在51單片機上移植的代碼,而且有現成的Proteus模擬設計。

⑨ 嵌入式系統uc/os-II移植中,OS_CPU.H中有關數據類型的定義時,問題如下

typedef unsigned char BOOLEAN;的意思是將BOOLEAN定義為無符號的char類型,其作用就是你如果用"BOOLEAN b_complete;"聲明b_complete變數相當於用"usigned char b_complete"。
int類型數據根據編譯器的不同具有不同的長度,例如一些長度為16位一些為32位。如果你用short int那麼不同編譯器會為變數分不同長度的空間(16位?32位?),從而不知道是否會溢出,當然不好移植了(都不知道變數的值會不會溢出)。而char的度在C編譯器中長度都是8位(java中好像為16位),所以定義INT8S INT8U肯定用char了。
至於這句話:「uc/os-II系統的代碼不適用C語言中的short int等數據類型,因為他們是編譯器相關的,是不可移植的。相反,定義的整形數據結構等是可易移植的。」的意思是:在程序中不會出現什麼int和short int等長度根據編譯器變化而變化的數據類型,需要進行變數聲明時會用INT8S INT16S INT8U INT16U等代替,然後根據編譯環境不同只修改「typedef signed char INT8S; 」這些類型定義就行,用這樣的整形數據結構移植方便,不用修改每個個地方,如果不這樣,有變數聲明的地方移植就要改,那麼移植工作量將會是一個非常恐怖的事情,相信沒有人願意這樣的事吧。

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:714
php跳過if 發布:2025-05-12 15:34:29 瀏覽:467
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:131
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:166
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:736
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:148
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:398
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:544
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:631
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:365