Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2151595
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: 嵌入式

2014-09-08 13:29:56

《蓝牙4.0实战演练》笔记
一. Peripheral流程
osal_init_system
    -->osalInitTasks
        --> SimpleBLEPeripheral_Init( taskID );
            {
              //1. 对gap与gatt进行配置
              注意: 这儿区分工程CC2541DK-MINI keyfob 与CC2541,
              只是工程的配置选项不一样(option-->c/c++ compile-->prepocess),代码是一样的,
              CC2541DK-MINI keyfob定义了CC2540_MINIDK,需要按键才能进入广播状态
              CC2541中没有定义CC2540_MINIDK,开机进入广播状态
              //2. profile
              SimpleProfile_AddService( GATT_ALL_SERVICES );   //添加profile
              VOID SimpleProfile_RegisterAppCBs( &simpleBLEPeripheral_SimpleProfileCBs );           
              //3. 设置事件SBP_START_DEVICE_EVT
              osal_set_event( simpleBLETaskId, SBP_START_DEVICE_EVT );
            }
osal_start_system
    --> 死循环调用osal_run_system  
    --> SimpleBLEPeripheral_ProcessEvent //处理所有的事件
SimpleBLEPeripheral_ProcessEvent   //进行按键处理
{
    SYS_EVENT_MSG    --> 这个不关心
    SBP_START_DEVICE_EVT  
      -->处理在初始化时osal_set_event设置的事件
      -->注册回调:peripheralStateNotificationCB profile状态改变回调
      -->osal_start_timerEx产生一个时间事件SBP_PERIODIC_EVT
    SBP_PERIODIC_EVT
      -->第一次进入是SBP_START_DEVICE_EVT的最后产生的时间事件
      -->同时自己osal_start_timerEx产生一个时间事件SBP_PERIODIC_EVT,这就是一个循环
      --> performPeriodicTask(); 可以认为是一个时间处理函数
      {
          获取CHAR3的值,并赋给CHAR4
      }
}
二.Peripheral代码流程
SimpleBLEPeripheral_Main的执行流程

1. APP--> SimpleBLEPeripheral_Main.c找到main函数
  1. int main(void)
  2. {
  3.   HAL_BOARD_INIT();
  4.   InitBoard( OB_COLD );
  5.   HalDriverInit();
  6.   osal_snv_init();
  7.   osal_init_system();        //1.1 初始化操作系统
  8.   HAL_ENABLE_INTERRUPTS();
  9.   InitBoard( OB_READY );     //1.2 初始化按键 
  10.   #if defined ( POWER_SAVING )
  11.     osal_pwrmgr_device( PWRMGR_BATTERY );
  12.   #endif
  13.   osal_start_system();      //1.3 
  14.   return 0;
  15. }

OSAL-->OSAL.c中
  1. uint8 osal_init_system( void )
  2. {
  3.   // Initialize the Memory Allocation System
  4.   osal_mem_init();
  5.   // Initialize the message queue
  6.   osal_qHead = NULL;
  7.   // Initialize the timers
  8.   osalTimerInit();
  9.   // Initialize the Power Management System
  10.   osal_pwrmgr_init();
  11.   // Initialize the system tasks.
  12.   osalInitTasks();  //初始化系统任务
  13.   // Setup efficient search for the first free block of heap.
  14.   osal_mem_kick();
  15.   return ( SUCCESS );
  16. }

APP--> OSAL_SimpleBLEPeripheral.c中又回到APP了
  1. void osalInitTasks( void )
  2. {
  3.   uint8 taskID = 0;

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

  6.   /* LL Task */
  7.   LL_Init( taskID++ );

  8.   /* Hal Task */
  9.   Hal_Init( taskID++ );

  10.   /* HCI Task */
  11.   HCI_Init( taskID++ );

  12. #if defined ( OSAL_CBTIMER_NUM_TASKS )
  13.   /* Callback Timer Tasks */
  14.   osal_CbTimerInit( taskID );
  15.   taskID += OSAL_CBTIMER_NUM_TASKS;
  16. #endif

  17.   /* L2CAP Task */
  18.   L2CAP_Init( taskID++ );

  19.   /* GAP Task */
  20.   GAP_Init( taskID++ );

  21.   /* GATT Task */
  22.   GATT_Init( taskID++ );

  23.   /* SM Task */
  24.   SM_Init( taskID++ );

  25.   /* Profiles */
  26.   GAPRole_Init( taskID++ );
  27.   GAPBondMgr_Init( taskID++ );

  28.   GATTServApp_Init( taskID++ );

  29.   /* Application */
  30.   SimpleBLEPeripheral_Init( taskID ); //用户的初始化函数
  31. }

