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. Vue.js 文本行滚动

    1.前言 文本行滚动组件,效果如图 2.封装思路 封装一个组件,接收一个数组,每个数组元素就是一个段文本 组件使用httpVueLoader进行封装加载 使用css位移,配合过渡效果才展示动画 滚动逻 ...

  2. Vue.js axios

    1.安装与引入 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中,官方文档 在HTML文件中引入 <script src="https:/ ...

  3. 使用Maps SDK添加本地slpk

    SceneView m_sceneView; public void LoadSceneLayerFromSLPK(SceneView sceneView, string slpkPath) { if ...

  4. 使用Tailwind CSS的几个小Tips

    前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别.它的工作原理是扫描所有 HTML 文件.JavaScript 文件以及任何模板中的 CSS 类名,然 ...

  5. GraphRAG+文档结构:打造高性能实体溯源方案

    作者:陈梓康 众所周知,GraphRAG将文档内容抽取为知识图谱三元组后,实际上仅保留了关联性知识信息,因此不可避免地会丢失原文的一些内容细节.在对数据完整度要求严格的业务场景,如金融.医疗.保险等行 ...

  6. 【数据结构】【直接排序法】Java代码

    public class 直接排序 { /** * 直接排序法 仅排序1轮 * @param arr 数组 * @param ji 基准索引,填写几,就以谁为基准进行一次划分 */ public st ...

  7. ssh远程执行命令方法和Shell脚本实例

    写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 ser ...

  8. 【高清视频方案分享】12G-SDI与CameraLink输入输出,基于RK3588J+FPGA工业平台

    CameraLink协议介绍 CameraLink是一种用于机器视觉和工业成像应用的标准化数字接口协议.它由自动化成像协会(Automated Imaging Association)开发,旨在解决传 ...

  9. Ubuntu22.04 LTS 安装nvidia显卡驱动

    准备跑老师给定的Github上的多模态源码,但是用了这么久ubuntu还没有尝试过安装nvidia驱动,好在也是一次成功,于是记录下来. 借鉴的是https://blog.csdn.net/Eric_ ...

  10. Qt编写手机端视频播放器/推流工具/Onvif工具

    一.视频播放器 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6).ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6).vlc内核(v ...