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

OSAL启动过程分析相关推荐

  1. 嵌入式linux启动过程分析,嵌入式Linux裸机开发(二)——S5PV210启动过程分析

    嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介 友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅 ...

  2. OpenWrt启动过程分析+添加自启动脚本【转】

    一.OpenWrt启动过程分析 转自: http://www.eehello.com/?post=107 总结一下OpenWrt的启动流程:1.CFE->2.linux->3./etc/p ...

  3. pixhawk PX4FMU和PX4IO最底层启动过程分析

    摘要: pixhawk PX4FMU和PX4IO最底层启动过程分析1.1 主处理器和协处理器的固件烧写和运行流程首先,大体了解PX4IO 与PX4FMU各自的任务.PX4IO(STM32F100)为P ...

  4. linux 重定位arm,Arm linxu启动过程分析(一)

    本文着重分析 FS2410 平台 linux-2.6.14 内核启动的详细过程,主要包括: zImage 解压缩阶段. vmlinux 启动汇编阶段. startkernel 到创建第一个进程阶段三个 ...

  5. linxu 启动过程分析

    linxu 启动过程分析 Linux启动过程如下:当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux ...

  6. 开机SystemServer到ActivityManagerService启动过程分析

    开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /*** ...

  7. AliOS Things的启动过程分析(一)

    AliOS Things的启动过程分析(一) 在本篇文章中,我们以developerkit开发板为例,介绍AliOS Things的启动过程.AliOS Things支持多种工具链进行编译链接的方式生 ...

  8. Chromium的GPU进程启动过程分析

    Chromium除了有Browser进程和Render进程,还有GPU进程.GPU进程负责Chromium的GPU操作,例如Render进程通过GPU进程离屏渲染网页,Browser进程也是通过GPU ...

  9. Android开发入门教程2-Android init 启动过程分析

    Android init 启动过程分析   分析android的启动过程,从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linu ...

  10. 嵌入式linux s5pv210,嵌入式Linux裸机开发(二)——S5PV210启动过程分析

    嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅三 ...

最新文章

  1. python入门导引
  2. mathtype中批量修改公式的字号和大小
  3. 【NLP】业界总结 | BERT的花式玩法
  4. 解决Xcode升级,导致以前安装的插件失效的办法
  5. [深度学习-实践]GAN基于手写体Mnist数据集生成新图片
  6. 四、java中的数组
  7. Nginx笔记总结十六:nginx优化指南
  8. java 并发变量_二、Java多线程编程 (对象及变量的并发访问)
  9. .Net魔法堂:发个带附件的邮件
  10. aspx转为html5,保存ASPX 生成的html代码
  11. 各种系统架构图与详细说明
  12. 长期主义:永远做你余生中最重要的事!
  13. linux双网卡透明网桥,两种网桥透明网桥和源路由选择网桥
  14. flash.js 劫持怎么解决
  15. 太阳照常升起(C大调)
  16. anaconda 的安装及环境配置、anaconda创建新的环境、jupyter代码高亮及自动补全、改变jupyter注释的字体及颜色
  17. 决胜最后一公里 外卖O2O须达信息化标准
  18. 最后冲刺:第三届全国人工智能大赛决赛战报
  19. python 因果推断_因果推断书Causal inference:What if简介(附:因果推断书单推荐)...
  20. fpga中的slack_如何在Slack中发起视频通话

热门文章

  1. 使用Latex排版一篇IEEE Robotics and Automation Letters期刊文章
  2. 火山视窗选择夹内使用右键菜单演示
  3. 程序员代码对比工具,就用这7个!
  4. 下载elasticsearch的jdbc包
  5. mtk2503电流设定失败
  6. protues8.0仿真视频教程 51单片机教程
  7. 【信息技术】【2014.07】交通监控中的车辆跟踪与速度估计
  8. LabelImg安装
  9. 【SPPS学习一】 SPSS-26软件下载与安装步骤详解
  10. 割点(tarjan算法)