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
版权声明:本文为博主原创文章,转载请附上博文链接!
OSAL启动过程分析相关推荐
- 嵌入式linux启动过程分析,嵌入式Linux裸机开发(二)——S5PV210启动过程分析
嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介 友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅 ...
- OpenWrt启动过程分析+添加自启动脚本【转】
一.OpenWrt启动过程分析 转自: http://www.eehello.com/?post=107 总结一下OpenWrt的启动流程:1.CFE->2.linux->3./etc/p ...
- pixhawk PX4FMU和PX4IO最底层启动过程分析
摘要: pixhawk PX4FMU和PX4IO最底层启动过程分析1.1 主处理器和协处理器的固件烧写和运行流程首先,大体了解PX4IO 与PX4FMU各自的任务.PX4IO(STM32F100)为P ...
- linux 重定位arm,Arm linxu启动过程分析(一)
本文着重分析 FS2410 平台 linux-2.6.14 内核启动的详细过程,主要包括: zImage 解压缩阶段. vmlinux 启动汇编阶段. startkernel 到创建第一个进程阶段三个 ...
- linxu 启动过程分析
linxu 启动过程分析 Linux启动过程如下:当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux ...
- 开机SystemServer到ActivityManagerService启动过程分析
开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /*** ...
- AliOS Things的启动过程分析(一)
AliOS Things的启动过程分析(一) 在本篇文章中,我们以developerkit开发板为例,介绍AliOS Things的启动过程.AliOS Things支持多种工具链进行编译链接的方式生 ...
- Chromium的GPU进程启动过程分析
Chromium除了有Browser进程和Render进程,还有GPU进程.GPU进程负责Chromium的GPU操作,例如Render进程通过GPU进程离屏渲染网页,Browser进程也是通过GPU ...
- Android开发入门教程2-Android init 启动过程分析
Android init 启动过程分析 分析android的启动过程,从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linu ...
- 嵌入式linux s5pv210,嵌入式Linux裸机开发(二)——S5PV210启动过程分析
嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅三 ...
最新文章
- python入门导引
- mathtype中批量修改公式的字号和大小
- 【NLP】业界总结 | BERT的花式玩法
- 解决Xcode升级,导致以前安装的插件失效的办法
- [深度学习-实践]GAN基于手写体Mnist数据集生成新图片
- 四、java中的数组
- Nginx笔记总结十六:nginx优化指南
- java 并发变量_二、Java多线程编程 (对象及变量的并发访问)
- .Net魔法堂:发个带附件的邮件
- aspx转为html5,保存ASPX 生成的html代码
- 各种系统架构图与详细说明
- 长期主义:永远做你余生中最重要的事!
- linux双网卡透明网桥,两种网桥透明网桥和源路由选择网桥
- flash.js 劫持怎么解决
- 太阳照常升起(C大调)
- anaconda 的安装及环境配置、anaconda创建新的环境、jupyter代码高亮及自动补全、改变jupyter注释的字体及颜色
- 决胜最后一公里 外卖O2O须达信息化标准
- 最后冲刺:第三届全国人工智能大赛决赛战报
- python 因果推断_因果推断书Causal inference:What if简介(附:因果推断书单推荐)...
- fpga中的slack_如何在Slack中发起视频通话