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. 原生JS点名器,随机数

    因为工作内容的需要自己琢磨了一个随机数的点名器,很早就写出了一版,今天无意间又看到了之前写的代码,还是有很多bug的,今天做了完善在这里分享给大家 <script type="text ...

  2. Python 调整Excel行高、列宽

    在Excel中,默认的行高和列宽可能不足以完全显示某些单元格中的内容,特别是当内容较长时.通过调整行高和列宽,可以确保所有数据都能完整显示,避免内容被截断.合理的行高和列宽可以使表格看起来更加整洁和专 ...

  3. 远程连接利器:玩转MobaXterm

    今天这篇文章轻松不烧脑,主要是想和大家分享一下我在工作中常用的远程管理工具--MobaXterm.这款工具不仅功能强大,而且在日常的远程操作中极为高效,特别适合用来管理远程服务器.MobaXterm结 ...

  4. Pro更改启动界面

    该方法适用于arcgispro 3.1及以上版本,我目前测试到3.3,是可以的. 使用的是pro产品的启动配置文件,利用其中的SplashScreen实现这一需求. 在bin目录下,新建(或编辑)Ar ...

  5. 利用smtp发邮件

    小功能,备忘 MailMessage objMailMessage = new MailMessage();//引入System.Net objMailMessage.From = new MailA ...

  6. 【网站搭建】开源社区Flarum搭建记录

    环境 服务器系统:腾讯云 OpenCloudOS 宝塔版本:免费版8.0.1 Nginx:1.24.0 MySQL:5.7.42 PHP:8.1.21 萌狼蓝天 2023年8月7日 PHP设置 1.安 ...

  7. 【Python】【爬虫】【爬狼】003_获取搜索结果的页数

    # 获取搜索内容的页数 需要的包 import urllib.request # 获取网页源码 import re # 正则表达式,进行文字匹配 from bs4 import BeautifulSo ...

  8. Mybatis Plus条件构造器condition动态判断优化

    ConditionQueryWrapper package com.common.util; import com.baomidou.mybatisplus.core.conditions.query ...

  9. Qt音视频开发34-不同库版本不同位数的库和头文件的引用

    一.前言 做开发过程中难免遇到需要引入第三方库的时候,而且需要在不同库版本.不同系统.不同位数下都需要.第三方的库版本众多,一般在大版本中的小版本都是兼容的,但是大版本不兼容,比如ffmpeg目前就有 ...

  10. IDEA利用阿里云插件部署Springboot项目

    下载插件 搜索 Alibaba Cloud Toolkit 插件,并安装. IDEA增加Run/Debug Configurations Add New Configuration - Deploy ...