Sensor系列之SensorDaemon与DSPS端通信过程

本文导读:

SensorDaemon服务端流程解析
Qualcomm messaging Interface(QMI)消息定义概述
Sensor架构系列之dsps架构分析

之前的文章我们知道了SensorDaemon服务端的启动以及dsps的架构及主要组成模块,今天我们继续深入挖掘下SensorDaemon与dsps具体的通信构建过程。

首先回顾下,SensorDaemon的启动过程。

1.init.qcom.sh中配置调用start_sensors启动,配置settings文件;
2.call start sensors则我们的daemon进程main方法开始执行
3.初始化sensors,sns_init_once;
4.创建服务端socket,注册sns_main_notify_cb回调
5.启动线程监听服务端数据,一旦数据达到,遍历客户端 handle,将数据发到client端

那么SensorDaemon又是怎样与DSPS端通信的呢?我们跟进sns_init_once来一探究竟。

static void sns_init_once( void )
{
  int              i;
  struct sigaction action;
  sigset_t         set;

  static const struct init_ptrs
  {
    sns_init_fcn fcn;
    const char * fcn_name;
  } init_ptrs[] = SNS_INIT_FUNCTIONS;

  static const struct opt_init_ptrs
  {
    sns_init_fcn fcn;
    const char * fcn_name;
  } opt_init_ptrs[] = SNS_INIT_OPT_FUNCTIONS;

  /* Mask of SIGALRM for use by EM */
  sigemptyset( &set );
  sigaddset( &set, SIGALRM );
  sigprocmask( SIG_SETMASK, &set, NULL );

  /* Set up the fault handler */
  action.sa_handler = sns_init_fault_hndlr;
  sigemptyset(&action.sa_mask);
  action.sa_flags = 0;
  for( i = 1; i < NSIG ; i++ )
  {
    sigaction( i, &action, &old_action[i] );
  }

  (void)sem_init( &sns_init_sem, 0, 0 );

  /* Call each module's init function */
  for( i = 0; NULL != init_ptrs[i].fcn; i++ ) {
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "initializing %s",
                             (intptr_t)init_ptrs[i].fcn_name);

    sns_init_sns_err = init_ptrs[i].fcn();
    if( SNS_SUCCESS != sns_init_sns_err ) {
      SNS_PRINTF_STRING_ERROR_2(SNS_DBG_MOD_APPS_INIT,
                                "Error %d initializing %s",
                                sns_init_sns_err,
                                (intptr_t)init_ptrs[i].fcn_name);

      return;
    }
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "Waiting for %s...",
                             (intptr_t)init_ptrs[i].fcn_name);
    sem_wait( &sns_init_sem );
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "Done waiting for %s",
                             (intptr_t)init_ptrs[i].fcn_name);
  }

  /* Call each module's optional init function */
  for( i = 0; NULL != opt_init_ptrs[i].fcn; i++ ) {
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "initializing %s",
                             (intptr_t)opt_init_ptrs[i].fcn_name);

    sns_init_sns_err = opt_init_ptrs[i].fcn();
    if( SNS_SUCCESS != sns_init_sns_err ) {
      SNS_PRINTF_STRING_ERROR_2(SNS_DBG_MOD_APPS_INIT,
                                "Error %d initializing %s",
                                sns_init_sns_err,
                                (intptr_t)opt_init_ptrs[i].fcn_name);
      sns_init_sns_err = SNS_SUCCESS;
      continue;
    }
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "Waiting for %s...",
                             (intptr_t)opt_init_ptrs[i].fcn_name);
    sem_wait( &sns_init_sem );
    SNS_PRINTF_STRING_HIGH_1(SNS_DBG_MOD_APPS_INIT,
                             "Done waiting for %s",
                             (intptr_t)opt_init_ptrs[i].fcn_name);
  }

  (void)sem_destroy( &sns_init_sem );
  SNS_PRINTF_STRING_HIGH_0(SNS_DBG_MOD_APPS_INIT,
                           "All modules initializied" );
}

之前也提到过,这个方法的主体部分就是通过定义的init_ptrs以及opt_init_ptrs指向的多个init func依次调用。

我们从log来看看这些fuction的初始化顺序。

