OSAL操作系统最多可以支持16个任务,由任务功耗管理PwrMgr_task_state变量可知,而OSAL每个任务最多只能支持16个事件处理,理论上最大可以执行256个事件处理。

对于一些运算能力不强,内存空间不大的处理器最适合不过了。

OSAL实际上不是一个真正意义上的操作系统,在加上它最多只能处理16个任务,所以OSAL没有像其他操作系统一样有复杂的任务调度算法,每个任务都是有序轮流执行。OSAL的任务管理代码主要在OSAL.c中。

1. CC254x的软件基于OSAL架构

2. OSAL并非一个真的操作系统, 而只是让软件设立一个事件的执行方法(setup excution of events)

3. 每一个子系统都在OSAL的一个任务(task)执行并由一个独立的task id.

4. task id越小, 优先级别越高

5. SimpleBLEPeripheral项目有12个任务: Link Layer, HAL, OSAL Callback Timer, L2CAP, GATT, GAP, SM, Peripheral Role Profile, GAP Bond Manager, GATT server, SimpleBLEPeripheral.

6. 每个任务由两个函数(function): 初始化, 比如SimpleBLEPeripheral_Init(), 跟事件处理, 比如SimpleBLEPeripheral_ProcessEvent();

7. 每个应用程序都要包含一个void osalInitTask(void)函数

8. 这个函数会调用每个任务的初始化函数来初始化任务.

9. 每个应用程序都要使用一个叫tasksArr的数组, 包含每个任务处理函数的指针.

10. 数组的顺序必须跟task ID的顺序一致.

11. 应用程序还应该产生一个名为tasksEvents的全局变量, 用uint16来对应每一个发生的task event, 对应的位置1标示发生了特定的event

12. 一个OSAL event事件是一个将来执行的task的标志

13. 每一个OSAL任务可以定义多达15个event

14. 两个方法设置event:

a: osal_set_event(), 立即设置一个event

b: osal_start_timeEX(), 安排若干时间(以ms为单位)后发生一个event, 可通过osal_stop_timeEX来取消.

15.看下面的图就明白了, 每个task有15个标志位去标志每一个event是否发生.

主循环:

1. 当osal_system_start被执行后, OSAL会进入主循环

2. 在循环中, 会不断检查taskEvents数组是否有位被置1, 如果有不同的task被发现有event需要处理, 则先处理task id优先级高的.

3. OSAL会用event处理指针的方法去处理对应的event

4. 当event处理方法执行完, 应该讲对应的event标示位置0, 不然这个方法会被重复执行.

5. 如果没有任务需要执行, OSAL会进入省电模式(power saving mode), 但是内存依然有电, 而且计时器也在持续运行.

6. 当中断发生时, 或者OSAL计数器定义的倒数时间到了, 处理器会被唤醒.

消息处理:

1. OSAL提供了消息处理机制来让不同的子系统之间传递数据.

2. 消息可以是任意类型数据, 任意长度.

3. 发送消息的程序是:

a: 用osal_msg_allocate()分配内存

b: 将数据拷贝进内存

c: 使用osal_msg_send()指定目标任务

4. 任务利用SYS_EVENT_MSG标示来发现待处理的消息

5. simpleBLEPeripheral_ProcessOSALMsg()函数来处理消息.

6. 收到消息后要用osal_msg_deallocate()来释放内存.

内存管理

1. OSAL API使用内存管理的函数是: osal_mem_alloc与osal_mem_free

2. 堆的尺寸在IAR的compiler里面设置

3. 如果堆尺寸设置得太高, CC2540可能会内存泄露.

4. 确认编译完成后, map文件不能超过8KB限制.

文件与关键的API

1. 关键文件包括: osal.c, osal.h

2. 关键api是:

osal_init_system();//初始化

osal_start_system();//被执行后, OSAL会进入主循环

osal_set_event();//立即设置一个event

osal_start_timeEX();//安排若干时间(以ms为单位)后发生一个event

osal_stop_timeEX();//可通过osal_stop_timeEX来取消.

osal_msg_allocate();//分配内存

osal_msg_send();//指定目标任务

osal_msg_deallocate();//释放内存

osal_mem_alloc();//内存管理

osal_mem_free)();//内存管理

3. OsalInitTask();//是用来设置任务ID的

