Time of Update: 2018-12-03
[a1, a2, ...] = evalin(ws, expression); 在工作空間ws中執行expression{tagshow(event)}">命令或運算式,並將執行的{tagshow(event)}">結果儲存到變數a1、a2、...中。 函數的{tagshow(event)}">調用方法如下所示: v = evalin('base', 'var'); %把基本工作空間中的變數var的值賦給局部變數v。 v = evalin('base', 'who');
Time of Update: 2018-12-03
郵箱是作業系統中,一個進程給另一個進程發送訊息的方式。在裸奔的單片機中,在兩個函數中交換資訊的時候,我們通常選擇最簡便的方式-全域變數,這種編程模式無疑是降低了安全性和可靠性。再且,郵箱還能起到掛起線程的作用。本實驗中建立一個郵箱,兩個線程,線程2以一定周期發送郵箱,線程1以一定周期從郵箱中取出郵件。當線程2中發送20封郵件之後,發送一封特殊的郵件通知其他線程,自己已經運行結束。線程1取出郵件後,檢查郵件是否是特殊郵件,如果是,則線程1也退出。程式:#include
Time of Update: 2018-12-03
訊息佇列(來自百度百科)訊息佇列就是一個訊息的鏈表。可以把訊息看作一個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫入權限的進程可以向訊息佇列中按照一定的規則添加新訊息;對訊息佇列有讀許可權的進程則可以從訊息佇列中讀走訊息。訊息佇列是隨核心持續的。描述程式啟動並執行過程。首先建立了三個線程,三個線程處於同一優先順序,但由於thread1首先被啟動,所以它先運行,thread2,3緊隨其後。thread3中調用了delay 5s,所以一開始便被掛起了。thread1由於要等訊息佇列的訊息,
Time of Update: 2018-12-03
RTT 支援相同優先順序,而ucosii 不支援。如果一個線程不調用rt-thread_delay() 來讓出調度器,那麼它就會一直運行,其它線程永遠處於就緒態。而相同優先順序的線程,在初始化或建立時還定義了其單次啟動並執行最長的時間片,強迫其讓出調度器。這裡,使用rt_thread_yield(); 也可讓出調度器。#include <rtthread.h>rt_thread_t tid1 = RT_NULL;rt_thread_t tid2 = RT_NULL;static
Time of Update: 2018-12-03
安裝scons=====這個就不詳細說了,嫌麻煩可以直接sudo apt-get install scons。不嫌麻煩去下載源碼安裝。簡單編譯=====來看一個最簡單的hello, world程式intmain(){ printf("Hello,
Time of Update: 2018-12-03
靜態線程的棧是在編譯時間確定的,故不能由核心動態建立或刪除。靜態線程只能通過detach 來使其脫離核心的調度而做不到 delete。所以靜態線程中會像這樣定義棧static rt_uint8_t thread1_stack[512];這一點是和ucosii 類似的,但ucosii
Time of Update: 2018-12-03
事件也是一種線上程間同步的方式。RTT中,事件是一個32bit(4個位元組)的變數,其中每一個位可以表示代表一種事件。接收事件的線程既可以在多個事件同時發生後(即多個bit位同時置1)觸發,正如本例中線程1中第一條語句所示範的那樣。也可以多個事件任意一個發生後(即多個bit位任意一個置位)就可以觸發。主程式中建立三個線程,線程1接收事件標誌。線程2和線程3則向發送事件標誌。可以說,事件更為靈活。這裡,一共建立了三個線程,一個事件。一開始 thread1 等待事件 bit3 和 bit5
Time of Update: 2018-12-03
MODBUS協議分為兩層,一層是資料連結層,一層是應用程式層。在官網上,分別有兩篇文檔描述了MODBUS的資料連結層和應用程式層。當然,資料連結層有多種實現方式,官網給的是基於串列的方式。兩篇文檔分別為 MODBUS over Serial Line Specification and Implementation Guide 和 MODBUS Application Protocol Specification。兩篇specifiaction
Time of Update: 2018-12-03
rt_malloc和rt_free 和 malloc free 類似,是用來在堆上分配記憶體的,RT-Thread中是用小記憶體法來實現的。下面程式就是不停分配記憶體和釋放記憶體,並列印分配到的記憶體首地址。程式:#include <rtthread.h>struct rt_thread thread1;static rt_uint8_t thread1_stack[512];static void thread1_entry(void *parameter){ int
Time of Update: 2018-12-03
因為我們校園網是通過網頁認證的方式才能連上外網,對於我這種只有命令列沒有GUI的人著實難為了一把。一開想通過python寫指令碼自動填寫form,然後post上去,後來發現linux有 curl 命令,而且樹莓派已經預設安裝(我的ubuntu10.04就沒有)。這下只需一行命令就可以上網了。首先,通過Firefox瀏覽器的開發人員模式,先登陸一遍校園網認證,看看錶單都提交了哪些內容,或者直接看原始碼。我這裡是三項DDDDDupass0MKKey例: curl -d
Time of Update: 2018-12-03
動態和靜態意思和前面完全一樣,這裡不再重複。這裡建立兩個動態定時器,一個是周期的另一個是單次的。其中timeout() 函數都是回呼函數,即定時時間到之後,作業系統會自動調用的函數。 程式:#include <rtthread.h>static rt_timer_t timer1;static rt_timer_t timer2;static rt_uint8_t count;static void timeout1(void* parameter){ rt_kprintf("
Time of Update: 2018-12-03
realloc 用於重新分配記憶體的情境。如果原先通過 malloc分配的空間過小,則可通過realloc重新分配大小。當然具體實現的時候分兩種情況,如果原記憶體塊後有足夠的空間,則之間將原記憶體塊擴大,如果不夠,則重新尋找一個地方,將原資料也拷貝至此。代碼:#include <rtthread.h>struct rt_thread thread1;static rt_uint8_t thread1_stack[512];void thread1_entry(void*
Time of Update: 2018-12-03
RO段、RW段和ZI段 --Image$$??$$Limit
Time of Update: 2018-12-03
優先順序反轉是不希望出現的現象。簡單來說,有三個線程A, B, C, 優先順序A>B>C,A和C有共用資源S。A.B掛起,C運行且有S,A沒有S所以一直掛起,B進入調度,調度完之後C再運行直到釋放S之後,A才能運行。可以看出,A雖然優先順序最高,但實際運行卻是最後一個運行,其實際的優先順序反轉了。下面這段來自官網:三個線程的優先順序順序是 thread2 > worker >
Time of Update: 2018-12-03
1、安裝相關軟體包apt-get install tftpd (服務端)apt-get install tftp (用戶端) apt-get install xinetd 2、建立設定檔cd /etc/xinetd.d/vi tftp輸入service tftp{ socket_type = dgram protocol = udp wait
Time of Update: 2018-12-03
記憶體池是一種靜態記憶體管理方法。它預先將一塊固定連續的記憶體地區劃分成幾個大小不同的塊。使用者申請時就將對應大小的記憶體塊給他。這種方法的優點是不會有記憶體片段,但不夠靈活,適用於需要頻繁存取的場合,例如buffer。這個例子有兩個線程。thread1不停分配記憶體塊,但其中並沒有使用delay() 來使自己掛起,所以thread2 由於優先順序低於 thread1 而一直得不到運行。thread1 分配完所有記憶體塊以後,又試著再取得一個記憶體塊,由於記憶體塊已經被分配完,所以thread1
Time of Update: 2018-12-03
手上有塊ZLG的SMARTARM2200(LPC2220)的板子,其中的例子都是基於ADS的,想都移植到IAR上去,同時好好研究下IAR,ARM,uCOSII。我用的IAR版本是IAR EWARM5.3.從Micrium網站上下了uCOSII
Time of Update: 2018-12-03
建立兩個動態線程,thread2 運行4s後刪除thread1。這裡兩個都為動態線程,所謂動態線程即在堆中動態建立,刪除之後也從RAM中消失。區別於靜態線程。由於是動態,所以需開啟#define RT_USING_HEAP以下是application.c 的代碼#include <rtthread.h>rt_thread_t tid1 = RT_NULL;rt_thread_t tid2 = RT_NULL;static void thread1_entry(void*
Time of Update: 2018-12-03
一般的無線linux應該都有驅動了。我使用的是 TP-LINK的 TL-WN821N 型號。插上就能識別。即通過 ifconfig命令可以看到mac地址。然後就是修改 /etc/network/interfaces 來填入 無線網路名和密碼,省的每次手動填寫。有一個不好的是我現在只有vi編輯器,而且校園網需要網頁認證,只能蛋疼的用著vi,vi和vim還是有點區別的。修改檔案內容如下:auto loiface lo inet loopbackiface eth0 inet dhcpauto
Time of Update: 2018-12-03
定時器可以通過rt_timer_control(),來改變定時器的某些特性,比如定時時間。這裡,一開始定時周期是100,並且在程式中使用 rt_tick_get()-tick來確認定時周期是否如預設那樣。當8次之後,使用rt_timer_control(),將定時周期改為3000。實際效果通過列印的tick資訊和直觀感受都可以驗證。程式:#include <rtthread.h>static rt_timer_t timer1;//static rt_timer_t