OSAL架构
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架构的更多相关文章
- OSAL
1. CC254x的软件基于OSAL架构 2. OSAL并非一个真的操作系统, 而只是让软件设立一个事件的执行方法(setup excution of events) 3. 每一个子系统都在OSAL的 ...
- [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)
蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...
- [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)
说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...
- [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)
1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用 ...
- 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的基本架构和工作机理
[Zigbee技术入门教程-02]一图读懂ZStack协议栈的基本架构和工作机理 广东职业技术学院 欧浩源 ohy3686@foxmail.com Z-Stack协议栈是一个基于任务轮询方式的操作 ...
- 浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)
转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到 ...
- 蓝牙nrf52832的架构和开发(转载)
相比TI的CC254X.DIALOG的DA1458X,nordic推出的nrf51822和nrf52832在架构和开发商都有自己独特的地方.这几颗产品都是蓝牙低功耗芯片.DA1458X使用OTP硬件架 ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- node服务的监控预警系统架构
需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...
- 如何一步一步用DDD设计一个电商网站(二)—— 项目架构
阅读目录 前言 六边形架构 终于开始建项目了 DDD中的3个臭皮匠 CQRS(Command Query Responsibility Segregation) 结语 一.前言 上一篇我们讲了DDD的 ...
随机推荐
- 认识Redis集群
概述 Redis单实例的架构,从最开始的一主N从,到读写分离,再到Sentinel哨兵机制,单实例的Redis缓存足以应对大多数的使用场景,也能实现主从故障迁移. 但是,在某些场景下,单实例存Redi ...
- KTL 用C++14写公式的K线工具 - 0.9.3版
K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...
- 鸿蒙(HarmonyOS)原生AI能力之文本识别
鸿蒙(HarmonyOS)原生AI能力之文本识别 原生智能介绍 在之前开发中,很多场景我们是通过调用云端的智能能力进行开发.例如文本识别.人脸识别等. 原生即指将一些能力直接集成在本地鸿蒙系统中,通过 ...
- 黑苹果(Hackintosh) - 问题,修改CPU数量和内存数量后,系统重启失败
1. 问题复现 安装完黑苹果后,内存默认的 1个处理器2个核心.2G内存,发现不够用. 于是,修改了 VMware 对此系统的 硬件配置 内存: 2G -> 8G 处理器:1个处理器 -> ...
- 全网最详细的 tcpdump 使用指南
https://www.cnblogs.com/wongbingming/p/13212306.html 今天要给大家介绍的一个 Unix 下的一个 网络数据采集分析工具,也就是我们常说的抓包工具. ...
- @EnableWebMvc 注解会让Swagger无效访问的问题
在工作中,通过Swagger2对项目的controller进行配置,以便于用户测试restful服务接口提高开发效率. 但是今天却出现了一个让我匪夷所思的问题就是在配置类里面加上@EnableWebM ...
- 使用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 ...
- Qt音视频开发16-mpv通用接口
一.前言 前面几篇文章,依次讲了解码播放.录像存储.读取和控制.事件订阅等,其实这些功能的实现都离不开封装的通用的接口,最开始本人去调用一些设置的时候,发现多参数的不好实现,原来需要用mpv_node ...
- .NET 9 new features-分布式追踪支持、HTTP/3 改进以及更好的容器镜像支持
.NET 9 针对云原生开发进行了显著优化,重点改进了分布式追踪.HTTP/3 支持和容器镜像优化等方面. 这些特性极大地提升了 .NET 在现代云原生应用中的适配性与开发效率. 1. 设计原理 1. ...
- 如何快速在本地运行你vue打包的的dist文件
要在本机启动运行前端提供的dist包,需要先安装一个HTTP服务器,例如Apache,Nginx,phpstudy.这里以使用Node.js的http-server为例进行说明 首先,确保已经安装了N ...