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的 ...
随机推荐
- Vue.js 文本行滚动
1.前言 文本行滚动组件,效果如图 2.封装思路 封装一个组件,接收一个数组,每个数组元素就是一个段文本 组件使用httpVueLoader进行封装加载 使用css位移,配合过渡效果才展示动画 滚动逻 ...
- Vue.js axios
1.安装与引入 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中,官方文档 在HTML文件中引入 <script src="https:/ ...
- 使用Maps SDK添加本地slpk
SceneView m_sceneView; public void LoadSceneLayerFromSLPK(SceneView sceneView, string slpkPath) { if ...
- 使用Tailwind CSS的几个小Tips
前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别.它的工作原理是扫描所有 HTML 文件.JavaScript 文件以及任何模板中的 CSS 类名,然 ...
- GraphRAG+文档结构:打造高性能实体溯源方案
作者:陈梓康 众所周知,GraphRAG将文档内容抽取为知识图谱三元组后,实际上仅保留了关联性知识信息,因此不可避免地会丢失原文的一些内容细节.在对数据完整度要求严格的业务场景,如金融.医疗.保险等行 ...
- 【数据结构】【直接排序法】Java代码
public class 直接排序 { /** * 直接排序法 仅排序1轮 * @param arr 数组 * @param ji 基准索引,填写几,就以谁为基准进行一次划分 */ public st ...
- ssh远程执行命令方法和Shell脚本实例
写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 ser ...
- 【高清视频方案分享】12G-SDI与CameraLink输入输出,基于RK3588J+FPGA工业平台
CameraLink协议介绍 CameraLink是一种用于机器视觉和工业成像应用的标准化数字接口协议.它由自动化成像协会(Automated Imaging Association)开发,旨在解决传 ...
- Ubuntu22.04 LTS 安装nvidia显卡驱动
准备跑老师给定的Github上的多模态源码,但是用了这么久ubuntu还没有尝试过安装nvidia驱动,好在也是一次成功,于是记录下来. 借鉴的是https://blog.csdn.net/Eric_ ...
- Qt编写手机端视频播放器/推流工具/Onvif工具
一.视频播放器 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6).ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6).vlc内核(v ...