目录
一、前言
从本文开始,我将开设关于BLE4.0开发的专栏,分享一下自己的开发经验。
开发所使用的芯片主要为:伦茨ST17H66
二、OSAL任务
这个系统不是很常见,他不同于我们开发STM32的FreeRTOS系统,OSAL系统是一种轮询式操作系统,他在程序中一直去查询各个任务有没有需要处理的事件,去发现并执行。
伦茨开发包:【免费】伦茨ST17H66开发资源包资源-CSDN文库
先熟悉一下OSAL系统的流程,打开开发包里的simpleBlePeripheral工程。
我们常说的蓝牙开发,无非就是主机和从机开发,因此我们经常需要在从机例程中完善自己的程序。
先编译一遍,确保不会报错。
在main.c函数中经过一系列的基础配置后,启动app_main函数。右键去找到函数定义。
经过两个初始配置的语句后,进入OSAL系统中,再次F12去找函数定义。
提示找不到,没关系,这是伦茨将其封装起来了。我们看不见而已。不过大家可以参考其他的芯片学习,比如CC2540,同样使用OSAL系统。
我们进入OSAL_SimpleBLEPeripheral.c文件中,找到osalInitTasks函数,这就是OSAL系统轮询的任务列表,每个任务都需要一个唯一的Task。这个函数在osal_init_system函数中调用,osal_start_system函数中正是在轮询这些任务。
一个任务对于一个事件,在osalInitTasks函数的上方,以同样的顺序对应着每个人的事件处理函数。
我们找到最后一个事件,查看他的定义。
不难看出,通过events参数可以向事件传递出,我要触发的事件是什么?events即我们所说的事件ID。
那么根据类型可以看出,事件ID共有16位。由用户在任务的头文件中定义。
位数 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
其中,最高位为1是0x8000,这代表着系统事件,即SYS_EVENT_MSG。
/*********************************************************************
Global System Events
*/
#define SYS_EVENT_MSG 0x8000 // A message is waiting event
三、OSAL设置事件
我们已经知道任务id和事件id,那么如何设置事件?
使用osal_set_event( TaskID, EventsID )函数即可设置事件。