IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當前位置:首頁 > 學習資源 > 講師博文 > TI藍牙4.0協議棧main函數分析

TI藍牙4.0協議棧main函數分析 時間:2018-09-25      來源:華清遠見

我們采用BLE-CC254x-1.3.2中的KeyFob工程展開分析.

我們都知道在C代碼中,程序的入口都是main()函數,這個函數在KeyFob_Main.c中

打開文件,可以看到這個文件包含了一些必要的頭文件和一個函數的申明,我們暫時不理會那個申明的函數,先看main都做了些什么工作:

通過代碼我們可以看到,系統啟動的過程,主要是做了一些初始化,如果開啟了低功耗,則還需要開啟低功耗管理。我們先不去理會初始化做了什么,但是我們知道main函數終啟動了OSAL,所以我們只分析相關的兩個函數osal_init_system()和osal_start_system().

我們進入osal_init_system()

我們從TI官方的注釋就能大致知道每個函數的作用.我再簡單介紹一下:

1044:初始化內存分配系統

1047:初始化消息隊列

1050:初始化定時器

1053:初始化電源管理系統

1056:初始化系統任務,這個函數添加了所有的任務,我們在以后詳細分析它.

1059: 設置有效的查找堆上的第一個空閑塊

我們進入osal_start_system(),發現這里會循環調用osal_run_system()

osal_run_system()才是整個協議棧的核心,進入到osal_run_system()后發現他只有1102-1147這些行代碼.這些代碼就是整個協議棧運轉的大腦,我們務必要把這里搞清楚.

我們發現代碼里邊有好多預編譯宏,而這些宏我們都沒有定義,所以對應的函數代碼也沒有執行,我們再次精簡一下代碼,

好了,我們就詳細得分析下這段代碼吧.

首先是一個do{}while()的組合,我們上來就執行do{}中得語句

我們先來解析下tasksEvents[idx],idx在1102行被賦值為0,那tasksEvents又是什么呢?我們右鍵點擊變量然后go to definition或者按快捷鍵F12查看變量定義的位置

追到以后發現是個指針,那它何時被賦值呢 ,被賦值成什么呢??我們要用到高級搜索這個功能了,把它找出來.

我們選中以后,按下組合鍵ctrl+shift+f,然后點擊find即可

我們發現有以下地方用到了這個指針

用到的地方不少,別害怕,照著我的步驟你你就會看見前方一片光明.

首先我們來看osalInitTasks()函數,在126行用malloc()分配了一片堆空間,后將這片空間的首地址賦值給tasksEvents.這里呢我們就可以將

tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);這句話等價于你定義了一個數組uint16 tasksEvents[tasksCnt],tasksCnt是幾呢?我一會告訴你.

127行將這片空間的數據全部清零,也就是將數組的全部元素清零.

這里我們先不去管這片內存空間中要存儲什么數據,我們知道這里邊全部是0;

再回到

do {

if (tasksEvents[idx]) // Task is highest priority that is ready.

{

break;

}

} while (++idx < tasksCnt);

剛開始idx得值是0, tasksEvents[idx]也就是0;那if (tasksEvents[idx])就不成立.隨后會執行while()中得語句++idx < tasksCnt, 這里我們需要再去跟蹤下tasksCnt這個變量,發現他原來是個常量:

問題又來了, tasksArr又是啥呢?我們繼續跟蹤

我們發現這是個數組,那數組中又存的是什么類型呢>?我們跟下pTaskEventHandlerFn,原來這是函數指針啊,那我們就清楚了tasksArr這個數組中全部存的是函數指針啊.至于這些函數指針是干什么得,又指向誰我們待會來分析.但我相信你已經知道了tasksCnt的值.

有點亂,我們現在先回憶下,剛才有幾個重要的變量.

其中一個是存函數指針得數組tasksArr,這些函數指針具體干嘛我們一會分析.

還有一個是這個數組中函數指針的個數tasksCnt.

還有一個指針變量tasksEvents.我們知道這個函數指針指向了一片堆空間,并且空間中全是0;我們就把它當成一個數組,數組中有tasksCnt個成員,每個成員的大小是兩個字節.再看do{}while()這個組合.

do {

if (tasksEvents[idx]) // Task is highest priority that is ready.

{

break;

}

} while (++idx < tasksCnt);

根據上邊所說的,你應該能想到這個循環結束的時候idx的數值了吧.對的,他后是等于tasksCnt的,結束循環后就進入1136行得分支,這里就是系統在檢測到沒有事件發生的時候進入低功耗模式.