[ 01-03 04:39:11.125 713: 713 I/] main, sensordaemon started.
[ 01-03 04:39:11.125 713: 713 I/] sensor1_init, huilin, sns_acm.c
01-03 04:39:11.125 E/Sensors: sns_debug_set_dbg_str_mask: Setting log level to 0
01-03 04:39:11.132 I/Sensors: sns_init_la.c(216):Waiting for sns_debug_test_init1...
01-03 04:39:11.132 I/Sensors: sns_init_la.c(220):Done waiting for sns_debug_test_init1
01-03 04:39:11.132 I/Sensors: sns_init_la.c(203):initializing sns_pwr_init
01-03 04:39:11.134 I/Sensors: sns_pwr.c(332):releasing wakelock
01-03 04:39:11.134 I/Sensors: sn
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TMS320C6000系列DSPs是德州仪器(Texas Instruments)公司推出的一系列数字信号处理器(Digital Signal Processor,DSP)。该系列DSPs采用了精确的浮点运算和高速平行处理的架构,具有高性能和低功耗的优势,被广泛应用于通信、音频、视频、工业自动化等领域。 TMS320C6000系列DSPs的核心原理是采用了可并行处理的超标量架构。它使用了多个独立的数据通路和指令流水线,能够同时执行多条指令。每个数据通路都包含了多个运算单元和存储器接口,能够高效地处理多个任务。此外,TMS320C6000系列DSPs还支持向量浮点运算,能够以高效的方式处理大规模数据。 TMS320C6000系列DSPs的应用非常广泛。在通信领域,它可以用于实现高速的多媒体数据传输、高清音视频编解码、调制解调等功能。在音频领域,它可以用于音频信号处理、音频编码、音频合成等应用。在视频领域,它可以用于视频信号处理、图像编码、图像处理等功能。在工业自动化领域,它可以用于控制系统、自动化控制、机器视觉等应用。 总之,TMS320C6000系列DSPs具有高性能和低功耗的特点,可以在多个领域中实现复杂的数字信号处理任务。它的并行处理能力和高效的浮点运算能力使其成为众多应用领域中的首选DSP解决方案。 ### 回答2: TMS320C6000系列是德州仪器(TI)公司推出的一款数字信号处理器(DSP)芯片系列。该系列芯片基于高性能的固定小数点和浮点DSP架构,具有高运算速度和较低功耗的特点。 TMS320C6000系列的核心原理是通过高频率时钟和并行运算单元,对数字信号进行高速运算和处理。这些芯片内部集成了大量的算术逻辑单元(ALU),乘法累加器(MAC)和协调单元,以提供高效的信号处理性能。同时,它们还具备灵活的数据通路和存储器结构,可实现多种信号算法和算法优化。 TMS320C6000系列的应用非常广泛。在通信领域,它们被用于无线通信基站和网络设备中的信号处理任务,可以实现高清晰度语音编解码、图像处理和频率分析等功能。此外,在音频和视频设备中,它们也能够提供高质量的音频解码、音频增强和视频编解码等能力。 TMS320C6000系列还广泛应用于工业自动化、医疗影像、雷达信号处理等领域。在工业自动化中,它们可以用于控制系统、机器人和机械运动控制等任务;在医疗影像中,可以用于实时图像处理和医学影像诊断;在雷达信号处理中,可以实现目标检测、跟踪和定位。 总之,TMS320C6000系列DSP芯片凭借其高性能、低功耗和灵活的处理能力,在数字信号处理领域具有广泛的应用前景。无论是通信、音视频领域,还是工业控制和医疗领域,这一系列芯片都能够满足各种复杂的算法与处理需求,促进了数字信号处理技术的发展。 ### 回答3: TMS320C6000系列DSP是德州仪器(Texas Instruments)推出的一款高性能数字信号处理器。该系列DSP采用了先进的架构和设计,适用于各种实时应用,包括音频和视频处理、通信系统、工业控制、医疗仪器等。 TMS320C6000系列DSP的原理是基于DSP的并行计算和专用指令集架构。它包含多个处理单元,每个处理单元有多个算术逻辑单元(ALU),可以同时执行多个计算操作,实现高效的并行处理。该系列DSP还通过采用延迟补偿架构,最小化数据延迟,提高系统响应速度。 TMS320C6000系列DSP具有较高的性能和灵活性,可以通过集成的外围设备和外部存储器接口与其他器件进行通信和数据交换。它支持多种接口标准,包括UART、SPI、I2C和USB,可以与各种外部设备和传感器进行连接。此外,该系列DSP还具有丰富的内存资源,包括片上存储器(RAM)和片外存储器(Flash、SDRAM等),可以满足不同应用的存储需求。 TMS320C6000系列DSP的应用广泛,其中一个主要应用领域是音频和视频处理。通过其高性能和并行处理能力,可以实现高清音视频的编码、解码和处理,同时还能提供卓越的音质和视觉效果。此外,该系列DSP还用于通信系统,可以实现高速数据传输和信号处理,提供稳定可靠的通信服务。在工业控制领域,该系列DSP可以用于实时监控和控制,如机器人控制、自动化设备和电力系统控制等。此外,该系列DSP还广泛应用于医疗仪器、雷达系统和航空航天等领域,为各种实时应用提供强大的处理能力。 总之,TMS320C6000系列DSP以其高性能、并行计算和灵活性在各种实时应用领域得到广泛应用,为工程师们提供了一种可靠的数字信号处理解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值