ST17H66的SDK是基于OSAL系统运行,在开发过程中,不需要对OSAL系统做过多深入了解,只需要知道运行机制和相关API的使用即可,下面介绍一下OSAL系统。

1、OSAL常用术语

1)资源(Resource

任何任务所占用的实体都可以称为资源,如一个变量、数组、结构体等。

2)共享资源(Shared Resource)

至少可以被两个任务使用的资源称为共享资源,为了防止共享资源被破环,每个任务在操作共享资源时,必须保证时独占该资源。

3)任务(Task)

一个任务,又称为一个线程,是一个简单的程序的执行过程,在任务执行过程中,可以认为CPU完全属于该任务。在任务设计时,需要将问题尽可能地分为多个任务,每个任务独立完成某种功能,同时被赋予一定的优先级,拥有自己的CPU寄存器和堆栈空间。

4)多任务运行(Muti-task Running)

实际上,一个时间点只有一个任务在运行,但是CUP可以使用任务调度策略将多个任务进行调度,每个任务执行特定的时间,时间片到了以后,就进行任务切换,由于每个任务执行时间很短,例如:10ms,因此任务切换很频繁,这就造成了多任务同事运行的“假象”。

5)消息队列(Message Queue)

消息队列用于任务间传递信息,通常包含任务间同步的信息。通过内核提供的服务、任务或者中断服务程序将一条消息放入消息队列,然后,其他任务可以使用内核提供的服务从消息队列中获取属于自己的消息。为了降低传递消息的开支,通常传递指向消息的指针。

osal主要提供如下功能:

  1. 任务注册、初始化和启动;
  2. 任务间的同步、互斥;
  3. 中断处理;
  4. 存储器分配和管理;
  5. 提供定时器功能。

2、OSAL运行机制

在基于我们提供的SDK开发过程中,可以把一个应用程序对象看作为一个任务,因此需要一个机制实现任务切换、同步和互斥,这就是OSAL的根源。在SDK中,OSAL负责调度各个任务的运行,如果有事件发生了,则会调用相应的事件处理函数进行处理。

OSAL的工作原理:通过tasksEvents指针访问是事件表里面的每一项,如果有事件发生,则查找到事件对应的处理函数进行处理,处理完后继续访问事件表,查看是否有事件发生,循环往复。

某种意义上说OSAL是一种基于事件驱动的轮询系统,事件驱动是每个事件对应的处理函数,轮询则是不断的查询是否有事件发生。

3、OASL添加新任务

在使用我们提供的SDK开发时,如何在应用程序中添加一个新任务。下面结合示例工程simpleBLEPeripheral讲解,打开工程里OSAL_SimpleBLEPeripheral.c文件可以找到数组tasksArr[]和osalInitTasks()。taskArr[]数组里存放了所有任务的事件处理函数;osalInitTasks()是OSAL任务初始化函数,里面包含了所有任务的初始化,并自动给每个任务分配一个任务ID(taskID)。

 

因此,要添加一个新任务,只需要编写两个函数:

  1. 新任务的任务初始化函数;
  2. 新任务的事件处理函数;

需要注意两点:

  • taskArr[]数组里各事件处理函数的排列顺序要与osalInitTasks()函数中调用任务初始化函数的顺序一致,只有这样才能保证每个任务的事件处理函数能够接受到正确的任务ID;
  • 为了保存osalInitTasks()函数中OSAL所分配的任务ID,需要给每个任务定义一个全局变量来保存这个任务ID。例如在SimpleBLEPeripheral.c中定义了一个全局变量simpleBLEPeripheral_TaskID,并且在SimpleBLEPeripheral_Init函数中对其赋值

4、 OSAL应用编程接口

在阅读本节时,用户只需要了解OSAL提供了哪些API即可,暂时不需要关注该函数的具体实现,很多API使用几次后,自然就熟悉了。

总体来说,OSAL提供了8个方面的API。

4.1 消息管理API

消息管理有关的API主要用于处理任务间消息的交换,主要包含为任务分配消息缓存、释放消息缓存、接收消息和发送消息等函数。

osal_msg_allocate()

函数原型:uint8 *osal_msg_allocate(uint16 len)

功能描述:为消息分配缓存空间。

osal_msg_deallocate()

函数原型:uint8 *osal_msg_deallocate(uint8 *msg_ptr)

功能描述:释放消息的缓存空间。

osal_msg_send()

函数原型:uint8 osal_msg_send(uint8 destination_task,uint8 *msg_ptr)

功能描述:一个任务发送消息到消息队列。

osal_msg_receive()

函数原型:uint8 *osal_msg_receive(uint8 task_id)

功能描述:一个任务从消息队列接收属于自己的消息。

4.2 任务同步API

任务同步API主要用于任务间的同步,允许一个任务等待某个时间的阿发生。

osal_set_event()

函数原型:uint8 osal_set_event(uint8 task_id, uint16 event_flag)

函数功能:运行一个任务设置某个事件。

4.3 时间管理API

主要用于开启和关闭定时器,定时时间一般为毫秒级定时器,使用该API用户不用关心底层定时器是如何初始化及工作的,只需要调用即可。

osal_start_timerEx()

函数原型:uint8 osal_start_timerEx(uint8 task_id, uint16 event_id, uint16 timeout_value)

函数功能:设置一个定时器,定时时间到后,相应任务的事件被设置。

osal_stop_timerEx()

函数原型:uint8 osal_stop_timerEx(uint8 task_id, uint16 event_id)

函数功能:停止已经启动的定时器。

4.4 任务管理API

主要功能是对OSAL进行初始化和启动。

osal_init_system()

函数原型:uint8 osal_init_system(void)

函数功能:初始化OSAL,该函数是第一个被调用的OSAL函数。

