【BLE】CC2541之加入自己定义任务
本篇博文最后改动时间:2017年01月06日,11:06。
一、简单介绍
本文介绍怎样在SimpleBLEPeripheralproject中。加入一个香瓜任务。
(香瓜任务与project原有任务相互独立。互不影响)
二、实验平台
协议栈版本号:BLE-CC254x-1.4.0
编译软件:IAR 8.20.2
硬件平台:Smart RF(主芯片CC2541)
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
spm=2013.1.1000126.d21.hd2o8i
五、基础知识
1、任务、事件、消息的差别是什么?
答:
1)简述
1台设备中有多个任务,1个任务有16个事件,消息用于不同任务之间的传递。
2)详述
任务:SimpleBLEPeripheralproject中从底层的LL层到应用的Application层。一共分为有12个任务,每一个任务会分配一个事件管理的变量,变量统一存在:
uint16 *tasksEvents;
当中,越底层的优先级越高。应用层的优先级是最低的,也就是此层中的事件是最后才会处理。
事件:1个任务中有16个事件,也就是上面tasksEvents的16位每一位都相应一个事件。0x0001意味着第0位的事件须要被运行。
注意,每一个任务的第15位事件(0x8000)是用于不同任务之间的消息传递的,此事件不可被我们编程使用!
!!!
消息:用于不同任务之间的传递。
比方,当按键按下时,HAL层检測到了按键。osal会将按键的信息打包,通过消息的形式发往应用层,终于在应用层做按键的处理。
以下举个样例。加强理解。
比如,tasksEvents[11] = 0x0002。那么就意味着,第11个任务的第1位事件须要被运行。
首先,在OSAL_SimpleBLEPeripheral.c中,能够看到第11个任务是应用层。
const pTaskEventHandlerFn tasksArr[] =
{
LL_ProcessEvent, // task 0
Hal_ProcessEvent, // task 1
HCI_ProcessEvent, // task 2
#if defined ( OSAL_CBTIMER_NUM_TASKS )
OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ), // task 3
#endif
L2CAP_ProcessEvent, // task 4
GAP_ProcessEvent, // task 5
GATT_ProcessEvent, // task 6
SM_ProcessEvent, // task 7
GAPRole_ProcessEvent, // task 8
GAPBondMgr_ProcessEvent, // task 9
GATTServApp_ProcessEvent, // task 10
SimpleBLEPeripheral_ProcessEvent // task 11
};
其次,在应用层的SimpleBLEPeripheral.h文件里。发现0x0002事件是周期事件
// Simple BLE Peripheral Task Events
#define SBP_START_DEVICE_EVT 0x0001
#define SBP_PERIODIC_EVT 0x0002
最后。当osal层运行到应用层时,就会去运行应用层中的事件处理函数SimpleBLEPeripheral_ProcessEvent中的SBP_PERIODIC_EVT事件了。
2、是否一定须要加入自己的任务、事件、消息?
答:SimpleBLEPeripheralproject中已经给每一个层分配了任务,而osal也把消息机制做好了。因此并不一定要加入自己的任务、消息。
而应用层的事件往往是须要被修改的,比方加入按键事件、通信事件、定时事件、採集事件……
当应用层的16个事件都被你使用完了,这时候才须要考虑新增一个任务,这样又多16个事件可使用。
六、实验步骤
1、加入香瓜任务的初始化调用
1)调用香瓜任务的初始化函数(OSAL_SimpleBLEPeripheral.c的osalInitTasks中)
void osalInitTasks( void )
{
uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); /* LL Task */
LL_Init( taskID++ ); /* Hal Task */
Hal_Init( taskID++ ); /* HCI Task */
HCI_Init( taskID++ ); #if defined ( OSAL_CBTIMER_NUM_TASKS )
/* Callback Timer Tasks */
osal_CbTimerInit( taskID );
taskID += OSAL_CBTIMER_NUM_TASKS;
#endif /* L2CAP Task */
L2CAP_Init( taskID++ ); /* GAP Task */
GAP_Init( taskID++ ); /* GATT Task */
GATT_Init( taskID++ ); /* SM Task */
SM_Init( taskID++ ); /* Profiles */
GAPRole_Init( taskID++ );
GAPBondMgr_Init( taskID++ ); GATTServApp_Init( taskID++ );
//香瓜
/* Application */
SimpleBLEPeripheral_Init( taskID++ ); /* 香瓜应用 */
GUA_Init( taskID );
//香瓜
}
注意SimpleBLEPeripheral_Init任务的括号里。taskID须要添加。
而香瓜任务为最后一个任务。不须要再添加。
2)注冊香瓜任务的事件(OSAL_SimpleBLEPeripheral.c中)
const pTaskEventHandlerFn tasksArr[] =
{
LL_ProcessEvent, // task 0
Hal_ProcessEvent, // task 1
HCI_ProcessEvent, // task 2
#if defined ( OSAL_CBTIMER_NUM_TASKS )
OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ), // task 3
#endif
L2CAP_ProcessEvent, // task 4
GAP_ProcessEvent, // task 5
GATT_ProcessEvent, // task 6
SM_ProcessEvent, // task 7
GAPRole_ProcessEvent, // task 8
GAPBondMgr_ProcessEvent, // task 9
GATTServApp_ProcessEvent, // task 10
SimpleBLEPeripheral_ProcessEvent, // task 11
//香瓜
GUA_ProcessEvent // task 12
//香瓜
};
将香瓜任务中的事件处理函数名称。写到tasksArr中,当osal轮询到有香瓜任务的事件须要运行时,就会运行GUA_ProcessEvent函数。
3)加入香瓜任务的头文件(OSAL_SimpleBLEPeripheral.c中)
//香瓜
#include "GUA.h"
//香瓜
2、编写并加入香瓜任务
1)写一个GUA.c(存放在“……\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source\GUA”路径下)
//******************************************************************************
//name: GUA.c
//introduce: 香瓜任务
//author: 甜甜的大香瓜
//changetime: 2016.04.07
//email: 897503845@qq.com
//****************************************************************************** /*********************头文件************************/
#include "GUA.h"
#include "OSAL.h"
#include "ioCC2541.h" /*********************宏定义************************/
#define VOID (void)
#define GUA_LED_TEST_EVT_PERIOD 1000 /***************内部变量声明************************/
static uint8 GUA_TaskID; // Task ID for internal task/event processing /***************内部函数声明************************/
static void GUA_ProcessOSALMsg( osal_event_hdr_t *pMsg ); //******************************************************************************
//name: GUA_Init
//introduce: 香瓜任务的初始化
//parameter: task_id:任务的ID
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.07
//******************************************************************************
void GUA_Init( uint8 task_id )
{
GUA_TaskID = task_id; //运行香瓜任务的启动事件
osal_set_event( GUA_TaskID, GUA_START_DEVICE_EVT );
} //******************************************************************************
//name: GUA_ProcessEvent
//introduce: 香瓜任务的事件处理
//parameter: task_id:任务的ID,
// events:事件
//return: 返回运行后的事件状态
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.07
//******************************************************************************
uint16 GUA_ProcessEvent( uint8 task_id, uint16 events )
{
VOID task_id; //系统事件
if ( events & SYS_EVENT_MSG )
{
uint8 *pMsg; if ( (pMsg = osal_msg_receive( GUA_TaskID )) != NULL )
{
GUA_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); VOID osal_msg_deallocate( pMsg );
} return (events ^ SYS_EVENT_MSG);
} //香瓜任务的启动事件
if ( events & GUA_START_DEVICE_EVT )
{
osal_start_timerEx( GUA_TaskID, GUA_LED_TEST_EVT, GUA_LED_TEST_EVT_PERIOD ); return ( events ^ GUA_START_DEVICE_EVT );
} //香瓜任务的LED点灯事件
if ( events & GUA_LED_TEST_EVT )
{
//test
P1_1 = ~P1_1; //这里測试按一次长按键按键,就取反一次P1_1,方便观察P1_1相应的led
P1SEL &= ~(1 << 1); //设置为IO口
P1DIR |= (1 << 1); //设置为输出 osal_start_timerEx( GUA_TaskID, GUA_LED_TEST_EVT, GUA_LED_TEST_EVT_PERIOD );
//test return ( events ^ GUA_LED_TEST_EVT );
} return 0;
} //******************************************************************************
//name: GUA_ProcessOSALMsg
//introduce: 香瓜任务的消息处理
//parameter: pMsg:消息
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.07
//******************************************************************************
static void GUA_ProcessOSALMsg( osal_event_hdr_t *pMsg )
{
switch ( pMsg->event )
{
default:
break;
}
}
2)写一个头文件GUA.h(存放在“……\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source\GUA”路径下)
//******************************************************************************
//name: GUA.c
//introduce: 香瓜任务头文件
//author: 甜甜的大香瓜
//changetime: 2016.04.07
//email: 897503845@qq.com
//******************************************************************************
#ifndef GUA_H
#define GUA_H #ifdef __cplusplus
extern "C"
{
#endif /*********************头文件************************/
#include "bcomdef.h" /*********************宏定义************************/
#define GUA_START_DEVICE_EVT 0x0001
#define GUA_LED_TEST_EVT 0x0002 /*******************香瓜函数************************/
extern void GUA_Init( uint8 task_id );
extern uint16 GUA_ProcessEvent( uint8 task_id, uint16 events ); #ifdef __cplusplus
}
#endif #endif
3)project中加入GUA.c和GUA.h
4)在IAR设置中加入香瓜任务的源文件路径
$PROJ_DIR$\..\..\SimpleBLEPeripheral\Source\GUA
手机可能缓存了之前的代码(在更新过CC2541的代码之后,都须要清除手机端的缓存!!!),因此要清除缓存。清除缓存的方法例如以下:
方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重新启动。
八、实验结果
代码下进Smart RF之后。板子上P11引脚相应的LED2会一秒变换一次亮、灭状态。
这个LED2亮灭的測试代码即在香瓜任务中实现的,所以香瓜任务加入成功。
【BLE】CC2541之加入自己定义任务的更多相关文章
- TI BLE CC2541的I2C主模式
由于要写TM1680, 写命令跟写数据, 所以需要使用CC2541的I2C, 2541是有硬件I2C的. tm1680.c: #include "tm1680.h" //TM168 ...
- BLE CC2541 串口BootLoader 即 SBL BootLoader 资料 收集
1.[CC254X_Bootloader]SBL(串口Bootloader)使用说明 2.CC2540协议栈高速串口通信解决(UART的DMA方式) 3.[BLE]CC2541之SBL 4.[BLE] ...
- TI BLE CC2541的通讯协议.
包类型: 01命令/02数据/03应答消息 开始标志FF/本数据包长度(注意是16进制)/校验码/包ID/包类型01: 表示是命令/01表示下面要开始传输/03字符串编号/字符串长度/结束位FEFF ...
- TI BLE CC2541的SPI主模式
SPI就是用4条线来串行传输数据, 2541只能用模拟的方式用GPIO来做. //*********************************************************** ...
- 第02节-BLE协议各层的形象化理解
本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...
- ESP32:蓝牙BLE控制M3508电机
ESP32:蓝牙BLE控制M3508电机 先给各位朋友拜个年,祝大家新春快乐,事事顺利,身体健康啊! 还是熟悉的3508,内容概述: ESP32主控 蓝牙BLE通信 使用实时系统(FreeRTOS) ...
- Bluetooth Low Energy 介绍
1.简介 BLE(Bluetooth Low Energy,低功耗蓝牙)是对传统蓝牙BR/EDR技术的补充.尽管BLE和传统蓝牙都称之为蓝牙标准,且共享射频,但是,BLE是一个完全不一样的技术.BLE ...
- 蓝牙协议分析(8)_BLE安全机制之白名单
1. 前言 在万物联网的时代,安全问题将会受到非常严峻的挑战(相应地,也会获得最大的关注度),因为我们身边的每一个IOT设备,都是一个处于封印状态的天眼,随时都有被开启的危险.想想下面的场景吧: 凌晨 ...
- 超文本传输协议-HTTP/1.1
超文本传输协议-HTTP/1.1(修订版) ---译者:孙超进本协议不限流传发布.版权声明Copyright (C) The Internet Society (1999). All Rights R ...
随机推荐
- delphi ribbon使用
http://blog.csdn.net/davinciyxw/article/details/5604209 1.TextEditor(barEditItem)取文本 string editValu ...
- ASP.NET MVC中商品模块小样
在前面的几篇文章中,已经在控制台和界面实现了属性值的笛卡尔乘积,这是商品模块中的一个难点.本篇就来实现在ASP.NET MVC4下商品模块的一个小样.与本篇相关的文章包括: 1.ASP.NET MVC ...
- Python 网络请求模块 urllib 、requests
Python 给人的印象是抓取网页非常方便,提供这种生产力的,主要依靠的就是 urllib.requests这两个模块. urlib 介绍 urllib.request 提供了一个 urlopen 函 ...
- Android系统版本与API等级对应关系表
从Android官网拷过来的,方便查阅... 官网地址:https://developer.android.com/guide/topics/manifest/uses-sdk-element.htm ...
- 【ContestHunter】【弱省胡策】【Round6】
KMP/DP+树链剖分+线段树/暴力 今天考的真是……大起大落…… String QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?) 反正最后的结果就是……我当成:后面每 ...
- 前端Js框架汇总【转】
概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人心,.net co ...
- Windows server 2008 r2 如何开启Win7的Aero效果 (转)
Aero 桌面体验为开放式外观提供了类似于玻璃的窗口. 它包括与众不同的直观样式,将轻型透明的窗口外观与强大的图形高级功能结合在一起.您可以享受具有视觉冲击力的效果和外观,并可从更快地访问程序中获益. ...
- AOP AspectJ 字节码 示例 Hugo MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- PowerDesigner设置表字段唯一约束
现有一个表student,id为主键. 现打算给name添加一个唯一约束. 双击打开这个表,点击“keys"选项卡,显示有一个key_1,这是id主键. 点击”insert a row'插入 ...
- 使用Vue.js实现列表选中效果
实际项目中,我们会遇到很多类似的需求,一个列表,需要点击其中一条高亮显示.熟悉JQuery的同学说这个太简单了.可以给这个选中的element设置一个active的class.配合Css样式,让ac ...