【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

联系方式:[email protected]

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667

甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?

spm=2013.1.1000126.d21.hd2o8i

四、实验前提

1、在进行本文步骤前。请先阅读下面博文:

暂无

2、在进行本文步骤前,请先实现下面博文:

暂无

五、基础知识

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:        [email protected]
//******************************************************************************

/*********************头文件************************/
#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:            [email protected]
//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:            [email protected]
//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:            [email protected]
//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:        [email protected]
//******************************************************************************
#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亮灭的測试代码即在香瓜任务中实现的,所以香瓜任务加入成功。

时间: 2024-10-20 06:09:31

【BLE】CC2541之加入自己定义任务的相关文章

TI BLE CC2541的I2C主模式

由于要写TM1680, 写命令跟写数据, 所以需要使用CC2541的I2C, 2541是有硬件I2C的. tm1680.c: #include "tm1680.h" //TM1680是先发送配置, 然后发送数据.void masterConfig(void);void masterSendData(void); void sendTest(void){    //uint8 buffer[24]={0x0f,0x0e};    //HalI2CWrite(2, buffer);   

TI BLE CC2541的SPI主模式

SPI就是用4条线来串行传输数据, 2541只能用模拟的方式用GPIO来做. //******************************************************************************//                      INCLUDES//******************************************************************************#include <ioCC2541.

Bluetooth Low Energy 介绍

1.简介 BLE(Bluetooth Low Energy,低功耗蓝牙)是对传统蓝牙BR/EDR技术的补充.尽管BLE和传统蓝牙都称之为蓝牙标准,且共享射频,但是,BLE是一个完全不一样的技术.BLE不具备和传统蓝牙BR/EDR的兼容性.它是专为小数据率.离散传输的应用而设计的.通信距离上也有改变,传统蓝牙的传输距离几十米到几百米不等,BLE则规定为100米. 2.低功耗蓝牙(BLE) 低功耗蓝牙分为单模(Bluetooth Smart)和双模(Bluetooth Smart Ready)两种设

以蓝牙为背景剖析无线通信原理以及协议栈

前言: 基于传统点对点的架构,想要把家庭电脑和键盘.鼠标.耳机.麦克风.以及移动电话等等连接起来,可能还要考虑增加USB插口. 有没有一种通用的不需要用户干预的简便方法把各种电子设备连接在一起,而又不至于被线缆淹没呢?在WiFi之外,大家已经比较熟悉的"蓝牙"正是这样一种连接技术,它被设计为面向个人和家庭的无线式自动连接,其三大核心特点便是无线.低成本和自动化. 图1 蓝牙的无线连接模式 可是"蓝牙"是怎么实现的上述所说的"连接"的呢? 下面我们

【BLE】CC2541之自己定义长短按键

本篇博文最后改动时间:2017年01月06日,11:06. 一.简单介绍 本文以SimpleBLEPeripheral为例,介绍怎样将普通IO口(P12)自己定义为长短按键,实现按键3S以内松开为短按键.3S之后松开为长按键. 注:本文加入按键方法不与协议栈的按键相冲突,协议栈自带的按键仍可正常使用. 二.实验平台 协议栈版本号:BLE-CC254x-1.4.0 编译软件:IAR 8.20.2 硬件平台:smart RF开发板(主芯片CC2541) 三.版权声明 博主:甜甜的大香瓜 声明:喝水不

蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的Framework包括Android Framework.Linux QT.Windows MFC.应用框架抽象并封装实现了一般应用场景的需求,完成应用开发的80%,剩下的20%则以回调(callback)和接口的方式供应用开发人员调用以完成具体的需求. 一般Framework完成的工作包括:任务分

【BLE】CC2541之indicate

本篇博文最后修改时间:2016年09月12日,03:34. 一.简介 本篇以SimpleBLEPeripheral为例,讲述如何在工程中使用indicate指示. 二.实验平台 协议栈版本:BLE-CC254x-1.4.0 编译软件:IAR 8.20.2 硬件平台:Smart RF开发板 三.版权声明 博主:甜甜的大香瓜 声明:喝水不忘挖井人,转载请注明出处. 原文地址:http://blog.csdn.net/feilusia 联系方式:[email protected] 香瓜BLE之CC25

【BLE】CC2541之PWM控制直流电机

本篇博文最后修改时间:2016年4月14日,18:24. 一.简介 本文介绍如何在SimpleBLEPeripheral工程中,使用PWM控制直流电机. 二.实验平台 协议栈版本:BLE-CC254x-1.4.0 编译软件:IAR 8.20.2 硬件平台:Smart RF(主芯片CC2541) 三.版权声明 博主:甜甜的大香瓜 声明:喝水不忘挖井人,转载请注明出处. 原文地址:http://blog.csdn.net/feilusia 联系方式:[email protected] 技术交流QQ群

【BLE】CC2541之主机端读取特征值

本篇博文最后改动时间:2017年01月06日,11:06. 一.简单介绍 本文介绍怎样在SimpleBLECentralproject中,读取SimpleBLEPeripheralproject中的特征值char1的数据. (注:SimpleBLECentralproject默认就可以通过UP键进行读.写特征值,而本文採用的方法是连接上从机后自己主动读取特征值数据) 二.实验平台 协议栈版本号:BLE-CC254x-1.4.0 编译软件:IAR 8.20.2 硬件平台:两块Smart RF(主芯