CC2540协议栈下开发流程

来源:互联网 发布:软件的健壮性 编辑:程序博客网 时间:2024/06/05 16:28

TICC2540协议栈结构如下图:

 1.PHY层

    1Mbps自适应跳频GFSK(高斯频移键控),运行在免证的2.4GHz。

2. LL层

    LL层为RF控制器,控制设备处于准备(standby)、广播、监听/扫描(scan)、初始化、连接,这五种状态中一种。五种状态切换描述为:未连接时,设备广播信息,另外一个设备一直监听或按需扫描,两个设备连接初始化,设备连接上了。发起聊天的设备为主设备,接受聊天的设备为从设备,同一次聊天只能有一个意见领袖,即主设备和从设备不能切换。

3.HCI层

    HCI层为接口层,向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口,可以通过串口、SPI、USB来实现设备控制。

4.L2CAP层

    L2CAP层提供数据封装服务,允许逻辑上的点对点通讯。

5.SM层

    SM层提供配对和密匙分发,实现安全连接和数据交换。

6.ATT层

    ATT层负责数据检索,允许设备向另外一个设备展示一块特定的数据称之为属性,在ATT环境中,展示属性的设备称之为服务器,与它配对的设备称之为客户端。链路层的主机从机和这里的服务器、客服端是两种概念,主设备既可以是服务器,也可以是客户端。从设备毅然。

7 .GATT层

    GATT层定义了使用 ATT 的服务框架和配置文件(profiles)的结构。BLE 中所有的数据通信都需要经过 GATT。GATT负责处理向上与应用打交道,其关键工作是把为检索工作提供合适的profile结构,而profile由检索关键词(characteristics)组成。

8.GAP层

    GAP直接与应用程序或配置文件(profiles)通信的接口,处理设备发现和连接相关服务。另外还处理安全特性的初始化。对上级,提供应用程序接口,对下级,管理各级职能部门,尤其是指示LL层控制室五种状态切换,指导保卫处做好机要工作。




最简单的程序运行时候步骤:

在SimpleBLEPeripheral_Main.c中

int main(void)
{
  /* Initialize hardware */
  HAL_BOARD_INIT();


  // Initialize board I/O
  InitBoard( OB_COLD );


  /* Initialze the HAL driver */
  HalDriverInit();


  /* Initialize NV system */
  osal_snv_init();


  /* Initialize LL */


  /* Initialize the operating system */
  osal_init_system();


  /* Enable interrupts */
  HAL_ENABLE_INTERRUPTS();


  // Final board initialization
  InitBoard( OB_READY );


  #if defined ( POWER_SAVING )
    osal_pwrmgr_device( PWRMGR_BATTERY );
  #endif


  /* Start OSAL */
  osal_start_system(); // No Return from here


  return 0;
}

程序进入  osal_start_system()中会死循环等待事件发生。

在OSAL.c中会有这个函数:

void osal_run_system( void )
{
  uint8 idx = 0;


#ifndef HAL_BOARD_CC2538
  osalTimeUpdate();
#endif
  
  Hal_ProcessPoll();


  do {
    if (tasksEvents[idx])  // Task is highest priority that is ready.
    {
      break;
    }
  } while (++idx < tasksCnt);


  if (idx < tasksCnt)
  {
    uint16 events;
    halIntState_t intState;


    HAL_ENTER_CRITICAL_SECTION(intState);
    events = tasksEvents[idx];
    tasksEvents[idx] = 0;  // Clear the Events for this task.
    HAL_EXIT_CRITICAL_SECTION(intState);


    activeTaskID = idx;
    events = (tasksArr[idx])( idx, events );
    activeTaskID = TASK_NO_TASK;


    HAL_ENTER_CRITICAL_SECTION(intState);
    tasksEvents[idx] |= events;  // Add back unprocessed events to the current task.
    HAL_EXIT_CRITICAL_SECTION(intState);
  }
#if defined( POWER_SAVING )
  else  // Complete pass through all task events with no activity?
  {
    osal_pwrmgr_powerconserve();  // Put the processor/system into sleep
  }
#endif


  /* Yield in case cooperative scheduling is being used. */
#if defined (configUSE_PREEMPTION) && (configUSE_PREEMPTION == 0)
  {
    osal_task_yield();
  }
#endif
}

在OSAL_Tasks.h有这个数组,我们定义了SimpleBLEPeripheral_ProcessEvent 这个事件。重点说明优先级从上到下逐渐降低。

const pTaskEventHandlerFn tasksArr[] =
{
  LL_ProcessEvent,                                                  // task 0
  Hal_ProcessEvent,                                                 // task 1
  HCI_ProcessEvent,                                                 // task 2
#if defined ( OSAL_CBTIMER_NUM_TASKS )
  OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ),           // task 3
#endif
  L2CAP_ProcessEvent,                                               // task 4
  GAP_ProcessEvent,                                                 // task 5
  GATT_ProcessEvent,                                                // task 6
  SM_ProcessEvent,                                                  // task 7
  GAPRole_ProcessEvent,                                             // task 8
  GAPBondMgr_ProcessEvent,                                          // task 9
  GATTServApp_ProcessEvent,                                         // task 10
  SimpleBLEPeripheral_ProcessEvent                                  // task 11
};

这个函数调用初始化函数为每个任务:

void osalInitTasks( void )
{
  uint8 taskID = 0;


  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));


  /* LL Task */
  LL_Init( taskID++ );


  /* Hal Task */
  Hal_Init( taskID++ );


  /* HCI Task */
  HCI_Init( taskID++ );


#if defined ( OSAL_CBTIMER_NUM_TASKS )
  /* Callback Timer Tasks */
  osal_CbTimerInit( taskID );
  taskID += OSAL_CBTIMER_NUM_TASKS;
#endif


  /* L2CAP Task */
  L2CAP_Init( taskID++ );


  /* GAP Task */
  GAP_Init( taskID++ );


  /* GATT Task */
  GATT_Init( taskID++ );


  /* SM Task */
  SM_Init( taskID++ );


  /* Profiles */
  GAPRole_Init( taskID++ );
  GAPBondMgr_Init( taskID++ );


  GATTServApp_Init( taskID++ );


  /* Application */
  SimpleBLEPeripheral_Init( taskID );
}


0 0
原创粉丝点击