Dialog 1.08 SDK Pxp reporter 代码走读 - 2
2016-12-29 17:35
134 查看
再回到APP的任务框架几件重要事情的实现方法。
其一,add service.
void ble_service_add(ble_service_t *svc)
{
int i;
for (i = 0; i < MAX_SERVICES; i++) {
if (!services[i]) {
services[i] = svc;
break;
}
}
}
从代码可以看出,仅仅是将Sevice的指针添加到数组中。但有系统服务发生时,APP会调用相关的函数,如connect发生时,会调用
static void connected_evt(const ble_evt_gap_connected_t *evt)
{
int i;
for (i = 0; i < MAX_SERVICES; i++) {
ble_service_t *svc = services[i];
if (svc && svc->connected_evt) {
svc->connected_evt(svc, evt);
}
}
}
这时,如果对应服务存在而且有相应 处理函数时,会调用它。服务中的handle connect, read, write等事件的处理都是如此处理,这些处理函数的分派都会通过在App
的Task中会调用ble_service_handle_event来执行的。也保证也Service代码重用和独立。可以说是比较巧妙的。
其二,创建定时器。
先申明全局变量定时变量并在任务开始时创建定时器。定时器有回调函数
/* Timer used for battery monitoring */
PRIVILEGED_DATA static OS_TIMER bas_tim;
。。。。。。
/*
* Create timer for battery monitoring.
*/
bas_tim = OS_TIMER_CREATE("bas", OS_MS_2_TICKS(PX_REPORTER_BATTERY_CHECK_INTERVAL), true,
(void *) OS_GET_CURRENT_TASK(), bas_tim_cb);
有两点有意思的东西。第一,TimerID看来中以自定义,直接使用了任务的指针,相当于一个参数传递,在回调函数中可以使用。
第二,在回调函数中,没有直接处理定时器,我理解原因应该是回调函数是在Timer任务中调用的,任务优先级很高,不适合处理APP相关事情,所以定义了一个任务Notify bit,并在回调函数中向App的任务传递,将回调事宜将给App级别Task来处理。
定时器回调函数定义如下。
static void bas_tim_cb(OS_TIMER timer)
{
OS_TASK task = (OS_TASK) OS_TIMER_GET_TIMER_ID(timer);
OS_TASK_NOTIFY(task, BAS_TMO_NOTIF, OS_NOTIFY_SET_BITS);
}
#define BAS_TMO_NOTIF (1 << 3)
其三,任务循环。
整个任务循环都是围绕这个Notify来的。
/*
* Wait on any of the notification bits, then clear them all
*/
ret = OS_TASK_NOTIFY_WAIT(0, OS_TASK_NOTIFY_ALL_BITS, ¬if, OS_TASK_NOTIFY_FOREVER);
NOTIFY的BITS中,最低位(1<<0)默认是蓝牙相关Notify BLE_APP_NOTIFY_MASK,当有这个NOTIFY时,调用ble_service_handle_event处理各个Sevice相关工作。
其他BIT可以自定义。比如以上用到了当然Timer 回调的通知的处理。
其一,add service.
void ble_service_add(ble_service_t *svc)
{
int i;
for (i = 0; i < MAX_SERVICES; i++) {
if (!services[i]) {
services[i] = svc;
break;
}
}
}
从代码可以看出,仅仅是将Sevice的指针添加到数组中。但有系统服务发生时,APP会调用相关的函数,如connect发生时,会调用
static void connected_evt(const ble_evt_gap_connected_t *evt)
{
int i;
for (i = 0; i < MAX_SERVICES; i++) {
ble_service_t *svc = services[i];
if (svc && svc->connected_evt) {
svc->connected_evt(svc, evt);
}
}
}
这时,如果对应服务存在而且有相应 处理函数时,会调用它。服务中的handle connect, read, write等事件的处理都是如此处理,这些处理函数的分派都会通过在App
的Task中会调用ble_service_handle_event来执行的。也保证也Service代码重用和独立。可以说是比较巧妙的。
其二,创建定时器。
先申明全局变量定时变量并在任务开始时创建定时器。定时器有回调函数
/* Timer used for battery monitoring */
PRIVILEGED_DATA static OS_TIMER bas_tim;
。。。。。。
/*
* Create timer for battery monitoring.
*/
bas_tim = OS_TIMER_CREATE("bas", OS_MS_2_TICKS(PX_REPORTER_BATTERY_CHECK_INTERVAL), true,
(void *) OS_GET_CURRENT_TASK(), bas_tim_cb);
有两点有意思的东西。第一,TimerID看来中以自定义,直接使用了任务的指针,相当于一个参数传递,在回调函数中可以使用。
第二,在回调函数中,没有直接处理定时器,我理解原因应该是回调函数是在Timer任务中调用的,任务优先级很高,不适合处理APP相关事情,所以定义了一个任务Notify bit,并在回调函数中向App的任务传递,将回调事宜将给App级别Task来处理。
定时器回调函数定义如下。
static void bas_tim_cb(OS_TIMER timer)
{
OS_TASK task = (OS_TASK) OS_TIMER_GET_TIMER_ID(timer);
OS_TASK_NOTIFY(task, BAS_TMO_NOTIF, OS_NOTIFY_SET_BITS);
}
#define BAS_TMO_NOTIF (1 << 3)
其三,任务循环。
整个任务循环都是围绕这个Notify来的。
/*
* Wait on any of the notification bits, then clear them all
*/
ret = OS_TASK_NOTIFY_WAIT(0, OS_TASK_NOTIFY_ALL_BITS, ¬if, OS_TASK_NOTIFY_FOREVER);
NOTIFY的BITS中,最低位(1<<0)默认是蓝牙相关Notify BLE_APP_NOTIFY_MASK,当有这个NOTIFY时,调用ble_service_handle_event处理各个Sevice相关工作。
其他BIT可以自定义。比如以上用到了当然Timer 回调的通知的处理。
相关文章推荐
- Dialog 1.08 SDK Pxp reporter 代码走读
- Dialog 1.08 SDK 实战 —— 添加新的Sevice
- Dialog 1.08 SDK 实战 —— 搭建环境
- windows200/Xp关机重起代码
- 在sdk下恶作剧2的代码(发送QQ消息)
- 小代码 OpenFileDialog() Windows下Upload & rewrite 文件
- XP下的网络和P2P编程SDK
- Microsoft .NET Framework SDK Net Classes:用管理代码编写联网应用程序
- NT,2000,XP 的 CDROM 引导扇区代码分析
- C#中代码Dialog控件实现(打开,保存,改变字体,颜色,打印功能)
- 不用DLL即可Hook得到按键代码(支持XP)
- C# 中使得windows 2000/XP关机代码
- 98、2000和XP系统自定义打印纸张的VB代码
- 更换XP序列号的代码!
- 超酷的XP风格的网页右键菜单特效代码
- 可再发行平台 SDK:CAPICOM ,对数据进行数字签名、对代码签名、验证数字签名、包封保密数据、对数据进行散列处理、加密及解密数据的SDK
- 网络同步校时UDP服务器端SDK代码(RFC868/C++/WIN32/SOCKET/UDP)
- Windows NT 内核操作系统(2000、XP系列)部分常见蓝屏死机代码详解
- Microsoft .NET Framework SDK Net Classes:用管理代码编写联网应用程序
- XP下的网络和P2P编程SDK