RTX

注意:

如果在KEIL中添加了集成的RTX5系統文件,第一個錯誤是:

C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Include1\cmsis_os.h(150): error:  #5: cannot open source input file "cmsis_os2.h": No such file or directory

那麼就是你沒有勾選另外的下發的一個地方


初始化:

osKernelInitialize();

osKernelStart();

int32_t osKernelRunning(void);       檢驗運行否


任務:

osThreadId  ID_ThreadRF =  0;

osThreadDef (Task_CC1101, osPriorityHigh, 1, 0) ; // osThreadDef(name, thread, priority, instances, stacksz) 定義線程類

ID_ThreadRF= osThreadCreate (osThread(Task_CC1101), NULL);

ID_ThreadRF= osThreadGetId (void);                                     //返回當前線程

osStatus osThreadTerminate (ID_ThreadRF);                         //終結線程

osStatus osThreadSetPriority (ID_ThreadRF, osPriorityHigh);       //設置線程優先級

osPriority osThreadGetPriority (ID_ThreadRF);                       //獲取線程優先級

優先級 :

typedef enum  {
  osPriorityIdle                   = -3,          ///< priority: idle (lowest)
  osPriorityLow                  = -2,          ///< priority: low
  osPriorityBelowNormal   = -1,          ///< priority: below normal
  osPriorityNormal             =  0,          ///< priority: normal (default)
  osPriorityAboveNormal   = +1,          ///< priority: above normal
  osPriorityHigh                 = +2,          ///< priority: high
  osPriorityRealtime          = +3,          ///< priority: realtime (highest)
  osPriorityError                =  0x84,       ///< system cannot determine priority or thread has illegal priority
  os_priority_reserved       =  0x7FFFFFFF  ///< prevent from enum down-size compiler optimization.
} osPriority;

互斥量:

osMutexDef(name)                                      定義os_mutex_def結構體

osMutex(name)                                            獲取os_mutex_def結構體的指針

osMutexId osMutexCreate (const osMutexDef_t *mutex_def);                     

osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec);           

osStatus osMutexRelease (osMutexId mutex_id);                         

osStatus osMutexDelete (osMutexId mutex_id);      

  信號量:

osSemaphoreDef(name)                                        定義os_semaphore_def結構體

osSemaphore(name)                                              獲取os_semaphore_def結構體的指針

osSemaphoreId    osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count);     

int32_t    osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec);            

osStatus osSemaphoreRelease (osSemaphoreId semaphore_id);                    

osStatus osSemaphoreDelete (osSemaphoreId semaphore_id);                

信號:

int32_t     osSignalSet (osThreadId thread_id, int32_t signals);                  

                osSignalSet(MotorControl,0x02);    // 發送通知到任務MotorControl, 信號爲0x02 

        RTX 的 osSignalSet是對FreeRTOS中的xTaskNotifyFromISR和xTaskNotify的條件封裝,處於中斷回調函數中時調用xTaskNotifyFromISR,否則使用xTaskNotify,在使用中無需再進行選擇;

osEvent   osSignalWait (int32_t signals, uint32_t millisec);                   

osEvent eve;                                          //在任務中實現

eve=osSignalWait(0,osWaitForever);    //   #define osWaitForever     0xFFFFFFFFU    ///< wait forever timeout value

if(eve.value.signals & 0x01).....

if(eve.value.signals & 0x02).....

        在實際使用中,osSignalWait(0x20,600);就是等待確定信號0x20的到來,不是任意位觸發(關係或),除了0x20外,諸如0x30之類的包含確定位也不能釋放該信號等待。這與UCOS的位設定模式有一些差異,使用起來有點不痛快。osSignalWait(0,600); 爲等待任意位信號到來,綜合起來就是無法組合信號值。

int32_t     osSignalClear (osThreadId thread_id, int32_t signals);     清除信號。

消息隊列:

osMessageQId  MsgBox;               //消息隊列的ID 
osMessageQDef(MsgBox, 1, int); //創建一個長度爲1,單位int 的消息隊列

 MsgBox = osMessageCreate(osMessageQ(MsgBox), NULL);   一定要給聲明的變量osMessageQId  MsgBox賦值

消息傳送:osMessagePut(MsgBox, 1, osWaitForever);

 osEvent  evt;

消息取出:evt = osMessageGet(MsgBox, osWaitForever);

if (evt.status == osEventMessage)
{
      ptr = evt.value.p;  //  value = evt.value.v;

      ........
}

網上有例程代碼取數據:

    osEvent  evt = osMessageGet(RF_MsgQ, osWaitForever);
    if (evt.status == osOK){.....}     使用osOK是無法取到的!

osEvent類型定義:

typedef struct  {
  osStatus                   status;         ///< status code: event or error information
  union  {
    uint32_t                    v;              ///< message as 32-bit value
    void                         *p;              ///< message or mail as void pointer
    int32_t                     signals;      ///< signal flags
  } value;                                        ///< event value
  union  {
    osMailQId               mail_id;              ///< mail id obtained by \ref osMailCreate
    osMessageQId       message_id;      ///< message id obtained by \ref osMessageCreate
  } def;                           
} osEvent;

在使用中,osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec);傳遞的變量 info 爲 uint32_t類型,如果需要傳遞更復雜的參數,需要用此來傳遞指針變量,涉及到申請內存空間:

osPoolDef(mpool, 2, RadioMail);                

osPoolId    mpool;

RadioMail *RF_Mail;

RF_Mail = osPoolAlloc(mpool);  .......  所以在傳遞大量或者自定義數據類型時,還是用mailQ實在。

郵箱隊列:

osMailQDef(name, queue_sz, type)

osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id);

void *osMailAlloc (osMailQId queue_id, uint32_t millisec);      //分配一個消息的空間
void *osMailCAlloc (osMailQId queue_id, uint32_t millisec);   //分配一個消息的空間並且清零
osStatus osMailPut (osMailQId queue_id, void *mail);            //將成員丟到郵箱中
osEvent osMailGet (osMailQId queue_id, uint32_t millisec);  //從郵箱中獲取消息
osStatus osMailFree (osMailQId queue_id, void *mail);         //釋放消息空間










發佈了75 篇原創文章 · 獲贊 18 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章