那什么時候才會進入1119行這個分支來處理發生的事件呢.我們再來認識一個新的函數osal_set_event();這個函數得功能就是標識有事件發生,我們來分析下代碼.

904行判斷傳參task_id是否小于tasksCnt(你好還記得這個常量).907行關閉中斷,進入臨界區.908行有用到剛才那個函數指針tasksEvents了(其實也是數組首地址),那這個數組存這些變量有什么意義呢?

一句話告訴你,這個數組的每一個成員都代表一個任務,每個成員是兩個字節就是16位,每一位都代表這個任務中得一個事件,那一個任務能有幾個事件呢?怎么能表示事件發生還是沒發生呢?聰明的你應該能想到是16個了.事件發生就將對應的位置一就好了.

我們只需要知道協議棧里會通過中斷,函數調用等方式調osal_set_event()將系統事件置一.好了我們再回到下面的代碼:

do {

if (tasksEvents[idx]) // Task is highest priority that is ready.

{

break;

}

} while (++idx < tasksCnt);

這時候tasksEvents[idx]隨著idx得增加if (tasksEvents[idx])會成立了吧,這時候break出來idx的值剛好對應的是任務的編號.

終于能執行這段分支了,我們來分析下;

1122:進入臨界區,關中斷;

1123:將待處理的任務中所有的事件賦值給變量events

1124:將tasksEvents數組中該任務的事件全部清空

1125:退出臨界區,開中斷;

1127:將當前任務的標號復制給全局變量,它代表當前正在處理的任務的標號

1128:還記得tasksArr()存的是什么嗎?是函數指針,他其實就是對應任務的處理函數,至于這個處理函數都做了什么?我們下次分析,現在大家只用知道你把 事件傳進去,他會幫你處理,但每次只能處理一個事件,然后將處理完的事件對應的位清零隨后將新的事件變量返回.再賦值給events

1129:將activeTaskID賦值為TASK_NO_TASK代表當前沒有任務處理

1131: 進入臨界區,關中斷;

1132: 由于你剛才將事件變量清空了,你每次又只能處理一個事件,你總要把剩下沒處理的變量告訴我吧.

1133: 退出臨界區,開中斷;

好了,到這里該停了,我們先來總結下:

一個任務中如何表示不同的事件呢?

用一個unsigned short類型的變量來記錄不同的事件,unsigned short占兩個字節,總共16位,每一位二進制表示一個事件.

任務對應的處理函數放在哪呢?

放在const pTaskEventHandlerFn tasksArr[];

如果知道某個任務發生了某個事件,怎么記錄?

用這個函數 uint8 osal_set_event( uint8 task_id, uint16 event_flag )

下次我們會分析osalInitTasks()這個函數,還有任務和處理任務事件的函數是怎么聯系起來的? 如何在協議棧添加一個自己的任務,處理任務里的事件?

上一篇:Freemodbus啟動流程分析

下一篇:Linux內核中的數據結構的一點認識

戳我查看嵌入式每月就業風云榜

點我了解華清遠見高校學霸學習秘籍

猜你關心企業是如何評價華清學員的

