前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CH579 TMOS调度学习

CH579 TMOS调度学习

作者头像
ManInRoad
发布2021-11-04 10:07:14
1.5K0
发布2021-11-04 10:07:14
举报
文章被收录于专栏:物联网思考

以CH579的广播例程学习TMOS,广播例程在SDK中的位置如下:CH579EVT\EVT\EXAM\BLE\Broadcaster。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 以CH579的广播例程学习TMOS,广播例程在SDK中的位置如下:CH579EVT\EVT\EXAM\BLE\Broadcaster。
    • 1、TMOS简介
      • 2、API说明
        • 3、代码分析
        • 4、现象
    相关产品与服务
    腾讯云代码分析
    腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档