CH579 TMOS调度学习

2021-11-04 10:07:14 浏览数 (1)

以CH579的广播例程学习TMOS,广播例程在SDK中的位置如下:CH579EVTEVTEXAMBLEBroadcaster。

1、TMOS简介

TMOS 系统时钟单位为 625us,以 RTC 为基准得到所有需要系 统的时间; TMOS基于时间片调度,不支持抢占式。

2、API说明

注册一个 TMOS 回调函数,并分配 ID

代码语言:javascript复制
extern tmosTaskID TMOS_ProcessEventRegister( pTaskEventHandlerFn eventCb );

系统时钟,默认使用RTC

代码语言:javascript复制
extern bStatus_t TMOS_TimerInit( pfnGetSysClock fnGetClock );

执行系统处理

代码语言:javascript复制
extern void TMOS_SystemProcess( void );

启动一个事件,time时间后执行,tmosEvents是一个16位的变量,每个位标识不同的事件,最高位保留,用于系统事件

代码语言:javascript复制
extern bStatus_t tmos_start_task( tmosTaskID taskID, tmosEvents event, tmosTimer time  );

启动一个事件,并立即执行

代码语言:javascript复制
extern bStatus_t tmos_set_event( tmosTaskID taskID, tmosEvents event );

停止一个事件

代码语言:javascript复制
extern bStatus_t tmos_stop_task( tmosTaskID taskID, tmosEvents event );

清除一个已经超时的事件,不能用于事件本身

代码语言:javascript复制
extern bStatus_t tmos_clear_event( tmosTaskID taskID, tmosEvents event );

发送消息,系统本身的SYS_EVENT_MSG事件

代码语言:javascript复制
extern bStatus_t tmos_msg_send( tmosTaskID taskID, u8 *msg_ptr );

删除消息

代码语言:javascript复制
extern bStatus_t tmos_msg_deallocate( u8 *msg_ptr );

接收消息

代码语言:javascript复制
extern u8   *tmos_msg_receive( tmosTaskID taskID );

分配内存,用于接收消息缓冲区

代码语言:javascript复制
extern u8   *tmos_msg_allocate( u16 len );
3、代码分析
3.1、硬件初始化
代码语言:javascript复制
 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、硬件任务回调
代码语言:javascript复制
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 rfrn");
		return events ^ HAL_REG_INIT_EVENT;
#endif
  }
  if( events & HAL_TEST_EVENT ){
    PRINT("event testrn");
    tmos_start_task( halTaskID , HAL_TEST_EVENT ,MS1_TO_SYSTEM_TIME(60000) ); 
		return events ^ HAL_TEST_EVENT;
  }
  return 0;
}
4、现象

可以看出:RF校准事件,2分钟执行一次,测试事件,1分钟执行一次;与我们设定的一样。

0 人点赞