ucosi用什麼編譯器
❶ uCOS-ii為什麼一部分需要匯編語言而不是全部都是C語言
因為需要做任務切換 即把CPU的寄存器 取出 或 恢復 這些與硬體相關的操作是C語言做不到的
❷ 學習ucos用vs編譯器可以么
肯定沒有被淘汰,尺有所長、寸有所短:重量級的高級的操作系統(如CE、VxWorks等等)當然支持的功能就比較全面;而輕量級的uCos也有它的優點,最大的優點就是重啟時間短,而官方維護的uCos如乙太網協議棧、LCD顯示驅動等等也都一應俱全。
總之,uCos還是被很多是被廣泛應用在強實時性、高可靠性的應用領域,學吧。
❸ UCOS II怎麼沒有OS_CPU.H OS_CPU_C.C OS_CPU_A.ASM。這個幾個文件,還有INCLUDES.H
這個有啊!估計你們有好好找啊!這個在Micrium\software\uC-CPU\ARM-Cortex-M3\IAR(最後的兩個是因為我移植在Cortex-M3上,編譯器用的是IAR)。如果你用的是別的內核,編譯器用的其它的也是有相對應的。希望能對你有幫助!
❹ ucos ii是什麼啊
μC/OS-II是一種可移植的,可植入ROM的,可裁剪的,搶占式的,實時多任務操作系統內核。它被廣泛應用於微處理器、微控制器和數字信號處理器。 μC/OS-II 的前身是μC/OS,最早出自於1992 年美國嵌入式系統專家Jean J.Labrosse 在《嵌入式系統編程》雜志的5 月和6 月刊上刊登的文章連載,並把μC/OS 的源碼發布在該雜志的B B S 上。 μC/OS 和μC/OS-II 是專門為計算機的嵌入式應用設計的, 絕大部分代碼是用C語言編寫的。CPU 硬體相關部分是用匯編語言編寫的、總量約200行的匯編語言部分被壓縮到最低限度,為的是便於移植到任何一種其它的CPU 上。用戶只要有標準的ANSI 的C交叉編譯器,有匯編器、連接器等軟體工具,就可以將μC/OS-II嵌入到開發的產品中。μC/OS-II 具有執行效率高、佔用空間小、實時性能優良和可擴展性強等特點, 最小內核可編譯至 2KB 。μC/OS-II 已經移植到了幾乎所有知名的CPU 上。 嚴格地說uC/OS-II只是一個實時操作系統內核,它僅僅包含了任務調度,任務管理,時間管理,內存管理和任務間的通信和同步等基本功能。沒有提供輸入輸出管理,文件系統,網路等額外的服務。但由於uC/OS-II良好的可擴展性和源碼開放,這些非必須的功能完全可以由用戶自己根據需要分別實現。 uC/OS-II目標是實現一個基於優先順序調度的搶占式的實時內核,並在這個內核之上提供最基本的系統服務,如信號量,郵箱,消息隊列,內存管理,中斷管理等。 uC/OS-II以源代碼的形式發布,但並不意味著它是開源軟體。你可以將其用於教學和私下研究(peaceful research);但是如果你將其用於商業用途,那麼你必須通過Micrium獲得商用許可。
❺ 學習ucos的疑問啟動代碼和編譯器
首先,俺不是高手,呵呵,隨便扯兩句。
1.啟動代碼沒有必要完全看懂,隨著你的應用,會漸漸了解的,主要就是一個SP的初始化和PC的跳轉。
2.os_cpu_c.c,如果我記得沒錯的話,這裡面主要是一個任務堆棧初始化的函數,就是要把任務的堆棧初始化成剛剛發生中斷壓棧的情況一樣,你可以好好看一下那個壓棧的順序,多少有點講究的,總而言之,目的就是把任務的堆棧初始化成剛剛發生中斷壓棧的情況一樣。
os_cpu_a.asm這個主要是為了實現任務的切換,一個是多任務開始時的,一個是中斷級的任務切換,一個是任務級的切換,還有一個是滴答時鍾的實現,之所以放在匯編文件里,是因為這些函數在絕大多數微控制器或微處理器中需要涉及到寄存器的操作,不能在C中實現。
3.至於先學習51還是arm的移植,這個無所謂的,看你對處理器的掌握程度,熟悉哪個就從哪個先開始,因為移植不是最終目的,只是有個利於熟悉內核運作的過程,主要還是在應用上面。
4.對編譯器多少還是要有些了解才行,比如棧操作,不熟悉的話就不能寫出c_cpu_c.c中的那個棧初始化函數,對任務的切換也不能有深刻的理解。
以上就是我的一些淺顯的回答,
希望能對你有所幫助。。
有具體的問題可以給我的空間留言什麼的。。
----------------------------mscfox
❻ ucos ii是如何將代碼移植到80x86上的
沒錯,是borland C上編譯的,borland C可以編譯.c.h的文件,建立一個工程,把相應的文件添加進去編譯就可以了。
❼ 線性卷積在DSP晶元上的實現
DSP的特點
對於沒有使用過DSP的初學者來說,第一個困惑就是DSP其他的嵌入式處理器究竟有什麼不同,它和單片機,ARM有什麼區別。事實上,DSP也是一種嵌入式處理器,它完全可以完成單片機的功能。
唯一的重要的區別在於DSP支持單時鍾周期的"乘-加"運算。這幾乎是所有廠家的DSP晶元的一個共有特徵。幾乎所有的DSP處理器的指令集中都會有一條MAC指令,這條指令可以把兩個操作數從RAM中取出相乘,然後加到一個累加器中,所有這些操作都在一個時鍾周期內完成。擁有這樣一條指令的處理器就具備了DSP功能。
具有這條指令就稱之為數字信號處理器的原因在於,所有的數字信號處理演算法中最為常見的算術操作就是"乘-加"。這是因為數字信號處理中大量使用了內積,或稱"點積"的運算。無論是FIR濾波,FFT,信號相關,數字混頻,下變頻。所有這些數字信號處理的運算經常是將輸入信號與一個系數表或者與一個本地參考信號相乘然後積分(累加),這就表現為將兩個向量(或稱序列)進行點積,在編程上就變成將輸入的采樣放在一個循環buffer里,本地的系數表或參考信號也放在一個buffer里,然後使用兩個指針指向這兩個buffer。這樣就可以在一個loop裡面使用一個MAC指令將二者進行點積運算。這樣的點積運算對與處理器來說是最快的,因為僅需一個始終周期就可以完成一次乘加。
了解DSP的這一特點後,當我們設計一個嵌入式系統時,首先要考慮處理器所實現的演算法中是否有點積運算,即是否要經常進行兩個數組的乘加,(記住數字濾波,相關等都表現為兩個數組的點積)如果有的話,每秒要做多少次,這樣就能夠決定是否採用DSP,採用多高性能的DSP了。
浮點與定點
浮點與定點也是經常是初學者困惑的問題,在選擇DSP器件的時候,是採用浮點還是採用定點,如果用定點是16位還是32位?其實這個問題和你的演算法所要求的信號的動態范圍有關。
定點的計算不過是把一個數據當作整數來處理,通常AD采樣來的都是整數,這個數相對於真實的模擬信號有一個刻度因子,大家都知道用一個16位的AD去采樣一個0到5V的信號,那麼AD輸出的整數除以2^16再乘以5V就是對應的電壓。在定點DSP中是直接對這個16位的采樣進行處理,並不將它轉換成以小數表示的電壓,因為定點DSP無法以足夠的精度表示一個小數,它只能對整數進行計算。
而浮點DSP的優勢在於它可以把這個采樣得到的整數轉換成小數表示的電壓,並不損失精度(這個小數用科學記數法來表示),原因在於科學記數法可以表示很大的動態范圍的一個信號,以IEEE754浮點數為例,
單精度浮點格式: [31] 1位符號 [30-23]8位指數 [22-00]23位小數
這樣的能表示的最小的數是+-2^-149,最大的數是+-(2-2^23)*2^127.動態范圍為20*log(最大的數/最小的數)=1667.6dB 這樣大的動態范圍使得我們在編程的時候幾乎不必考慮乘法和累加的溢出,而如果使用定點處理器編程,對計算結果進行舍入和移位則是家常便飯,這在一定程度上會損失是精度。原因在於定點處理處理的信號的動態范圍有限,比如16位定點DSP,可以表示整數范圍為1-65536,其動態范圍為20*log(65536/1)=96dB.對於32定點DSP,動態范圍為20*log(2^32/1)=192dB,遠小於32位ieee浮點數的1667.6dB,但是,實際上192dB對絕大多數應用所處理的信號已經足夠了。
由於AD轉換器的位數限制,一般輸入信號的動態范圍都比較小,但在DSP的信號處理中,由於點積運算會使中間節點信號的動態范圍增加,所以主要考慮信號處理流程中中間結果的動態范圍,以及演算法對中間結果的精度要求,來選擇相應的DSP。另外就是浮點的DSP更易於編程,定點DSP編程中程序員要不斷調整中間結果的P,Q值,實際就是不斷對中間結果進行移位調整和舍入。
DSP與RTOS
TI的CCS提供BIOS,ADI的VDSP提供VDK,都是基於各自DSP的嵌入式多任務內核。DSP編程可以用單用C,也可以用匯編,或者二者結合,一般軟體編譯工具都提供了很好的支持。我不想在這里多說BIOS,VDK怎麼用這在相應的文檔里說的很詳細。我想給初學者說說DSP的RTOS原理。用短短幾段話說這個復雜的東西也是挑戰!
其實DSP的RTOS和基於其他處理器的通用RTOS沒什麼大的區別,現在幾乎人人皆知的uCOSii也很容易移植到DSP上來,只要把寄存器保存與恢復部分和堆棧部分改改就可以。一般在用BIOS和VDK之前,先看看操作系統原理的書比較好。uCOS那本書也不錯。
BIOS和VDK其實是一個RTOS內核函數集,DSP的應用程序會和這些函數連接成一個可執行文件。其實實現一個簡單的多任務內核並不復雜,首先定義好內核的各種數據結構,然後寫一個scheler函數,功能是從所有就緒任務中(通過查找就緒任務隊列或就緒任務表)找出優先順序最高的任務,並恢復其執行。然後在此基礎上寫幾個用於任務間通信的函數就可以了,比如event,message box,等等。
RTOS一般採用搶先式的任務調度方式,舉例說當任務A等待的資源available的時候,DSP會執行一個任務調度函數scheler,這個函數會檢查當前任務是否比任務A優先順序低,如果是的話,就會把它當前掛起,然後把任務A保存在堆棧里寄存器值全部pop到DSP處理器中(這就是所謂的任務現場恢復)。接著scheler還會把從堆棧中取出任務A掛起時的程序執行的地址,pop到PC,使任務A繼續執行。這樣當前任務就被任務A搶先了。
使用RTOS之後,每個任務都會有一個主函數,這個函數的起始地址就是該任務的入口。一般每個任務的主函數里有一個死循環,這個循環使該任務周期地執行,完成一部分演算法模塊的功能,其實這個函數跟普通函數沒任何區別,類似於C語言中的main函數。一個任務創建的時候,RTOS會把這個函數入口地址壓入任務的堆棧中,好象這個函數(任務)剛發生過一次中斷一樣。一旦這個新創建任務的優先順序在就緒隊列中是最高的,RTOS就會從其堆棧中彈出其入口地址開始執行。
有一個疑問是,不使用RTOS,而是簡單使用一個主循環在程序中調用各個函數模塊,一樣可以實現軟體的調度執行。那麼,這種常用的方法與使用RTOS相比有什麼區別呢?其實,使用主循環的方法不過是一種沒有優先順序的順序執行的調度策略而已。這種方法的缺點在於,主循環中調用的各個函數是順序執行的,那麼,即使是一個無關緊要的函數(比如閃爍一個LED),只要他不主動返回,也會一直執行直到結束,這時,如果發生一個重要的事件(比如DMA buffer full 中斷),就會得不到及時的響應和處理,只能等到那個閃爍LED的函數執行完畢。這樣就使整個DSP處理的優先次序十分不合理。而在使用了RTOS之後,當一個重要的事件發生時,中斷處理會進入RTOS,並調用scheler,這時scheler 會讓處理這一事件的任務搶佔DSP處理器(因為它的優先順序高)。而哪個閃爍LED任務即使晚執行幾毫秒都沒任何影響。這樣整個DSP的調度策略就十分合理。
RTOS要說的內容太多,我只能講一下自己的一點體會吧
DSP與正(余)弦波
在DSP的應用中,我們經常要用到三角函數,或者合成一個正(余)弦波。這是因為我們喜歡把信號通過傅立葉變換映射到三角函數空間來理解信號的頻率特性。信號處理的一些計算技巧都需要在DSP軟體中進行三角函數計算。然而三角函數計算是非線性的計算,DSP並沒有專門的指令來求一個數的正弦或餘弦。於是我們需要用線性方法來近似求解。
一個直接的想法是用多項式擬合,這也正是大多數DSP C編譯器提供正餘弦庫函數所採用的方法。其原理是把三角函數向函數空間{1,x,x^2,x^3....}上投影,從而獲得一系列的系數,用這些系數就可以擬合出三角函數。比如,我們在[0,pi/2]區間上擬合sin,只需在matlab中輸入以下命令:
x=0:0.05:pi/2;
p=polyfit(x,sin(x),5)
就得到5階的多項式系數:
p =
0.00581052047605 0.00580963216172 -0.17193865685360
0.00209002716293 0.99969270087312 0.00000809543448
於是在[0,pi/2]區間上:
sin(x)= 0.00000809543448+0.99969270087312*x+ 0.00209002716293*x^2-0.17193865685360*x^3+
0.00580963216172*x^4+0.00581052047605*x^5
於是在DSP程序中,我們可以通過用乘加(MAC)指令計算這個多項式來近似求得sin(x)
當然如果用定點DSP還要把P這個多項式系數表用一定的Q值來改寫成定點數。
這樣的三角函數計算一般都需要幾十個cycle 的開銷。這對於某些場合是不能容忍的。
另一種更快的方法是藉助於查表,比如,我們將[0,pi/2]分成32個區間,每個區間長度就為pi/64,在每個區間上我們使用直線段擬合sin曲線,每個區間線段起點的正弦值和線段斜率事先算好,存在RAM里,這樣就需要在在RAM里存儲64個
常數:
32個起點的精確的正弦值(事先算好): s[32]={0,sin(pi/64),sin(pi/32),sin(pi/16)....}
32個線段的斜率: f[32]={0.049,.....}
對於輸入的每一個x,先根據其大小找到所在區間i,通常x用定點表示,一般取其高幾位就是系數i了,然 後通過下式即可求出sin(x):
sin(x)= s[i]*f[i]
這樣一般只需幾個CYCLE就可以算出正弦值,如果需要更高的精度,可以將區間分得更細,當然,也就需 要更多的RAM去存儲常數表。
事實上,不僅三角函數,其他的各種非線性函數都是這樣近似計算的。
❽ 學過UCOS_II 但是不會用 這個系統要怎麼才能燒進單片機啊
看你用的是哪款單片機和編譯器了,用KEIL4的話,對STM32就直接點LOAD就行了,也可以用專用的燒錄軟體的
❾ stm32 用什麼編譯器好
應該IAR好很多。
同樣的ucosII本家的移植代碼Micrium-ST-uCOS-II-LCD-STM32,
用裡面自帶的keil工程和IAR工程編譯,
都設置為最大尺寸優化,
keil的編譯結果:
Program Size: Code=27562 RO-data=4870 RW-data=196 ZI-data=9240
FLASF佔用:Code+RO-data+RW-data = 27562 +4870 +196 = 32628位元組
RAM佔用:RW-data+ZI-data = 196 + 9240 = 9436位元組
IAR的編譯結果:
13 730 bytes of readonly code memory
5 618 bytes of readonly data memory
8 636 bytes of readwrite data memory
FLASF佔用:13 730 + 5 618 = 19348位元組
RAM佔用:8 636位元組
KEIL比IAR佔用FLASH多:32628- 19348 = 13280位元組
❿ ucos-II移植到51單片機可以嗎
可以,只要滿足:
1.處理器的C編譯器能產生可重入代碼。
2.用C語言就可以打開和關閉中斷。
3.處理器支持中斷,並且能產生定時中斷(通常在10至100Hz之間)。
4.處理器支持能夠容納一定量數據(可能是幾千位元組)的硬體堆棧 。
5.處理器有將堆棧指針和其它CPU寄存器讀出和存儲到堆棧或內存中的指令。
但是移植麻煩一點,因為沒有軟體中斷,不過可以設一個軟體陷阱
需要修改的文件有:
OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM
具體這么該請參考網上,肯定有現成的程序