KEIL_RTX資源介紹


調度方法:時間片輪轉。

參考文檔:Keil參考手冊和rtl.h(任務的每個.c文件都應包含此頭文件)頭文件這兩個文檔

 

1)事件管理:讓一個進程等待一個事件,這個事件可以由其它進程和中斷觸發(只能在中斷中使用)。事件不用預先創建(但應先set后wait),wflags與event_flags都是u16類型,每一位代表一個事件,所以每個任務可有16個事件(1~16)。設定單一事件event_flags1<<(n-1),因此可以進行位的與或運算。

              os_evt_set(wflags,tmo)
              isr_evt_set(U16 event_flags, OS_TID task_id)     /*觸發的2種方法:事務或中斷觸發*/
    os_evt_wait_and(wflags,tmo)  /*,tmo表示等待時間*/
    os_evt_wait_or(wflags,tmo)  /*事件等待的2種方法:邏輯與、或,調用之后會自動清除*/
    os_evt_get()  
    os_evt_clr(clr_flags,task_id)
   
 
(2)郵箱管理:建立一個郵箱,里面可以存放一定數目的消息(比如20條)。進程可以等待郵箱隊列,如果郵箱里有消息,則取出,進程繼續執行;如果郵箱為空,則繼續等待。

 

        os_mbx_declare(mailbox1, num), os_mbx_init(mailbox1, sizeof (mailbox1));                    
                     os_mbx_send(mailbox1, msg);, isr_mbx_send()  /*發送郵箱的2種方法:進程或中斷*/
        os_mbx_wait(mailbox1, &msg, 0xffff); /*不在同一個文件中需要進行聲明extern OS_MBX mailbox1;*/
發送消息進程必須從動態內存池中分配一個內存塊、將消息儲存在這個內存塊中,然后將它的指針傳遞給信箱。接收消息進程收到這個指針,取出內存塊中的消息,然后釋放這個內存塊。

固定消息長度發送

      RTX核有一個功能強大的固定內存塊內存分配函數。它們是線程安全可重入,且能被RTX核無限制的使用。建議使用固定內存塊分配函數發送固定大小的消息。需要為這個消息對象對內存池作適當地初始化。

U32 mpool[郵箱的條數*(2*sizeof(U32))/4 + 3]; /* Reserve a memory for 16 messages */

_init_box (mpool, sizeof(mpool), sizeof(struct message));

發送方:U32 *mptr;

      mptr = _alloc_box (mpool); /* Allocate a memory for the message */

      mptr[0] = 0x3215fedc; /* Set the message content. */

      mptr[1] = 0x00000015;         

      os_mbx_send (MsgBox, mptr, 0xffff); /* Send a message to a 'MsgBox' */

接收方:  os_mbx_wait (MsgBox, &rptr, 0xffff); /* Wait for the message to arrive. */

      rec_val[0] = rptr[0]; /* Store the content to 'rec_val' */

      rec_val[1] = rptr[1];

      _free_box (mpool, rptr); /* Release the memory block */

變長數據長度信息發送:必須使用可變大小內存塊的內存分配函數。 RVCT 庫在Stdlib.h文件中提供了這個函數(不可重入)

malloc()free()函數執行期間必須禁止系統定時器中斷。tsk_lock()函數可禁止定時器中斷,而tsk_unlock()函數使能定時器中斷。

(3)互斥管理:進程獨占的資源,加個鎖,別的進程需要等待。
        os_mut_init ()
                            os_mut_wait()  //上鎖
                            os_mut_release()  //解鎖   
 
(4)信號量管理(計數器型):發送信號量時信號量+1;需求信號量-1(信號量與事件類似,進程等待的信號量大於0時,進程繼續執行)。
  os_sem_init,
  os_sem_send,
  os_sem_wait, isr_sem_send  /*發送信號量的2種方法:進程或中斷*/
   
 

(5)延時: os_dly_wait(),延時的單位:系統節拍。

任務的創建:__tast關鍵字來修飾函數,一個任務被創建多次即可以有多個實例。

os_tsk_create (xxx_task, 0);

os_tsk_delete_self ();

id1 = os_tsk_self();   /* Obtain own system task identification number */

2個系統任務  os_clock_demon

      os_idle_demon() /*空閑任務的鈎子函數*/

#define OS_PRIVCNT     0  /*RTX內核采用 OS_PRIVCNT 使存儲空間的利用最優化*/
#define OS_STKCHECK    1  /*堆棧檢查:速度慢但可以指出堆棧有問題的任務ID*/
 

堆棧大小(用U32):#define OS_STKSIZE 100 /*所以為400字節*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM