注意:
如果在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);