Ⅰ ucos原理
ucos-ii是一個可剝奪型內核的實時操作系統,以stm32來說,使用系統滴答定時器,定時產生一個時鍾節拍,來推動任務的調度,管理,切換等。
關於系統大概的運行原理
2.當產生一個時鍾節拍時,如果有比當前運行任務優先順序更高的任務就緒,那麼優先順序(「優先順序」為0時優先順序最高)高的任務搶佔CPU,CPU保存現場環境,放入該任務堆棧中。再將優先順序高的任務的堆棧中的現場環境取出來,寫入CPU寄存器中。(CPU中的寄存器暫時還沒有仔細去研究)。當這個任務執行進入延時,或是要等待某個時間或者信號量。那麼它將放棄CPU的使用權,系統會從任務就緒表中,把優先順序最高的且就緒狀態的任務賦予CPU的使用權。至此來推動整個系統,調度所有的任務。
不發生中斷時UCOS系統時間與任務的切換
①.假設當前運行的任務是低優先順序的任務,CPU程序寄存器中存在的一些寄存器都是低優先順序的任務
②當程序運行到檢測到高優先順序的任務進入就緒狀態的時候,此時CPU發送一些命令,把CPU當前的一些程序寄存器的內容復制到低優先順序任務的堆棧中。也就是1過程。
③.此時通過剛剛的就緒表的機制,可以從程序中得到最高優先順序的任務,也就是2過程=
④.最後的過程3就是把剛剛的高優先順序任務的堆棧指針復制到CPU的程序寄存器當中,實現任務的切換。
當有中斷時,UCOS系統的執行原理
當程序正在執行一個中斷服務函數時,發生一個系統滴答中斷,因為系統滴答定時器的優先順序高,所以會中斷這個中斷服務函數執行任務切換。而有些時候,中斷時不能延時的。例如接收數據時,會發生接收錯誤。造成嚴重的後果。
這時,就有下圖中的操作,可以避免。
PendSV異常(我稱它為中斷)編程為最低的優先順序中斷。如果某個中斷正在執行,而系統滴答搶佔了它,那麼這個中斷將懸起一個PendSV中斷,來緩期執行任務切換。
UCOS的任務切換時間可以在os_cfg.h中去設置OS_TICKS_PER_SEC宏UCOS任務數等配置也可以在該文件中去尋找。
UCOS-II主要提供服務
內存管理
多任務管理
外圍資源管理
關於Make 與編譯
書中有講這一塊,所以我也記錄下我的理解
由於我平時都用keil這樣的集成開發環境,之前也有學習過一段時間的linux,但是對編譯,makefile這些理解的還是不是很好。
編輯makefile 來將源文件和包含的頭文件編譯成需要的.obj文件,然後再將這些.obj文件鏈接成,想要生成的程序。關於makefile好像每一種編譯器都有自己的makefile規則和命令,因為以前學習GCC編譯器和現在書上看到的BCC編譯器寫的makefile好像不太一樣。我也沒有去深究。
所以還是集成開發環境好,工具還是怎麼方便怎麼來。需要學習的原理的時候再去理解,實際的應用中用自己寫的Makefile去編譯文件怕是石樂志哦。
UCOS的任務
任務三要素(我理解的)
任務控制塊
OSTaskCreate((void()(void))start_task,
//任務函數
(void*)0,
//傳遞給任務函數的參數
(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],
//任務堆棧的棧頂
(INT8U)START_TASK_PRIO,
//任務的優先順序
主要包含了任務的棧頂地址,
如果處理器的堆棧是高地址向下生長的那麼棧頂地址
Ⅱ linux的PC機上,用什麼編譯器編譯arm程序比較好,比如像arm7的LPC24xx。
當然用交叉編譯工具了。arm-linux-gcc,本人比較懶,你可以上網搜索,很多的。
編譯uboot推薦3.3.1版本,編譯內核推薦4.4.3版本。是不同的版本,一定記得哈
Ⅲ gcc 編譯生成外部調試語法文件
你用的是linux系統吧? binutil包裡面有個objcpy命令:
obj --only-keep-debug [被提取的文件] [提取出來的調試符號文件,建議加.debug後綴]
另外要把調試信息去掉是用strip命令。你可以man下看看。
strip --strip-debug [需要處理的文件]
把debug信息加回去:
obj --add-gnu-debuglink=[debug文件] [需要添加debug信息的文件]
Ⅳ 如何用GCC在linux下編譯C語言程序
在Linux下面,如果要編譯一個C語言源程序,我們要使用GNU的gcc編譯器,假設我們有下面一個非常簡單的源程序(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux
");
}
要編譯這個程序,我們只要在命令行下執行:
gcc -o hello hello.c
gcc 編譯器就會為我們生成一個hello的可執行文件.執行./hello就可以看到程
序的輸出結果了
Ⅳ ucos_ii有哪些開發工具
ucos_ii是個比較簡單的實時嵌入式操作系統 在pc機上可以用bc45+tasm,linux上可以用arm-linux-gcc交叉編譯工具,嵌入式板子上可以用ads開發環境、使用jtag或者jlink模擬器。甚至可以用vc6.0或者vs來開發編譯。
Ⅵ gcc ucos中的s文件是什麼
匯編文件,與硬體平台移植相關
Ⅶ centos7怎麼編譯安裝gcc-c++
方法/步驟
1
yum install glibc-static libstdc++-static -y
安裝c和c++的靜態庫(據說如果系統中缺少libc.a和libstdc++.a編譯時會出錯,但是我沒有那麼多閑情逸致去試,實踐過的朋友可以回復一下,分享一下經驗,讓大家都長長見識)
2
下載解壓gcc,我的gcc目錄是gcc-4.8.0
3
進入gcc目錄,執行:
./contrib/download_prerequisites
這個神奇的腳本文件會幫我們下載、配置、安裝那三個依賴的庫。可以節約我們大量的時間和精力。
4
你以為這三個庫自動下載了、自動make install了就沒事了嗎?錯!
很多人在編譯gcc的時候出現各種奇奇怪怪的錯誤就是這步沒有做好。
它們還不在.so文件的搜索路徑裡面,需要加進去,最後切記切記一定要執行一下ldconfig。
大致做法為:
1,找到你的共享庫文件被install到哪個目錄了(updatedb+locate命令)。
2,如果你的庫不是直接放在/lib或/usr/lib下,需要修改/etc/ld.so.conf文件,加入你的共享庫的路徑
3,如果在2中添加了共享庫路徑,切記要執行一下ldconfig,更新響應cache文件讓系統能找到你的共享庫。
5
建立臨時目錄,這個目錄用以存放編譯時的大量臨時文件,是文檔要求中必須的。
我是在gcc-4.8.0下建立了一個名為gcc-build-4.8.0的目錄,進入它。
mkdir gcc-build-4.8.0
cd gcc-build-4.8.0
配置gcc編譯選項
6
強烈建議閱讀INSTALL目錄下的說明文檔,尤其是configure.html,以確定你的編譯選項。
比較基本的選項有--enable-languages,說明你要讓你的gcc支持那些語言,--disable-multilib不生成編譯為其他平台可執行代碼的交叉編譯器。--disable-checking生成的編譯器在編譯過程中不做額外檢查,也可以使用--enable-checking=xxx來增加一些檢查。
網上還說了什麼--with-gmp、--with-mpfr、--with-mpc這三個選項,但是如果你3,4步做好了,就不要配了,反之你還是老實點吧別抱僥幸心理了。
調用gcc-4.8.0目錄下的configure文件:
例如:
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
7
執行
../make #不解釋
執行編譯命令(#在8核的虛擬機上進行編譯,每個核分配2個編譯任務)
make -j16
make install編譯過程CPU 核基本100%佔用,整個編譯用時11分50秒。
檢查gcc版本
#你就等吧少年,建議晚上睡覺前做
當然上面三步一定要在前一步順利結束的情況下進行,如果哪一步出錯了,結果都顯示error了,就不要再做後面的了。在shell的輸出里搜索"error"看具體的出錯點是什麼,、google一下為什麼。
如果你求穩的話,可以在make install之前先make check一下。
Ⅷ Linux中gcc的編譯過程包括哪幾步
看你文件有沒有相關:
沒有》》gcc 你的C文件 直接編譯出默認第一個a.c
有相關》》(假設有a.c,b.c,c.c)
gcc -c a.c
gcc -c b.c
gcc -c c.c
(這樣生成a.o b.o c.o)
gcc -o main a.o b.o c.o
(這樣就生成名為:main的執行檔了)
./main
就可以執行
Ⅸ 如何用GCC在linux下編譯C語言程序
在Linux下面,如果要編譯一個C語言源程序,我們要使用GNU的gcc編譯器,假設我們有下面一個非常簡單的源程序(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux
");
}
要編譯這個程序,我們只要在命令行下執行:
gcc -o hello hello.c
gcc 編譯器就會為我們生成一個hello的可執行文件.執行./hello就可以看到程
序的輸出結果了
Ⅹ gcc可以編譯c++嗎
GCC編譯器編譯C++程序是使用g++命令編譯的,如果強行使用gcc命令編譯的話,部分程序也能編譯通過,但是使用到了C++獨有的語言特性的程序的話,恐怕使用gcc命令編譯會報錯了,建議還是使用g++命令編譯C++程序。
GCC編譯器有gcc/g++,分別用於編譯C程序和C++程序的。
我們常說的gcc,是指GCC編譯器,而不是特質gcc命令哦!