一、SimpleBLEBroadcaster OSAL启动过程分析:
Main()
==> HAL_BOARD_INIT();//初始化硬件
==> InitBoard( OB_COLD );//初始化板卡IO
==> HalDriverInit(); //hal层驱动初始化
==> osal_snv_init();//初始化Flash
==> osal_init_system(); //初始化OSAL
===>osal_mem_init();//初始化内存分配系统
===>osal_qHead = NULL;//初始化消息队列
===>osalTimerInit();//初始化定时器
===>osal_pwrmgr_init();//初始化电源管理系统
![](/qrcode.jpg)
===>osalInitTasks(); //初始化系统任务
===> 建立任务事件位图内存 uint16 XXX[taskCnt] (tasksEvents 为uint16 *指针)
===>初始化任务ID taskID = 0;
===> LL_Init( taskID++ ); //链路层任务初始化;对应tasksArr[0]=LL_ProcessEvent()
===> Hal_Init( taskID++ ); //硬件抽象层 ;对应tasksArr[1]=Hal_ProcessEvent()
===> HCI_Init( taskID++ ); //主机控制器接口;对应tasksArr[2]=HCI_ProcessEvent()
===>osal_CbTimerInit(taskID); //定时器任务初始化; 对应tasksArr[3]=osal_CbTimerProcessEvent()
===> GAP_Init( taskID++ ); //通用访问 配置文件层 ;对应tasksArr[4]=GAP_ProcessEvent()
===> GAPRole_Init( taskID++ ); //通用属性 配置文件层;对应tasksArr[5]=GAPRole_ProcessEvent()
===>设置全局变量gapRole_TaskID=task_id;
===> gapRole_state = GAPROLE_INIT; // 设定角色的状态为 <等待被启动>
//GAPROLE_STARTED<启动但未广播>、GAPROLE_ADVERTISING<当前正在广播>、GAPROLE_WAITING<当前未广播>、GAPROLE_ERROR<当前是无效的状态>
===>GAP_RegisterForHCIMsgs() //注册控制接口的任务ID
===>//初始化广播配置文件和连接参数
===>gapRole_profileRole = GAP_PROFILE_BROADCASTER;
// 设置设备配置角色;为一种只发送广播事件的设备
===>gapRole_AdvEventType = GAP_ADTYPE_ADV_NONCONN_IND;
// 设置事件类型:为不可以被连接,不可以被扫描。
===>gapRole_AdvDirectType = ADDRTYPE_PUBLIC;
// 设置GAP地址类型:ADDRTYPE_PUBLIC
===>gapRole_AdvChanMap = GAP_ADVCHAN_ALL;
// 广播频道选择(3个)GAP_ADVCHAN_ALL
===>gapRole_AdvFilterPolicy = GAP_FILTER_POLICY_ALL;
// 广播过滤策略选择;
===>simpleBLEBroadcaster_Init( taskID ); //应用层的初始化;对应tasksArr[6]=SimpleBLEBroadcaster_ProcessEvent()
===>//广播的开启/关闭
uint8 initial_advertising_enable = TRUE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
===>// 无限期关闭广播,直到广播再次使能。
uint16 gapRole_AdvertOffTime = 0;
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );
===>// 设置广播扫描响应数据
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
===>// 设置广播数据
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( mb_advertData ), advertData );
===>// 设置广播的类型为.
uint8 advType = GAP_ADTYPE_ADV_DISCOVER_IND; (不可被连接,可被扫描)
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );
===>// 广播时间间隔设置;
uint16 advInt = DEFAULT_ADVERTISING_INTERVAL; (100ms)
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );
===>// 如何定义了 CC2540_MINIDK 宏,注册所有的按键事件到本任务
RegisterForKeys( simpleBLEBroadcaster_TaskID );
===>// 如何定义了 CC2540_MINIDK 宏,关闭所有的LED
HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF );
===>// 如何定义了 CC2540_MINIDK 宏,GPIO使能、输入输出模式、认输出电平的配置。
===>// LED提示字符串显示
HalLcdWriteString( "BLE Broadcaster", HAL_LCD_LINE_1 );
===>//通过osal_set_event() 注册一个延迟的事件:SBP_START_DEVICE_EVT(设备启动触发事件)
osal_set_event( simpleBLEBroadcaster_TaskID, SBP_START_DEVICE_EVT );
===>osal_mem_kick()
==> HAL_ENABLE_INTERRUPTS(); //使能中断
==> InitBoard( OB_READY ); //板卡最后初始化
==> osal_start_system(); // No Return from here (启动OSAL)
===>for(;;){osal_run_system()} // 死循环,不断执行osal_run_system()
===>osal_run_system() // 循环体
===>Hal_ProcessPoll() //处理轮询
===>HalUARTPoll() //串口轮询
===>usbHidProcessEvents()//人性化接口轮询(如本接口的键盘)
===>遍历1遍任务事件位图 tasksEvents[idx],有任务中的事件注册触发了就退出,以便处理.
===>记录任务中的事件到uint16 events;并清0任务事件位图中的相应任务域。
===>根根据taskid,回调不同的任务处理函数 tasksArr[idx],(传入事件events量);并返回一个events。
===>SimpleBLEBroadcaster_ProcessEvent() // 用户定义的事件处理函数(为例子分析)
===> if ( events & SYS_EVENT_MSG ) //若有pMsg等待接收事件
===>if ( (pMsg = osal_msg_receive( simpleBLEBroadcaster_TaskID )) != NULL )// 获得pMsg
===>simpleBLEBroadcaster_ProcessOSALMsg()// 处理pMsg(osal_event_hdr_t类型)
===> switch判断pMsg->event == KEY_CHANGE // 是按键事件吗,否退出
===>将osal_event_hdr_t 强制转换为具体事件描述--按键事件类型 keyChange_t。
===>simpleBLEBroadcaster_HandleKeys() // 处理按键事件
===>if ( keys & HAL_KEY_SW_2 )//若按下ringht键就执行一定处理(如开关广播)。
===>osal_msg_deallocate() //清除消息pMsg内存
===> if ( events & SBP_START_DEVICE_EVT ) //若有启动设备事件
===>GAPRole_StartDevice() //处理启动设备事件
===>if ( gapRole_state == GAPROLE_INIT ) //如果链路状态是初始化状态
===>将GAP回调函数集simpleBLEBroadcaster_BroadcasterCBs记录到全局的便利pGapRoles_AppCGs,等待被执行。
===> 执行gapRole_SetupGAP() // 开始建立链路;
===>将新的返回的events任务写回注册到tasksEvents[idx],等待被处理。
---------------------
作者:Life_Maze
来源:CSDN
原文:https://blog.csdn.net/Life_Maze/article/details/79634192
版权声明:本文为博主原创文章,转载请附上博文链接!