cc2541中的osal的学习(1)——初探

参考:http://www.cnblogs.com/suozhang/p/6722075.html

osal全称为operating system abstraction layer。

学习主要通过阅读源码以及参考了上面这篇博客。本篇笔记主要是为了理清整个系统的运行状态是什么样的。

程序运行开始,首先执行的肯定是main函数。main函数位于SimpleBLETest_Main.c中。main函数,首先进行各种初始化,然后通过函数osal_start_system();进入系统中。

需要注意的是,在开始系统前进行初始化的过程中,有一个osal_init_system();;然后会进行任务初始化osalInitTasks();;其中对各种任务进行了初始化,包括我们的应用任务。例子中为SimpleBLETest_Init(taskID);。在这个初始化函数中,对我们的任务进行了初始化。代码如下:

void SimpleBLETest_Init( uint8 task_id )
{ //保存任务id到全局变量   
  SimpleBLETest_TaskID = task_id;       
  HalLcdWriteString ( "SimpleBLETest", HAL_LCD_LINE_1);
  // Setup a delayed profile startup  
  /*
  设置一个任务, 这么做的目的是按照多任务处理的方法来做
  SimpleBLETest_ProcessEvent 就是处理 SBP_START_DEVICE_EVT
  */
  osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );
}

osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );这个设置了这个任务的状态。其中的SBP_START_DEVICE_EVT是我们自己定义的,没建立一个任务都要定义这个。

初始化了这个任务后,我们会对任务进行处理。用到函数uint16 SimpleBLETest_ProcessEvent( uint8 task_id, uint16 events )这个函数的代码如下:

uint16 SimpleBLETest_ProcessEvent( uint8 task_id, uint16 events )
{

  VOID task_id; // OSAL required parameter that isn't used in this function

  // SYS_EVENT_MSG 这是系统事件比如按键事件蓝牙读写事件处理,都会置这个事件
  if ( events & SYS_EVENT_MSG )
  {
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }

  // 这个是我们应用程序自定义的事件,SBP_START_DEVICE_EVT 的值被定义为 0x0001, 
  // 实际上我们可以定义 16个事件, 第一的时候是以位来定义的
  // 
  if ( events & SBP_START_DEVICE_EVT )
  {
    HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);      // 点亮led1               

    // 返回这个, 告诉osal,这个实践你已经处理了
    return ( events ^ SBP_START_DEVICE_EVT );   
  }

  // Discard unknown events
  return 0;
}

这个函数先判断事件的属性,然后,找到正确的属性后,执行if命令里的操作,最后告知系统自己已经处理过这个数据了。

从参考的博客中,我们知道,我们要新建一个事件有两种方式。

首先要添加一个事件(也就是添加宏定义):
最多可以添加14中事件,有两个为保留事件。

cc2541中的osal的学习(1)——初探_第1张图片
image.png

第二步:
添加处理函数,像上面的uint16 SimpleBLETest_ProcessEvent( uint8 task_id, uint16 events )那样。

启动事件

启动事件有两种方法

第一种是
在初始化事件时,使用osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );来启动事件。

第二种是
实用系统的软件定时器来启动事件(下图为引用的)从图中我们可以看出,这个函数是在处理事件的时候使用的。(这个还没接触到)

cc2541中的osal的学习(1)——初探_第2张图片
image.png

2017-10-24日更新
在蓝牙广播程序中找到了
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );的使用。周期性执行某个事件。

你可能感兴趣的:(cc2541中的osal的学习(1)——初探)