干貨分享
相關新聞
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2024 北京華清遠見科技發展有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 全自动|电加热配液罐,浓缩器厂家-森博百科 | 武汉办公室装修公司-展厅装修_湖北今泰装饰工程有限公司官网_今泰装饰 | 昆明塑料包装袋|云南塑料包装袋|昆明塑料袋厂家|云南茶叶大米蔬菜种子食品包装袋就来阮门包装有限公司 | 思源医疗器械网,雾化器厂家,医用床生产厂家,医疗器械厂家,医疗器械代加工 | 亚洲一区日韩一区欧美一区a,中文字幕乱妇无码AV在线,欧美日韩免费在线观看,国产精品一区二区三区免费,日韩精品免费一线在线观看,日韩一本在线,国产呦精品一区二区三区下载,国产日韩精品一区二区在线观看,欧美日韩高清一区二区三区,日韩在线免费观看视频,欧美日韩一区在线观看 | 润滑油展会 沈阳 南京 润滑油 展会 西安 润滑脂 中国国际润滑油 全国润滑油 汽配_中国国际润滑油、脂、养护用品及技术设备展览会 | 妙手官网—商品管理、批量修改、订单处理、营销水印 | 济南诚润达贸易有限公司 - 专注专营巴斯夫防冻冷却液 | 装修工程-钢结构工程-环氧地坪漆-东莞市远鸣装饰工程有限公司 | 陕西筱润智能科技有限公司 干部人事智能档案柜 智能密集架 智能档案柜 部队选层文件智能柜 智能枪弹柜 财务智能档案柜 边防武警智能密集架 医院智能档案柜 部队选层文件智能柜智能枪弹柜 学校医院文件柜 企事业单位公检法智能文件柜 生产厂家-筱润智能科技有限公司 RFID射频智能密集架 全自动智能选层档案柜 智能密保柜 枪柜部队营房营具床桌椅办公家具 办公用品档案盒设备货架 全自动智能选层柜生产厂家-筱润智能科技有限公司 | 木材粉碎机,木头木材破碎机,大型木材粉碎机多少钱一台-晨红木材粉碎机厂家-巩义市晨红机械厂 | 麦秸映像网络技术有限公司,河南省政府采网入驻对接,新乡网站维护建设,小程序开发,APP定制开发,钉钉开发,新乡软件开发等相关网络业务 | 名嘉宴会【官网】_宁波冷餐_宁波茶歇_宁波酒会_宁波自助餐_宁波盛世名嘉宴会服务有限公司 | 紫铜箔(带)导电胶带定做,定做紫铜箔(带)导电胶带厂家[价格]-艾飞敏铜箔 | 深圳蓝枫印刷_画册印刷_彩页印刷_宣传册印刷_包装盒印刷_彩盒印刷厂_不干胶印刷厂 | 免费会员管理系统,会员管理软件,会员卡积分系统—智络软件 | 吉工宝-建筑工程项目精细化管理-施工现场安全管理软件 | 弯箍机_钢筋弯箍机_全自动钢筋弯箍机_数控弯箍机-建科智能装备制造(天津)股份有限公司 | 上海三友医疗器械股份有限公司 | 磨刀机厂家,全自动磨刀机-山东威海富田磨具 | 自恢复保险丝_贴片保险丝_插件保险丝_力特保险丝_力特经销商_SMD贴片保险丝_一次性保险丝厂家—深圳市集电通实业有限公司 | 亿企商贸-亿万企业的商务贸易平台-B2B企业产品发布供求信息平台,一带一路中国企业及产品展示平台,免费企业智能自助建站网络营销推广平台,打造B2B企业黄页产品信息发布推广专业综合电子商务平台! | 山东向阳电子科技有限公司-多用户集中式电能表生产厂家,NB物联网水表,刷卡水电表生产厂家,泰安智能水电表价格 | 重庆聚成达汽车有限公司-重庆吸污净化车 | 郑州华特仪器设备有限公司-dlsb低温冷却液循环泵-SHZ-DIII循环水真空泵 | 棕色土壤采样瓶,棕色小口水样采样瓶-上海迈隆科技有限公司 | 医疗器械,理化实验室设备,微生物,培养基,一站式采购 - 杭州润泽仪器商城 | 狠狠穞A片一區二區三區-免费网站在线观看人数更新时间-欧洲尺码日本尺码专线不卡顿,国产大尺度禁片未删减版,baomaav | 深圳市桃子自动化科技有限公司-点胶机_灌胶机_焊锡机_螺丝机_SCARA机器人 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 首页 - 郑州市宏美彩印包装有限公司| 昆明子弟食品有限公司| 辣椒烘干机-百信机械提供大中小型辣椒烘干机房设备视频图片厂家价格多少钱 | 氧化膜测厚仪-瓶壁测厚仪-QNIX菲尼克斯膜厚仪-深圳市时代之峰科技有限公司 | 河北万岁药业有限公司 | 昆山精鑫模具有限公司-模具研发生产 | 一站式服务体验 | 泡沫混凝土垫层填充厂家,发泡混凝土垫层填充,轻质混凝土垫层填充厂家,深圳市鸿奥建材发展有限公司 | 上海升降机_导轨式升降货梯_移动铝合金升降机_上海力盏电动液压平台厂家 | 深圳车牌识别系统厂家_人脸识别厂家_通道闸厂家_车位引导系统_智慧社区管理系统_深圳市利普诺科技有限公司官网 | 酒店设计_建筑设计_室内装修装饰-北极点酒店设计公司 | 疲劳试验机|电子万能试验机|摩擦磨损试验机|冲击试验机|济南全力测试技术有限公司 |