硬件抽象层(HAL)

硬件抽象层包括对ADC, UART, SPI, Flash, Timer, Key, LCD驱动的接口

OSAL架构的更多相关文章

  1. OSAL

    1. CC254x的软件基于OSAL架构 2. OSAL并非一个真的操作系统, 而只是让软件设立一个事件的执行方法(setup excution of events) 3. 每一个子系统都在OSAL的 ...

  2. [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

    蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...

  3. [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

    说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...

  4. [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)

    1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用 ...

  5. 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的基本架构和工作机理

    [Zigbee技术入门教程-02]一图读懂ZStack协议栈的基本架构和工作机理 广东职业技术学院  欧浩源  ohy3686@foxmail.com Z-Stack协议栈是一个基于任务轮询方式的操作 ...

  6. 浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)

    转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到 ...

  7. 蓝牙nrf52832的架构和开发(转载)

    相比TI的CC254X.DIALOG的DA1458X,nordic推出的nrf51822和nrf52832在架构和开发商都有自己独特的地方.这几颗产品都是蓝牙低功耗芯片.DA1458X使用OTP硬件架 ...

  8. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  9. node服务的监控预警系统架构

    需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...

  10. 如何一步一步用DDD设计一个电商网站(二)—— 项目架构

    阅读目录 前言 六边形架构 终于开始建项目了 DDD中的3个臭皮匠 CQRS(Command Query Responsibility Segregation) 结语 一.前言 上一篇我们讲了DDD的 ...

随机推荐

  1. 认识Redis集群

    概述 Redis单实例的架构,从最开始的一主N从,到读写分离,再到Sentinel哨兵机制,单实例的Redis缓存足以应对大多数的使用场景,也能实现主从故障迁移. 但是,在某些场景下,单实例存Redi ...

  2. KTL 用C++14写公式的K线工具 - 0.9.3版

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...

  3. 鸿蒙(HarmonyOS)原生AI能力之文本识别

    鸿蒙(HarmonyOS)原生AI能力之文本识别 原生智能介绍 在之前开发中,很多场景我们是通过调用云端的智能能力进行开发.例如文本识别.人脸识别等. 原生即指将一些能力直接集成在本地鸿蒙系统中,通过 ...

  4. 黑苹果(Hackintosh) - 问题,修改CPU数量和内存数量后,系统重启失败

    1. 问题复现 安装完黑苹果后,内存默认的 1个处理器2个核心.2G内存,发现不够用. 于是,修改了 VMware 对此系统的 硬件配置 内存: 2G -> 8G 处理器:1个处理器 -> ...

  5. 全网最详细的 tcpdump 使用指南

    https://www.cnblogs.com/wongbingming/p/13212306.html 今天要给大家介绍的一个 Unix 下的一个 网络数据采集分析工具,也就是我们常说的抓包工具. ...

  6. @EnableWebMvc 注解会让Swagger无效访问的问题

    在工作中,通过Swagger2对项目的controller进行配置,以便于用户测试restful服务接口提高开发效率. 但是今天却出现了一个让我匪夷所思的问题就是在配置类里面加上@EnableWebM ...

  7. 使用Spring提供的BeanUtils.copyProperties()方法报错:Could not copy property 'xxx' from source to target

    使用Spring提供的BeanUtils.copyProperties()方法报错:Could not copy property 'xxx' from source to target; neste ...

  8. Qt音视频开发16-mpv通用接口

    一.前言 前面几篇文章,依次讲了解码播放.录像存储.读取和控制.事件订阅等,其实这些功能的实现都离不开封装的通用的接口,最开始本人去调用一些设置的时候,发现多参数的不好实现,原来需要用mpv_node ...

  9. .NET 9 new features-分布式追踪支持、HTTP/3 改进以及更好的容器镜像支持

    .NET 9 针对云原生开发进行了显著优化,重点改进了分布式追踪.HTTP/3 支持和容器镜像优化等方面. 这些特性极大地提升了 .NET 在现代云原生应用中的适配性与开发效率. 1. 设计原理 1. ...

  10. 如何快速在本地运行你vue打包的的dist文件

    要在本机启动运行前端提供的dist包,需要先安装一个HTTP服务器,例如Apache,Nginx,phpstudy.这里以使用Node.js的http-server为例进行说明 首先,确保已经安装了N ...