1. RT-Thread RTOS的關於RT-Thread的背景和成長
記錄下RT-Thread0.3.x的成長
先解釋幾個常見問題:
1. RT-Thread從哪裡而來?
RT-Thread RTOS,Kernel部分完成於2006年上半年,創始人源於國內一老牌RTOS:DOOLOO RTOS,甚至是BSP 一些結構都源於DOOLOO RTOS。但與DOOLOO RTOS明顯不同的是,Kernel完全重新編寫,突出的是實時性和小而靈活,並且引入了內核 的對象模型以摒棄內核對象的與動態內存管理器無關化。
2. RT-Thread用於商業產品&工程,版權如何界定?
RT-Thread RTOS內核部分完全由我們編寫,無其他版權問題,可以放心在商業產品 & 工程中使用。對於把RT-Thread使用於商業產品中,我們承諾永久不收費(使用人擁有使用權,使用用途責任請自行承擔)。另外有兩點需要注意:
- RT-Thread RTOS代碼原始版權屬於RT-Thread所有。
- 在商業產品 & 工程中使用RT-Thread RTOS,請在產品說明書上明確說明使用了RT-Thread,如有串口輸出,請在系統啟動顯示RT-Thread的版本信息。如使用了RT-Thread RTGUI,請保留RT-Thread LOGO。
3. RT-Thread RTOS由誰開發,由誰維護?
目前RT-Thread RTOS由國內RT-Thread工作室開發及維護
4. RT-Thread RTOS是否已經在產品中使用?穩定度 & BUG情況如何?
目前已經有數家公司使用RT-Thread RTOS做為他們的系統平台,在上面進行產品開發,穩定性表現不錯。
就如同沒有100%的完美事物一樣,BUG是存在的,反饋上來我們會努力盡快修正。
5. 我能加入到RT-Thread的開發者隊伍中嗎?
能!
我們歡迎任何對RTOS感興趣的人,不管你是學生或資深嵌入式系統開發工程師。RT-Thread的開發人員通常依賴於論壇、郵件、GTalk進行聯系交流,由於目前上海的開發人員比較多一些,所以會不定期的在上海舉行開發者聚會。
6. RT-Thread依靠什麼持續發展下去,能夠盈利嗎?
目前RT-Thread的發展主要依賴於大家的興趣愛好,大多數都是在業余時間進行開發的。以後會通過技術支持、組件定製、組件開發、輔助工具等 方式進行盈利。從幾大開源軟體來看,商業支持是軟體持續發展不可或缺的一部分,所以我們希望能夠有更多的公司選擇RT-Thread RTOS做為系統平 台,這個對於公司、對於整個RT-Thread社區都是雙贏的局面。對於公司,能夠獲得免費的RTOS套件,同時也能夠推動著這個RTOS套件不斷的朝著 穩定的方向發展。對於我們,有公司支持的發展無疑會令RT-Thread的發展更上一層樓,當然也意味著以後的支持費用有著落啦。
=========
問題完了,開始進入0.3.x系列的主題。在對外發布上,相信大家已經看到了,RT-Thread已經進入了0.3.x的密集發布周期。RT- Thread/STM32F103VB已經發布了0.3.0系列的3個beta版本,RT-Thread/STM32F103ZE已經發布了0.3.0系 列的2個beta版本,RT-Thread/LPC2148已經發布了一個0.3.0系列的beta版本。接下來會考慮發布RT-Thread/LM3S 的第一個beta版本(汗一個,剛發過了的板子有些硬體問題,返修了)...
這些版本,大多數上會包含:Kernel + FinSH shell + Filesystem + LwIP等。
0.3.0系列,RT-Thread還包括兩大內容:
- 編程指南文檔
- RTGUI圖形界面系統
編程指南一直在修訂,比較遺憾文筆有限,所以文檔還請大家不要太挑剔,有什麼建議歡迎大家提出來。關於編程指南,還要提一句的是,這份文檔是一份 編程的指南,在RT-Thread上編程需要考慮的地方都會提出來。但是,它並不是一份代碼分析的文檔,雖然它可能會提到內部的一些大致結構框架,但它不 會對代碼進行一行行分析,所以請大家多多注意。
另外的RTGUI組件,會是以後的重點任務,目前的打算是在現有的STM32F103ZE開發板上實現一套可用的手持終端設備,當然也依然延續 RT-Thread的習慣,這套東西會以開源的形式釋放出來。在s3c2410/2440上,這套GUI表現得是相當不錯的,面向對象的設計,獨立的控制項 對象模型,留給了用戶最大的可擴展性。
其他的,caoxulong的x86分支在整理完畢後也會放到0.3.0這個分支上來,通過這個分支大家可以完全摒棄開發板,在PC或 VMWare/QEMU上體驗RT-Thread。LPC系列分支,苦於目前開發板不足,所以進展慢一些,上次發布的RT-Thread /LPC2148 0.3.0 beta1也只能包含SD卡、乙太網口驅動框架,這個系列會把 wyoujtg/風城少主 的LPC2106的移植合並進 來。
文件系統這塊現在代碼已經發布出來了,其實裡面還包括另外一個分支的:DFS-FAT,這個分支就如同DFS一樣,是我們自己編寫的,也能夠支持NandFlash等介質上的壞塊管理,寫了很多個測試例子在測,等通過壓力測試後會取代目前的DFS-EFSL發布出來。
2. RT-Thread RTOS的RT-Thread / uCOS / FreeRTOS 簡單比較
1 、任務管理及調度:
RT-Thread - 32/256可選優先順序搶占式調度,線程數不限,相同優先順序線程時間片輪轉調度;支持動態創建/銷毀線程。
uCOS - 256優先順序搶占式調度,不允許相同優先順序任務存在
2、 同步/通信機制:
RT-Thread - 支持semaphore, mutex, mailbox, message queue, event。mailbox可存儲多條消息,任務等待可按優先順序進行排隊。
uCOS -semaphore,mutex, mailbox, message queue, event。mailbox只能存放1條消息
3、內存管理:
RT-Thread -固定分區內存管理,小內存系統動態內存管理,大內存系統SLAB內存管理
uCOS - 固定大小內存塊管理
4、定時器:
RT-Thread - 掛接到系統OS定時器的硬定時器
uCOS - 只能使用OSTimeDly進行時間間隔處理
5、中斷嵌套:
RT-Thread - 允許
uCOS - 允許
6、源碼許可證:
RT-Thread - 遵循GPLv2+許可證。可用於商業產品(只需要註明使用了RT-Thread)
uCOS - 商業收費
3. 介紹幾種主流嵌入式操作系統的特點,並分析比較 哥們,我現在糾結這個問題,可以給點指點嗎
如果你是學習階段的話,那linux和UCOS-II是比較合適的
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是不錯的選擇。
還有就是如果從開發的工具方便好用,易用的角度來看,那些收費的系統用起來更爽一些
4. 有關rt-thread的編程語言,請大神指教~
我覺得有兩種可能:
1. 存放結構體內容的空間的首位元組地址
2. 結構體的各成員均有各自的地址,這些地址是放在一塊連續的內存中,結構體的指針存放的是這塊連續的內存的首位元組地址。
其實吧,對於這個結構體指針裡面的具體內容不是那麼重要,只要了解這種指針怎麼用就行了,希望採納
5. RT-Thread RTOS的RT-Thread 開發者自述
1、誕生
一切東西還得從頭談起。RT-Thread RTOS,Kernel部分完成於2006年上半年,其IPC部分甚至是年中時才具備相應的雛形。最開始時是因為要為朋友做一個小型的手持設備,而我本人起初又是另一國內老牌RTOS:DOOLOO RTOS開發人員,但這個團隊在2005年底已經解散。但朋友的系統要上,用ucos嗎,一不熟悉,二看不上。答應朋友的事,總得有解決方法吧,即使是原來的DOOLOO RTOS,因為其仿VxWorks結構,導致它的核心太大,包括太多不必要的東西(一套完整的libc庫),這些方案都否決了。怎麼辦?當時朋友那邊也不算太急,先自己寫一套內核吧。這個就是源頭!(後來雖然朋友的項目夭折了,但這套OS則保留下來了,並開源了,萬幸)當然RT-Thread和原來的DOOLOO RTOS差別還是很大的。DOOLOO RTOS是一種類VxWorks風格的,而RT-Thread則是一種類NucluesPlus風格的,小型、實時、可剪裁。這三個方面RT-Thread可以驕傲的說做得比DOOLOO RTOS都要好很多,小型:RT-Thread核心能夠小到4K ROM,1K RAM;實時:線程調度核心是完全bitmap方式,計算時間是完全固定的;可剪裁性,配置文件rtconfig.h包含多種選項,對Kernel細節進行精細調整,對各種組件(文件系統,使用EFSL、ELM FatFs;網路協議棧,finsh shell)進行可選配置。2、艱難的發展期在第一個公開板發布後(0.1),RT-Thread意識到了一個問題,光有核心不行。別人如何使用:雖然採用了doxygen風格的注釋,並自動產生相應的API文檔,但能夠使用的人寥寥,有這個功底的人不見得認可你的系統,沒相應功底的人也玩不轉你的系統。所以下一個系列,考慮如何讓系統能夠支持更多的平台。首選ARM,為什麼?應為ARM正處於發展的前期,使用的人也廣泛,而RT-Thread第一個支持的平台就是s3c4510,這個是lumit開源項目贈送的平台。在其後,支持了包括s3c44b0,AT91SAM7S64,AT91SAM7X256,s3c2410,AT91SAM9200,coldfire,x86等一系列平台,編譯器統一使用GCC,這個時期無疑是最艱難的時期(真的艱難嗎?呵呵,但肯定是迷茫的),這個就是0.2.0、0.2.1、0.2.3、0.2.4版本等,不同的版本支持不同的平台。猜猜我這段時間是干什麼工作的?不知道大家對這個領域是否熟悉,手機2G,3G協議棧開發。每天都和協議棧打交道,而且最痛苦的是上千頁的25.331 RRC協議,都是英文的,所以RT-Thread算做是工作之外的苦中作樂吧。而也正是這個時候,shaolin同學出現了,幫助完成了RT-Thread/x86的移植,他當時還是學生。這其中還有一件郁悶的事,當時RT-Thread團隊還有幾個人,只不過主要是shaolin和我。當0.2.3發布時,我建議開始微內核的道路,嗯,可能很多人還比較困惑,RT-Thread後面跟著的為什麼是「啟動下一代RTOS演化」,當時就是因它而感慨:把微內核引入進來,把內核態和用戶態分開來,並且建立一個類似於L4的微內核。當然最重要的是,其中有一個強實時核心。而且L4實際上是把頁表操作放到內核之外的,如果內核是一個強實時內核將對整個系統的實時性提升很大,而因為微內核的緣故,也能夠運行linux的應用程序,並且當時RT-Thread也提出了一種,線程即IPC的概念。。。只是,最後的提案被大家否決了。團隊開始有數人,只是能夠堅持的沒幾個。3、一年增加0.0.1本人很早就接觸了Linux,算是國內資深的Linux接觸者(早期也算一個Linux開發人員吧),KDE 1.0幾乎是看著發展起來的(大家有誰用過RedHat 5.1?)。個人算是很多方面有一些自由軟體的習慣:軟體的版本號是非常重要的一個標志,寧願增加一個細微的版本號也不輕易的增加一個大的版本號,因為大的版本號是需要對用戶負責的。1.0版本更代表了系統的穩定性,健全性。例如mplayer到1.0版本就經歷眾多小版本,0.99的beta版本亦無數。RT-Thread也把這點體現得淋漓盡致,0.2.2到0.2.3一個版本的增加,整整花了一年多的時間。但這個小版本號的增加,卻帶來了開源社區嵌入式環境中最完善的TCP/IP協議棧:LwIP。當然,開始時並不算穩定。在這幾個版本中,RT-Thread也終於從迷茫中走出來,RT-Thread需要自己的特色,一個單獨的RTOS Kernel沒太大的用處,因為你並沒有上層應用代碼的積累,並且一些基礎組件也非常重要,有這些基礎組件基本上意味著,在這個平台上寫代碼,這些代碼就是你的,甚至是你哪天也可以把它放到另外一個硬體平台上運行。同樣,0.2到0.3版本號的變更,花費的時間會更長^-^ 版本號的長短,是和計劃的feature實現是密切相關的,沒到設定的目標如何可能進行發布呢?4、Cortex-M3的變革RT-Thread的變革因為Cortex-M3而來,因為ST的STM32使用的人太廣了,當然還有非常重要的一點。RT-Thread已經開始支持Keil MDK,armcc了。GNU GCC確實好,並且也由衷的推崇它,使用它,只是調試確實麻煩,阻礙了更多人使用它(ARM平台上)。當RT-Thread + Cortex-M3 + Keil MDK碰撞在一起的時候,火花因它而生,越來越多人使用RT-Thread了,當然這和RT-Thread厚積薄發是離不開的,因為這個時候,RT-Thread已經有一個穩定的內核,shell方式的調試利器finsh,DFS虛擬設備文件系統,以及LwIP協議棧。而RT-Thread/GUI則在密集的移植到CM3上,RT-Thread/GUI成型於2008年底,但為了Cortex-M3分支,這個組件停下來很多,但這種停留是值得的。另外就是特別感謝UET贈送的STM32開發板了,RT-Thread/STM32的分支都是在UET贈送的STM32開發板上驗證的。5、RT-Thread為什麼是對象化的設計方法可能這個話題太偏技術化了,說說其他,呵呵。面向對象編程有它的好處,例如繼承。可以讓具備相同父類的子類共享使用父類的方法,基本可以說是不用寫代碼就憑空多出了很多函數,何樂而不為呢。另外,對象的好處在於封裝。當一個對象封裝好了以後,並測試完成後,基本上就代表這個類是健全的,從這個類派生的子類不需要過多考慮父類的不穩定性。這里著重提提另外一個人,我工作後的第三年,曾向當時的同事也是好友,L.Huray學習面向對象的實時設計方法:Octpus II。深刻體會到了面向對象設計的好處(需求分析,體系結構設計,子系統分析,子系統設計,測試,實時性分析),但鑒於嵌入式系統中C++的不確定性,所以個人更偏向於使用C來實現。所以,L.Huray算是我的老師了,一直希望能夠有時間把他老人家的思想更進一步的發揚光大,希望以後有這個機會。(Octpus I最初起源於Nokia,然後由M.Award, L.Huray發展成Octpus II,現在幾乎見不到蹤影了,唉)。
(作者原文:實時線程操作系統(RT-Thread)4年開發歷程 樂與苦)
6. 嵌入式RT-thread中初始化線程函數中(void *)entry的意義何在,為什麼要使用(void*)
因為這里是一個變數賦值,entry是一個裸指針,定義應該就是 void *
而函數傳入的參數是void (*entry)(),這是一個函數指針,因此在賦值的時候需要強行轉化一下。
7. 怎樣學習RT-Thread,感覺看起來一知半解,有什麼推薦的學習方法
學習方法 為了取得較好的學習效果,您需要不時地問自己:「這是什麼?」「為什麼會這樣?」「它是怎樣來的?」「它還會有什麼變化?」「引申發展後會成什麼樣子?」「還有什麼和它緊密聯系,互為因果或共同作用?」「它在專業知識體系中的地位」……最為重要的是,您要問自己,「它對我有什麼用,我該如何用它,可能會有什麼結果?」 學就是為了用。如果連它是什麼都不知道,怎麼會用呢,怎麼可能用得更好?就比如用電腦,編程高手學什麼軟體都要比一般人要快。興趣是最好的老師,這是因為興趣能驅動人去以不同的方式積極應用。人能夠從應用中發現自己的不足,並及時地把缺陷補上。為了用而學,往往能夠提高學習的積極性。 同時,學不僅僅是為了用。用往往是操作技術,是問題解決的具體方法。如果僅僅只會用,停留在具體的應用上,他可能是模仿來的,不可能有創造。他的適應能力也很差。我喜歡用系統學習法的理論基礎來解釋這一現象。世界是變化的。不單是自然環境起著變化,社會環境也在快速地轉變。動態的問題需要以動態的方法加以解決。如果一個人不能夠將自己的所學體系化,提純出來,以新的、獨特的、滿足自身和環境資源需要的、更有效的方式去組織這些知識,他所學到的,永遠都只是過去,他的操作技術,也只是針對過去,而不是將來。他很可能被歷史淘汰。即使能夠因為社會因素能夠在價值鏈中生存,他的位置也只會越來越低,對於整個社會而言價值越來越小。 我一直強調學習方法的提煉和升級。一方面,某些科學的學習方法是可以通過學習和強化訓練得來。知識是多方面、多層次、多結構的。學習方法總結出來也是一種可以傳授的知識。另一方面,學習方法必須經過實踐感受和思考,與人的個性相結合,做好度的把握。那些看了交通規則,聽了駕駛課的人還是跑不好山路的。那更多的是一種感覺和發揮。學習和做其他事情沒什麼太大的區別,都重在體驗。僅僅是沉迷於課本是學不好的。 人必須明確自己想學的是什麼,明確自己想要的是什麼。人的努力,其實都是為了達到這些目標創造條件。知識的積累不過是創造條件的一種有效方法。通過不斷地提高效率,提高行為的有效性,合理定位,降低失敗的風險等等途徑來充實和完善自身。 我還強調的是自信。信心能夠讓人堅持。我一直都讓咨詢者別迷信智商等理論。人可以通過不斷超越自我獲得成功,獲得自我實現的巔峰體驗。我以自身的經歷證明了先天的聰明在一個人的成長過程中並不重要。後天因素決定成功。 我常對咨詢者說,沒有自覺,沒有信心,那麼什麼學習方法都沒有用。 只有自覺,才能夠用心。特別是在強化學習的過程中,那種高強度的活躍腦細胞的運動,離開了自覺,只可能什麼效果都沒有。 信心才能夠堅持,才可以突破自己在長久的迷失中形成的心理障礙,比如學習恐懼,缺乏耐心等等。 我們需要以不斷的小的成功來積累信心。 如何減輕學習的惰性 在不少人身上,我們都可以明顯地看到學習的惰性。 最常見的是: 1、學得不好的人。他們對學習有著抵觸情緒甚至逃避。 2、工作以後的人。他們往往缺乏學習的韌性。 3、年齡大的人。記憶力,以及對新事物的接受能力下降,學習的難度大大增加。精力不足。看看書就累了,想睡覺。 成人教育中,學習惰性是最值得一提的。 學習惰性產生的原因很多。主要是: 1、畏難情緒。這僅僅是心理作用。還沒有開始學,就因為聽說它難,而開始產生消極情緒。 2、缺乏信心。這在學習挫折以後很明顯。 3、枯燥。學習是多種多樣的,學習過程也是豐富多彩的,但是這不意味著某些東西學習的枯燥,特別是一般的學校教育。 4、過於抽象。與實際生活的聯系太少。 5、語言障礙。特別是留學人士。畢竟不是母語,在學習起來難度很大。 6、基礎知識障礙。基礎知識准備得不足,太多地方看不懂的時候,談學習動力是沒有必要的了。 7、分心。考慮其他的事情太多。可供的選擇太多,妨礙了有效的學習。 但是,我們不能不學習。特別是在一些並不是能夠直接見效的知識的學習中。 讓我們分析一下傳統的減輕學習惰性的處理方法。 1、毅力。以自製力作為減輕學習惰性的手段是不可取的。原因很簡單。勉強自己只會活得很累,很痛苦。是否能真地堅持下去,對於一般人來說是一個很重要的問題。人都是趨利避害的。這是天性。許多父母抱怨孩子缺乏自製力那其實是對孩子有著不切實際的要求。一些人對自己的毅力也產生懷疑。許多學習相當優秀的大學生在向我咨詢時也很多都提到自己的自製力不夠。長期的負情緒會摧毀任何人的毅力。 2、利弊分析。誰都知道學好了的好處。哪怕再差的學生也一樣有著學好的渴望。因為學習成績好的好處太多了。有社會認可,甚至能得到豐厚的物質獎勵。因此,以學好了的前景來教育孩子,或者教育自己是沒有用的。 3、加強監督。學習本來就是個人的事情。如果學習也必須讓別人來看管的話,那麼還不如不學,或者改變學習的方法、學習的內容和學習的模式。 推薦方案: 1、項目法。 設定項目。以項目的完成促進學習。以實際的運用來促進知識的學習。我在大學學習應用統計的時候就為自己設定了跟蹤、分析國際棉花價格的項目。等項目弄玩,統計以及相關課程也已經自學完。這樣的效率很高。 再以林凡順的德語學習為例子。林凡順在31歲以後才開始學德語。他的困難和壓力是相當大的。最大的問題是,他捧著一本詞彙書或語法書,看不上十分鍾就疲倦欲睡。即使他很深刻地體會系統學習法,也難以取得進展。因此,在工作忙的時候,往往沒時間就成為逃避學習的借口。但是他要留學德國,計劃中也要將業務拓展到德國,與德國企業建立雙贏的聯系。德語學不好是社會交往中最大的障礙。 他到了德國之後,開始設定項目。比較了一下,他從詞彙入手,決定編寫德語詞典(請參考Fundset Deutsch2Chinese(S) 詞典 自述文件)。編寫詞典不等於就能清楚記得那些詞彙,但是,經過了打字、整理、翻譯以後,印象比簡單地看看書要深刻得多。他的要求也不高,只是留下印象而已,以後在看到時能有多多少少的感覺。這就是系統學習法的模糊學習。由於他要發布的是免費的詞庫文件,他的工作得到了鼓勵與支持。詞庫文件一天一天的增大也讓他有了動力和信心。在詞庫達到他設定的第一階段目標(6000詞彙量)以後,他開始轉向語法的學習。這時的項目是編寫語法辭典。在為別人造福的同時,自己也得到很大的提高。 2、內容分解法。 將學習的內容化整為零,只需要學一點東西,那麼就會因為學得容易而消除了畏難情緒和消極對抗的心理障礙。對發展需求的適當梳理能夠增強信心。 3、合理情緒法。 不要對自己的自製力和毅力有太高的要求。人都是有惰性的。你的學習困難別人一樣會遇到。但你的選擇不是退縮,也不是逃避,而是正視它。嘗試著改變學習的方式和方法,找出一個最舒服、最讓自己開心的學習途徑來。 4、背水一戰法。 在優越的環境,有時反倒不容易學進去。不如到花園、或室外安靜的地方學習。靠無可靠,趴無可趴,躺無可躺。這樣學習效率也會高不少。 為什麼速成學習也是科學的 很多人都說,學習沒有捷徑,必須認認真真、扎扎實實地學。 這話對,也不完全對。學習需要的是積累,是溫故而知新。再好的學習方法,如果不去學、不去記,不加以認真思考,也都沒有用。 就以系統學習法為例,真正做好樹狀結構和網狀聯系,不經過長期的有目的的努力是不行的。 但這不等於排斥速成學習。系統學習法也可以速成,那就是建立知識體系的大致構架,提出一些基本的關系的聯系。以這些學習成果參加考試,要獲得60-80分並不是難事。 分析每一種速成法,都可以看到,他們是把學習的難度降低。只有不對人、不對自己過高要求,才可能有信心、有興趣堅持。堅持往往才會成功。 大目標分解成小目標是一個很好的做法。每天嘗到甜頭,每天都用適當的成效鼓勵自己,每天都滿意於努力和付出,這樣就能夠堅持。有計劃的堅持就是積累。 人應該有大的目標。大目標是對自我的挑戰,最能夠滿足人的發展需求,最讓人有自我實現的渴望。 人需要挑戰,迴避挑戰往往讓人感覺不到生活的趣味,也漸漸失去應有的動力和緊張。所以,我在學習的時候,總是朝最難的地方進軍。我認為,最難的地方都闖過了,其他的沒有理由闖不過去,剩下的只是時間、精力和積極的堅持和積累。 以快速將知識壓入潛意識。 哪怕遺忘,也無所謂。總有熟悉和不熟悉的感受。 有時候就不需要記憶,只需要感覺。 集中注意 快速組織所學內容 及時回憶和復習 優勝心態和逃避心態 近來,由於研究「家庭與兒童心理健康」大量接觸了很多初高中學生,在感覺到他們的聰明的同時也發現他們的意志、毅力、目標和動力的缺失。這是信息爆炸與社會浮躁共同作用的結果,問題發生在孩子身上,但問題的原因可以追溯到家庭、學校與社會環境。 心態浮躁,很難積累和堅持。目標不明確,很難品嘗到成功的喜悅。這些都可能導致放縱和迷失。 今天,在向一個親戚的孩子輔導「系統學習法」的時候,我心裡再次浮現這種強烈的感覺。以至於後來我覺得,對於這個孩子,現階段學習方法並不是很重要,更重要的是學習的主動性、自覺性和學習的方向性。這首先是優勝心態。 優勝心態是指認為自己能夠做得比別人好,現在能夠比過去好、將來能夠比現在好的心態。 首先是信心。要相信自己能夠超越自己,能夠面對並更好地解決現存的或即將到來的問題。 其次是主動性。在問題到來的時候,要能夠主動地去認識它、了解它,摸索其中的關系。 再則是採取行動。將問題解決化解為具體的目標。 什麼是高手 高手就是能夠迅速有效地解決問題的人。 高手就是能夠積極創新、突破的人。 也許有的人知識積累很多,但由於無法恰當表現,成不了高手。 這就是匠和大師的區別。 有的人學了很多武功,但是在比試中幾乎次次失手,甚至打不過才學武不久的人。 這就是悟性和應變能力在實戰更重要。 有的人也許是外行,但是他學習能力強,規劃能力強,有有效的手段化復雜為簡單,迅速切入、發展神速。 基礎很重要。但基礎是為了發展,純粹的基礎是沒有意義的。就如沒有盤活的存量資產遠遠沒有快速流通的小資金有效一樣。通過滾動發展,小企業可能會在幾年內成為大企業。 要認可結果的重要。成王敗寇。 就象比爾蓋茨,哪怕大學沒有畢業,在經營管理方面都勝過MBA人士,在市場競爭中屢屢獲勝。這就是高手。 高手就是在難題面前,讓別人不服都不行。 高手能夠創造新境界。 系統記憶法 系統記憶法是系統學習法的重要組成部分。 系統記憶法要求人們把需要記憶的內容的關系層次弄清,盡可能地以更大的整體模塊來記憶。最好還能夠結合以前已經知道的內容,組合成有機單元來記憶。 記憶分為「記」和「憶」兩個過程。 「記」是通過強化刺激,在大腦中留下痕跡。「記」是必要的階段。 「憶」是把大腦里形成的刺激聯結給取用出來。要改善記憶的效果,必須把更多的時間從「記」轉到「憶」來。那主要是通過回憶、思考、聯想、實際應用來熟悉並強化刺激聯結。 「記」的過程 系統記憶法在「記」的過程中強調分類存儲。相當於倉庫,只有分類清晰,結構有序,才可能迅速地從中找到東西。 有序地「記」,將為「憶」提供了極大的便利。 先在心裡構架一個體系樹模型。空的。僅僅是一個結構。在開始的時候,可以以教材的目錄、章節為節點,構架體系樹。 在記憶的過程中,要學會找出知識點(記憶內容),通過分析、歸納,將知識點的特性,特別是與其他知識點或者外界聯系發掘出來。 將知識點放在體系樹上。相當於樹的葉子、果實、花和嫩芽。可以根據知識點的特性,調整體系樹結構。 可以根據感覺和推理,留出體系樹的空缺部分。有些教材僅僅是一個方面的內容,適當的空缺就是和其他相關教材或學科的介面。 「憶」的過程 其實在結構體系樹的時候需要運用的思考,就已經開始包含「憶」的成分了。只有「憶」,才可能取用其他知識點,與此知識點發生聯系。結構樹需要不時地回想,以掃描缺少的枝葉,再及時地集中精力,將遺失的枝葉重新掛到體系樹上。 回想的過程就是「憶」的過程。要做到心中有「樹」,就是「憶」的基礎上的體系樹。 「記」和「憶」的統一 增加刺激聯結是記憶的訣竅。這也是系統學習法最有效的地方。 「記」和「憶」是兩個不同的過程,但是他們不是孤立的,而必須交錯行進。 根據「憶」的需要去補充「記」,將使「憶」更有效,也更完全。 體系樹對於「憶」來說是相當重要的。從一系列刺激聯結迅速找到想要的內容,這只有清晰的體系樹才能做到。 就象收拾房子,如果大致分類,什麼東西在什麼地方,這就會給使用製造方便。否則,就算這物品(刺激聯結)實際存在,也找不出來。不能使用,相當於沒有。 人有遺忘的本能。如果刺激聯結無序,很可能就作為無效信息,清理出大腦。記憶的效率將很低。 重溫往往就是再記和再憶。 很多人在考試時總考不出自己的實際水平,拿不到理想的分數,究其原因,就是心理素質不過硬,考試時過於緊張的緣故,還有就是把考試的分數看得太重,所以才會導致考試失利,你要學會換一種方式來考慮問題,你要學會調整自己的心態,人們常說,考試考得三分是水平,七分是心理,過於地追求往往就會失去,就是這個緣故;不要把分數看得太重,即把考試當成一般的作業,理清自己的思路,認真對付每一道題,你就一定會考出好成績的;你要學會超越自我,這句話的意思就是,心裡不要總想著分數、總想著名次;只要我這次考試的成績比我上一次考試的成績有所提高,哪怕是只高一分,那我也是超越了自我;這也就是說,不與別人比成績,就與自己比,這樣你的心態就會平和許多,就會感到沒有那麼大的壓力,學習與考試時就會感到輕松自如的;你試著按照這種方式來調整自己,你就會發現,在不經意中,你的成績就會提高許多; 這就是我的經驗之談,媽媽教給我的道理,使我順利地度過了中學階段,也使我的成績從高一班上的30多名到高三時就進入了年級的前10名,並且沒有感到絲毫的壓力,學得很輕松自如,你不妨也試一試,但願我的經驗能使你的壓力有所減輕、成績有所提高,那我也就感到欣慰了; 最祝你學習進步!
8. rt-thread建立兩個線程,一個線程開燈,一個線程滅燈,怎麼循環列印
rt-thread建立兩個線程,一個線程開燈,一個線程滅燈,怎麼循環列印。
1、wait方式是讓當前持有鎖的線程進入等待隊列(不是阻塞隊列),調用了wait方法後,當前線程就不會執行wait之後的代碼邏輯了,所以notify方法必須在wait方法之前。
2、需要在循環結束後,加上notify,因為當其中一個線程正常執行完後,另一個線程一定還處於等待隊列,所以最後需要被喚醒,如果不寫,則雖然能正常列印出結果,但是程序不會結束。
3、要保證兩個線程的開始順序,因為thread.start方法,並不是先調用就一定是先調用的線程先執行,所以可以用countdownlatch來保證列印順序的開始。