CH579 TMOS调度学习

以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分钟执行一次;与我们设定的一样。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freemote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值