1.3 OSAL-->OSAL.c中
  1. void osal_start_system( void )
  2. {
  3.   for(;;) //死循环
  4.   {
  5.     osal_run_system();
  6.   }
  7. }

1.3.1 OSAL-->OSAL.c中
  1. void osal_run_system( void )
  2. {
  3.   uint8 idx = 0;

  4. #ifndef HAL_BOARD_CC2538
  5.   osalTimeUpdate();
  6. #endif
  7.   
  8.   Hal_ProcessPoll();

  9.   do {
  10.     if (tasksEvents[idx]) //osalInitTasks中说id越小,等级越高
  11.     {
  12.       break;
  13.     }
  14.   } while (++idx < tasksCnt);

  15.   if (idx < tasksCnt)
  16.   {
  17.     uint16 events;
  18.     halIntState_t intState;
  19.     
  20.     //清除任务标志
  21.     HAL_ENTER_CRITICAL_SECTION(intState);
  22.     events = tasksEvents[idx];
  23.     tasksEvents[idx] = 0; // Clear the Events for this task.
  24.     HAL_EXIT_CRITICAL_SECTION(intState);
  25.     
  26.     //开始执行具体的任务
  27.     activeTaskID = idx;
  28.     events = (tasksArr[idx])( idx, events );    //任务处理 
  29.     activeTaskID = TASK_NO_TASK;

  30.     //刚执行的任务产生了新的任务,就要把任务标志置位,下一次论询时执行
  31.     HAL_ENTER_CRITICAL_SECTION(intState);
  32.     tasksEvents[idx] |= events; // Add back unprocessed events to the current task.
  33.     HAL_EXIT_CRITICAL_SECTION(intState);
  34.   }
  35. #if defined( POWER_SAVING )
  36.   else // Complete pass through all task events with no activity?
  37.   {
  38.     osal_pwrmgr_powerconserve(); // Put the processor/system into sleep
  39.   }
  40. #endif

  41.   /* Yield in case cooperative scheduling is being used. */
  42. #if defined (configUSE_PREEMPTION) && (configUSE_PREEMPTION == 0)
  43.   {
  44.     osal_task_yield();
  45.   }
  46. #endif
  47. }
两个结构体:
  taskEvents : 数组管理任务,每一项都代表一个任务,这一项不为0时代表有任务发生,为0代表没有任务, 
  taskArr      : 具体的任务,函数指针数组,与taskEvents有同样多的项,这样taskEvents中的每一项就可以代表一个任务


APP->simpleBLEPeripheral.c
  1. void SimpleBLEPeripheral_Init( uint8 task_id )
  2. {
  3.   simpleBLEPeripheral_TaskID = task_id;
  4.   VOID GAP_SetParamValue( TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL );
  5.   { //GAP设置
  6.     GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
  7.     GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );

  8.     GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
  9.     GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );

  10.     GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );
  11.     GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );
  12.     GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );
  13.     GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );
  14.     GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );
  15.   }
  16.   GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );
  17.   { //ADV设置
  18.     uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;
  19.     GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );
  20.     GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );
  21.     GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );
  22.     GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );
  23.   } 
  24.   //GAP与BOND设置
  25.     uint32 passkey = 0;
  26.     uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
  27.     uint8 mitm = TRUE;
  28.     uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
  29.     uint8 bonding = TRUE;
  30.     GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey );
  31.     GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );
  32.     GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );
  33.     GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );
  34.     GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );
  35.   }

  36.   GGS_AddService( GATT_ALL_SERVICES ); 
  37.   GATTServApp_AddService( GATT_ALL_SERVICES );   
  38.   DevInfo_AddService();
  39.   SimpleProfile_AddService( GATT_ALL_SERVICES );     //添加simpleProfile
  40.   { //设置simpleProfile属性
  41.     uint8 charValue1 = 1;
  42.     uint8 charValue2 = 2;
  43.     uint8 charValue3 = 3;
  44.     uint8 charValue4 = 4;
  45.     uint8 charValue5[SIMPLEPROFILE_CHAR5_LEN] = { 1, 2, 3, 4, 5 };
  46.     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR1, sizeof ( uint8 ), &charValue1 );
  47.     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR2, sizeof ( uint8 ), &charValue2 );
  48.     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR3, sizeof ( uint8 ), &charValue3 );
  49.     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof ( uint8 ), &charValue4 );
  50.     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5 );
  51.   }
  52.   //注册simpleProfile回调
  53.   VOID SimpleProfile_RegisterAppCBs( &simpleBLEPeripheral_SimpleProfileCBs );

  54.   osal_set_event( simpleBLEPeripheral_TaskID, SBP_START_DEVICE_EVT );
  55. }
Profile--> simpleGATTprofile.c




阅读(11137) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~