OSAL
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_set_event();
osal_start_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的更多相关文章
- [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)
说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...
- [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)
1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用 ...
- 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- 4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- 3、CC2541芯片中级教程-OSAL操作系统(ADC光敏电阻和修改串口波特率)
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- 1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- 蓝牙协议栈中的 OSAL
蓝牙协议栈里的操作系统叫做 OSAL(操作系统抽象层).它并非一个真正意义上的操作系统,它只是实现了操作系统的一些功能,如任务切换.内存管理. OSAL 产生的根源:基于蓝牙协议栈开发的产品,实际上是 ...
- 深入浅出Z-Stack 2006 OSAL多任务资源分配机制
转自深入浅出Z-Stack 2006 OSAL多任务资源分配机制 一.概述 OSAL (Operating System Abstraction Layer),翻译为"操作系统抽象层&quo ...
随机推荐
- RedHat6.6更新Centos6yum源
RedHat6.6更新Centos6yum源 一. 删除自带的RedHat6.6yum源 1- rpm -qa|grep yum|xargs rpm -e --nodeps(不检查依 ...
- 密码有效性验证失败。该密码不够复杂,不符合 Windows 策略要求
我在sqlserver2005中建立一个用户的时候,我的用户名和密码是一样的,它不允许我建立报“密码有效性验证失败.该密码不够复杂,不符合 Windows 策略要求”错误,我把密码改成其他一些就可以, ...
- Android --http请求之HttpURLConnection
参考博客:Android HttpURLConnection 基础使用 参考博客:Android访问网络,使用HttpURLConnection还是HttpClient? String getUrl ...
- Vue.2.0.5-列表渲染
v-for 我们用 v-for 指令根据一组数组的选项列表进行渲染. v-for 指令需要以item in items 形式的特殊语法, items 是源数据数组并且 item 是数组元素迭代的别名. ...
- 如何在makefile中写cd命令
http://stackoverflow.com/questions/1789594/how-to-write-cd-command-in-makefile
- C#处理JSON数据
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- docker operation method note
docker stop script #!/bin/bash CID_LIST=$(docker ps -q | xargs)if [ "$CID_LIST" = "&q ...
- windows下根据端口号杀死进程
Windows不像Linux,Unix那样,ps -ef 查出端口和进程号,然后根据进程号直接kill进程. Windows根据端口号杀死进程要分三步: 第一步 根据端口号寻找进程号 C:\>n ...
- j2ee Servlet、Filter、Listener
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...
- ssh tunnel通道
Secure SHell (SSH) 是一个通过网络登录其他计算机的程序,在远程服务器运行命令,和从一台机器移动文件到另一台.在不安全的网络中,它提供两台主机之间强大认证和安全加密的的通讯,被称为 S ...