CH579/CH57x 的TMOS系統使用

CH57x 的藍牙中,爲了方便其協議棧自身的管理,以及用戶的使用,使用一個很是輕量級的操做系統"TMOS",dom

TMOS 實際上就是OSAL的簡化版本,函數

[一些經常使用的API]ui

//tmosTaskID taskID //以不一樣的taskid 來區分不一樣的任務,越小優先級越高 //tmosEvents event //每一個task 下擁有的event,16bit,每bit表明一個event,對於同一個task,一共16個event,其中0x8000爲系統使用,剩下15個爲用戶使用 //註冊task id,通常用於註冊任務時候,首先執行的
tmosTaskID TMOS_ProcessEventRegister( pTaskEventHandlerFn eventCb ); //設置一個event,,根據taskid 和event 來決定具體的事件
bStatus_t tmos_set_event( tmosTaskID taskID, tmosEvents event ); //清理一個已經超時的event,不能在本身的event 函數內執行
tmos_clear_event( tmosTaskID taskID, tmosEvents event ); //開始一個定時事件,只執行一次, //tmosTimer具體是 1600 = 1s
bStatus_t tmos_start_task( tmosTaskID taskID, tmosEvents event, tmosTimer time ); //開始一個定時事件,不斷的執行,除非運行tmos_stop_task關掉, //tmosTimer具體是 1600 = 1s
bStatus_t tmos_start_reload_task( tmosTaskID taskID, tmosEvents event, tmosTimer time ); //中止一個定時事件
bStatus_t tmos_stop_task( tmosTaskID taskID, tmosEvents event ); //獲取對應taskid 和event 的最後一個週期時常,返回0是沒有找到.
tmosTimer tmos_get_task_timer( tmosTaskID taskID, tmosEvents event ); bStatus_t tmos_msg_send( tmosTaskID taskID, uint8_t *msg_ptr ); uint8_t *tmos_msg_receive( tmosTaskID taskID ); uint8_t *tmos_msg_allocate( uint16_t len ); bStatus_t tmos_msg_deallocate( uint8_t *msg_ptr ); uint8_t tmos_snv_read( uint8_t id, uint8_t len, void *pBuf); //tmos的系統處理函數,須要不斷在主函數中運行
void TMOS_SystemProcess( void ); //返回tmos系統運行的clock,1600=1s
uint32_t TMOS_GetSystemClock( void ); uint32_t tmos_rand( void  );   // pseudo-random number 
bool        tmos_memcmp( const void *src1, const void *src2, uint32_t len ); // TRUE - same, FALSE - different
bool        tmos_isbufset( uint8_t *buf, uint8_t val, uint32_t len ); // TRUE if all "val",FALSE otherwise
uint32_t    tmos_strlen( char *pString ); uint32_t tmos_memset( void * pDst, uint8_t Value, uint32_t len ); void        tmos_memcpy( void *dst, const void *src, uint32_t len ); // Generic memory copy.

 [示例代碼]spa

"tmos_demo_task.h"操作系統

#include "CH57x_common.h" #include "CH57xBLE_LIB.H" #include "stdint.h"

#define DEMO_TASK_TMOS_EVT_TEST_1   (0x01<<0)
#define DEMO_TASK_TMOS_EVT_TEST_2   (0x01<<1)
#define DEMO_TASK_TMOS_EVT_TEST_3   (0x01<<2)
#define DEMO_TASK_TMOS_EVT_TEST_4   (0x01<<3)
#define DEMO_TASK_TMOS_EVT_TEST_5   (0x01<<4)

void demo_task_init(void);

 

 "tmos_demo_task.c"
code

#include "tmos_demo_task.h"
//存儲 當前task id 的全局變量
tmosTaskID  demo_task_id = INVALID_TASK_ID; //系統消息處理的函數
static void demo_task_process_TMOSMsg( tmos_event_hdr_t *pMsg ){ switch ( pMsg->event ) { default: PRINT("pMsg->event %04x\r\n",pMsg->event); break; } } //task的event處理回調函數,須要在註冊task時候,傳進去
static tmosTaskID demo_task_process_event( uint8_t task_id, uint16_t events ){ if ( events & SYS_EVENT_MSG ) { uint8_t *pMsg; if ( (pMsg = tmos_msg_receive( demo_task_id )) != NULL ) { demo_task_process_TMOSMsg( (tmos_event_hdr_t *)pMsg ); // Release the TMOS message
 tmos_msg_deallocate( pMsg ); } // return unprocessed events
        return (events ^ SYS_EVENT_MSG); } //event 處理
    if(events & DEMO_TASK_TMOS_EVT_TEST_1){ PRINT("DEMO_TASK_TMOS_EVT_TEST_1 evt test \r\n"); return (events ^ DEMO_TASK_TMOS_EVT_TEST_1); } //event 處理
    if(events & DEMO_TASK_TMOS_EVT_TEST_2){ tmos_start_task(demo_task_id,DEMO_TASK_TMOS_EVT_TEST_3,1600); PRINT("DEMO_TASK_TMOS_EVT_TEST_2 evt test \r\n"); return (events ^ DEMO_TASK_TMOS_EVT_TEST_2); } //event 處理
    if(events & DEMO_TASK_TMOS_EVT_TEST_3){ tmos_start_task(demo_task_id,DEMO_TASK_TMOS_EVT_TEST_3,1600); PRINT("DEMO_TASK_TMOS_EVT_TEST_3 evt test \r\n"); return (events ^ DEMO_TASK_TMOS_EVT_TEST_3); } // Discard unknown events
    return 0; } //初始化task, //包括註冊函數,能夠註冊後去開啓event
void demo_task_init( void ){ //註冊task id,同事把該task的event處理函數傳進去
    demo_task_id  = TMOS_ProcessEventRegister( demo_task_process_event ); //當即開始一個event
 tmos_set_event(demo_task_id,DEMO_TASK_TMOS_EVT_TEST_1); //開始一個定時event,1s後產生,當前語句只會產生一次event //能夠在event產生後去開啓event,能夠是別的task的,也能夠是當前task的event
    tmos_start_task(demo_task_id,DEMO_TASK_TMOS_EVT_TEST_2,1600); }

 [注意事項]blog

  1. 禁止在中斷服務函數裏面去處理tmos的任何event之類的的開始中止,之類的, 因爲tmos的event操做,實際上就是狀態機的操做,會產生全局變量修改,
  2. tmos的event 裏面是阻塞執行的,直到return 後纔會釋放,因此一般不建議在event 裏面處理太多東西
相關文章
相關標籤/搜索