以CH579的广播例程学习TMOS,广播例程在SDK中的位置如下:CH579EVT\EVT\EXAM\BLE\Broadcaster。
1、TMOS简介
TMOS 系统时钟单位为 625us,以 RTC 为基准得到所有需要系 统的时间;
TMOS基于时间片调度,不支持抢占式。
2、API说明
注册一个 TMOS 回调函数,并分配 ID
extern tmosTaskID TMOS_ProcessEventRegister( pTaskEventHandlerFn eventCb );
系统时钟,默认使用RTC
extern bStatus_t TMOS_TimerInit( pfnGetSysClock fnGetClock );
执行系统处理
extern void TMOS_SystemProcess( void );
启动一个事件,time时间后执行,tmosEvents是一个16位的变量,每个位标识不同的事件,最高位保留,用于系统事件
extern bStatus_t tmos_start_task( tmosTaskID taskID, tmosEvents event, tmosTimer time );
启动一个事件,并立即执行
extern bStatus_t tmos_set_event( tmosTaskID taskID, tmosEvents event );
停止一个事件
extern bStatus_t tmos_stop_task( tmosTaskID taskID, tmosEvents event );
清除一个已经超时的事件,不能用于事件本身
extern bStatus_t tmos_clear_event( tmosTaskID taskID, tmosEvents event );
发送消息,系统本身的SYS_EVENT_MSG事件
extern bStatus_t tmos_msg_send( tmosTaskID taskID, u8 *msg_ptr );
删除消息
extern bStatus_t tmos_msg_deallocate( u8 *msg_ptr );
接收消息
extern u8 *tmos_msg_receive( tmosTaskID taskID );
分配内存,用于接收消息缓冲区
extern u8 *tmos_msg_allocate( u16 len );
3、代码分析
3.1、硬件初始化
void HAL_Init( )
{
halTaskID = TMOS_ProcessEventRegister( HAL_ProcessEvent );
//注册一个任务,halTaskID 为任务ID,一个任务下最多可以有16个事件,其中系统保留了一个事件,所以用户只能使用15个事件
HAL_TimeInit( );//时钟配置,TMOS使用RTC
__enable_irq();
#if (defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE)
tmos_start_task( halTaskID , HAL_REG_INIT_EVENT ,MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD) );
// 启动校准事件,最后一个参数为时间,从启动开始,到MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD)后执行校准,时间为120s
#endif
tmos_start_task( halTaskID , HAL_TEST_EVENT ,MS1_TO_SYSTEM_TIME(60000) );
//启动测试事件,时间为60s
}
3.2、硬件任务回调
tmosEvents HAL_ProcessEvent( tmosTaskID task_id, tmosEvents events )
{
uint8 * msgPtr;
if( events & SYS_EVENT_MSG ){ // 系统保留事件,用于HAL消息,SYS_EVENT_MSG定义为0x8000,即最高位用于系统事件
msgPtr = tmos_msg_receive(task_id);
if( msgPtr ){
/* De-allocate */
tmos_msg_deallocate( msgPtr );
}
return events ^ SYS_EVENT_MSG;
}
if ( events & LED_BLINK_EVENT ){
#if (defined HAL_LED) && (HAL_LED == TRUE)
HalLedUpdate( );
#endif // HAL_LED
return events ^ LED_BLINK_EVENT;
}
if( events & HAL_KEY_EVENT ){
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
HAL_KeyPoll(); /* Check for keys */
tmos_start_task( halTaskID, HAL_KEY_EVENT, MS1_TO_SYSTEM_TIME(100) );
return events ^ HAL_KEY_EVENT;
#endif
}
if( events & HAL_REG_INIT_EVENT ){
#if (defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE) // 3.3中启动的校准事件
BLE_RegInit(); // У׼RF
#if( CLK_OSC32K )
Lib_Calibration_LSI(); // У׼ÄÚ²¿RC
#endif
tmos_start_task( halTaskID , HAL_REG_INIT_EVENT ,MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD) ); //再次启动校准事件
PRINT("cal rf\r\n");
return events ^ HAL_REG_INIT_EVENT;
#endif
}
if( events & HAL_TEST_EVENT ){
PRINT("event test\r\n");
tmos_start_task( halTaskID , HAL_TEST_EVENT ,MS1_TO_SYSTEM_TIME(60000) );
return events ^ HAL_TEST_EVENT;
}
return 0;
}
4、现象
可以看出:RF校准事件,2分钟执行一次,测试事件,1分钟执行一次;与我们设定的一样。