美文网首页
cc2541中的osal的学习(1)——初探

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

作者: MrRed | 来源:发表于2017-10-24 19:01 被阅读0次

    参考: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中事件,有两个为保留事件。

    image.png

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

    启动事件

    启动事件有两种方法

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

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

    image.png

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

    相关文章

      网友评论

          本文标题:cc2541中的osal的学习(1)——初探

          本文链接:https://www.haomeiwen.com/subject/szhzuxtx.html