OSAL启动过程分析

一、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();//初始化电源管理系统

===>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 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/lxllinux/article/details/83343945