参考: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中事件,有两个为保留事件。
第二步:
添加处理函数,像上面的uint16 SimpleBLETest_ProcessEvent( uint8 task_id, uint16 events )
那样。
启动事件
启动事件有两种方法
第一种是
在初始化事件时,使用osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );
来启动事件。
第二种是
实用系统的软件定时器来启动事件(下图为引用的)从图中我们可以看出,这个函数是在处理事件的时候使用的。(这个还没接触到)
2017-10-24日更新
在蓝牙广播程序中找到了
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
的使用。周期性执行某个事件。