翻译不全,选了我认为比较重要的翻译的,蓝色是我的废话
1 Overview
1.1 文档目的
本文档包含嵌入式RW-BT软件的通用信息。
提供了工程结构和文件的一般消息,以及有关os及os接口、和定制RW-BT软件的接口描述,为了适应最后的应用。
3 Operating System
RW Kernel提供一个事件时序功能,这个功能的主要目的是提供程序的延迟功能。(就是消息发送了,系统根据优先级判断,谁先发,谁后发,这就有一个时延!)
(1)在一个中断句柄中,仅执行重要的处理;
(2)不重要的处理在中断之后被一个事件句柄完成。
事件使用两种数据结构:
(1)一个允许设置和重置事件的32bit域(在系统中最多允许含有32个内核事件)
(2)一个常量数组包括指向事件句柄的指针。
在后台循环中,Kernel检查事件域是否为非空,并且执行通信事件位被设置的事件句柄。
3.1 消息传输
(1)源任务分配和填充消息;
(2)源任务将消息放入内核消息队列;(单向链表)
3.2 消息时序
(1)在后台循环中,内核取出队列的第一个消息;
(2) 据消息结构(id、目的任务),内核决定调用哪个消息句柄(message handler);
(3)根据返回的消息句柄的状态,内核执行需要的操作。
3.3 定时器设置
(1)当一个任务在未来需要一个定时器,内核从空闲池中分配一个定时器结构。内核用任务参数(如time、timer_id、task_id)填充这个新的定时器;
(2)内核将新定时器放在有序定时器列表的正确位置;
(3)如果新的定时器位于列表的第一个,内核编码让硬件总目标时间匹配新定时器的目标时间。
3.4定时器时序
(1)一旦定时器到期,内核时间在后台被调用,在时间时序中,内核取出队列中的第一个定时器;
(2)根据定时器结构,内核发送通信消息给配置这个定时器的任务;
(3)内核释放这个到期的定时器;
(4)内核编码硬件总时间匹配下一个定时器的时间。(应该是设置时间,为定时器的时间)
4 中断管理
这章描述了用于管理中断的机制。
对于ARM处理器,这个中断线IRQ产生一个中断,由ARM程序集编写的第一级中断处理程序处理,调用第二级处理程序。
第二级中断处理由C语言编写,并且依赖使用的中断控制器。处理器调用中断源中的中断处理模块。
RW-BT处理器处理RW-BT中断,处理器调用LD函数,通过操作系统发送信息给链路控制器或管理器。
5 主机控制器接口(HCI)
这部分我实习期间搞过,比较简单,大概了解下
HCI的传输协议是UART。在TX路径,当有HCI的中断到来,消息(一般是CMD、ACL、SYNC数据)将被发送给驱动。根据消息的类型,不同的驱动API会被调用。
hci_cmd_dispatch(command);
hci_data_sync_dispatch(sync data);
hci_data_acl_dispatch(acl data);
6 非易失性参数存储NVDS
6.1概述
NVDS(非易失性数据存储)驱动在nvds.c.h文件中,这些驱动的默认是RW-BT板子的flash地址。
NVDS在flash中的限制如下:
(1)不能擦除Flash的内存,内存在第一次下载固件的时候擦除;
(2)在多次写入flash内存操作后,不压缩参数。
6.4 存储格式
数据使用中没有特定的顺序或表格
每个数据与一个状态相关联,如有效、无效、锁住。在进入或修改数据之前,数据状态被设置为无效,一旦数据被存储即设为有效(这个基本字节写入是一个原子操作)。这种机制保护不完整的数据被存储,如果一次电源缺失发生使一个数据元素的以部分被写入。当一些数据是无效的,正常写入的生产参数一旦需要检索和检查,作为生产参数的一部分。
无论参数是否被锁都可以发送。如果参数被锁,它也是有效的,并且不能改变。
存储的链接键的数目明显是有限的,所以老的和不用的链路键必须被删除。这个操作被上层执行,通过标准的HCI命令去读写删除存储的链接键(Link Key)。
在初始化时,设备被Markers0xFF装满,为了能发现最近存储的值,这个值必须没有被用做一个标签。
7 设置一个应用,配置RW-BT软件
7.2调整系统层定义和删除块
蓝牙设备能力可以通过定义于文件夹中的文件进行配置。或是通过命令进行系统层定义。
用户可以为协议栈的每一层改变link entities的数目,下面的表格显示在不同软件模块中可以选择的连接实体。
7.2.1 系统修改
对每个系统,用户可以修改,在./platform/config/scutils.py 文件中。