osal_start_system()

函数原型:uint8 osal_start_system(void)

函数功能:该函数包含一个无线循环,它将查询所有的任务事件,如果有事件发生则调用相应的事件处理函数,处理完该事件后,返回主循环继续检测是否有其他事件发生。

4.5 非易失性闪存管理API

主要是添加了对非易失性闪存的管理函数,一般指的是系统的Flash存储器,每个NV条目分配一个唯一ID号。

osal_nv_read()

函数原型:byte osal_nv_read(uint16 id,uint16 offset,uint16 len void *buf)

函数功能:从NV条目中读取数据,可以读取整个条目的数据,也可以读取部分数据。

osal_nv_write()

函数原型:byte osal_nv_write(uint16 id,uint16 offset,uint16 len void *buf)

函数功能:写数据到NV条目。

ST17H66 低功耗蓝牙SOC开发(3)—— OSAL系统简介相关推荐

  1. ST17H66 低功耗蓝牙SOC开发(1)—— SDK介绍

    目录 1.资料获取 2.开发环境 3.ST17H66开发SDK获取 4.SDK介绍 4.1 components 4.2 example 4.3 lib 4.4 misc 1.资料获取 伦茨17Hxx ...

  2. ST17H66低功耗蓝牙SOC开发(8)—— proprietary_rf工程讲解

    ST17H66 Proprietary_Rf 工程说明 A. Smart_Master 发送端 数据包结构解析 类型 Adv_Type PDU_LEN MAC_Host Adv_Segment0 Ad ...

  3. ST17H66低功耗蓝牙SOC开发(7)—— simpleBleCentral工程讲解(下)

    2.连接过程 2.1 初始化 对主机各个参数进行初始化后,注册simpleBLERoleCB回调,simpleBLERoleCB里面的simpleBLECentralEventCB是设备的事件回调,初 ...

  4. Android低功耗蓝牙(BLE)开发(二)

    在上一篇文章Android低功耗蓝牙(BLE)开发(一)中我们了解了BLE的相关概念,这里我们来实际用代码演示安卓进行BLE连接和通讯的功能.本文代码基于Android5.0以上(API 21) 1. ...

  5. 微信小程序低功耗蓝牙(BLE)开发总结

    1.准备 低功耗蓝牙模块:(链接)蓝牙模块购买通道 相关参数数据(UUID表): 需要知道服务ID(serviceID) ,响应特征值 ID(notify characteristic UUID),写 ...

  6. 经典蓝牙与低功耗蓝牙BLE开发基础知识:服务、特征、属性、UUID

    经典蓝牙和低功耗蓝牙BLE的区别 蓝牙大致被认为是1.0 2.0 3.0 4.0版本,不过现在已经不再用版本号区分蓝牙了,蓝牙1.0~3.0都是经典蓝牙,在塞班系统就已经开始使用了.而蓝牙4.0开始就 ...

  7. nRF52832低功耗蓝牙应用开发之入门教程

    nRF52382是挪威的nordic北欧公司推出的一款低功耗蓝牙芯片,该芯片集成多种协议栈,包括蓝牙5.0..2.4G专有协议栈,支持蓝牙mesh组网,空中波特率达到2Mbps,M4内核,主频达到64 ...

  8. 未来市场主流——低功耗蓝牙胎压监测系统

    近日,TPMS行业大佬森萨塔向外公布了则消息,透露他们开发了一款低功耗蓝牙 (BLE) 胎压监测系统 (TPMS),以迎合轮胎智能化.物联化的市场趋势. 蓝牙胎压 随着车辆变得更加互联化.电动化和智能 ...

  9. 【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

    目录 目录 前言 一.相关概念介绍 二.实战开发 三.项目演示 四.Demo案例源码地址 五.更新记录 1.2020/12/29 :修改 setupService()中错误 2.2021/05/14 ...

最新文章

  1. Long Read Mapping at Scale: Algorithms and Applications
  2. 使用object detection训练并识别自己的模型
  3. 合并多个word的代码_快速合并多个word文档内容,别再复制粘贴了!
  4. JavaFX 的 UI 控件集 ControlsFX
  5. halcon/c++接口基础 之内存管理
  6. JMS学习十一 ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer)
  7. vc编译 matlab,精通VC与MATLAB联合编程——编译器的使用
  8. 从“做什么”到“怎么做”,说说一只蚊子
  9. Go 基本语法之变量遮蔽问题
  10. 史玉柱:我是怎么做游戏策划的
  11. matlab 万年历,转 计算万年历的Matlab程序
  12. 2020年浙江省土地利用数据(矢量)
  13. 【嵌入式技术】Atmega128串口详解
  14. eclipse配置Tomcat9
  15. 怎么增加淘宝店铺标签权重
  16. Missing radix parameter radix
  17. 北京市金融工作局:大数据重塑未来金融监管方式
  18. GoldenGate—日常管理
  19. Leaflet修改地图中心点定位
  20. Layabox 实现画 刚体线

热门文章

  1. Win7搜索之体验!
  2. U-BOOT 下载 GitHub
  3. 不服来试试,Excel中被吹上天的Ctrl+E,到底有多厉害?
  4. NFC Forum发布NFC数据交换格式(NDEF)规范
  5. mysql一对多如何设计_数据库在一对一、一对多、多对多怎么设计表关系
  6. WordSequence API
  7. 字符串大小写转换(C/C++实现)
  8. PromQL 直方图 跟踪请求的延迟或响应大小 99%的请求是在多少延迟下完成的?
  9. Python每日一练——第10天:经典问题猴子吃桃
  10. 哈佛结构和冯诺依曼结构?STM32属于哈佛结构还是冯诺依曼结构?