RW文档翻译学习——RW-BLE-KERNEL核心函数功能

1 概述

1.1 功能列表

RW kernel是一个轻量且高效的实时操作系统,提供下面的功能:

(1)交换消息

(2)消息保存

(3)定时器功能

(4)kernel还提供一个用于延迟行为的事件函数

1.2 源文件结构

RW文档翻译学习——RW-BLE-KERNEL核心函数功能_第1张图片

1.3 包含文件

为了使用内核提供的服务,用户需要包括下面的文件:

(1)ke_task.h

(2)ke_timer.h

1.4 kernel 环境

内核环境结构包括三个队列用于事件、定时器和消息的管理。

(1)evt_field:发送消息的队列,但是不传输给接收器(这个要怎么理解)

(2)queue_sent:发送消息的队列,但是不传输给接收器(这边肯定是有问题的!!)

(2)queue_saved:消息发送队列,但不被接收

(3)queue_timer:定时器队列

(4)mblock_first:指向链表的第一个元素

2 消息

2.1 概述

消息队列提供一种机制传输一个或更多消息给一个任务,下面两个队列被定义:

(1)queue_sent:发送消息队列单不发送给接收方

(2)queue_saved:消息队列发送但不被接收方接收

消息的传输分为三步:(这个在代码中是如何实现的?

  1. 通过发送任务分发一个消息结构
  2. 添加消息参数
  3. 消息结构推入内核

一个消息由一个唯一的ID定义,这个ID由任务类型和一组升序的数字组成。下面的宏定义了任务的第一个消息ID:

#define KE_FIRST_MSG(task) ((ke_msg_id_t)((task)<<10))

TASK_TYPE[15:10] ID[9:0]                       

一个消息有一列定义于结构体的参数。

2.2 消息实体

(1)hdr:链表的头

(2)hci_type:HCI数据格式(仅被HCI使用)

(3)hci_off:消息中的HCI数据补偿(仅被HCI使用)

(4)hci_len:HCI传输长度(同上)

(5)id:     消息标识

(6)dest_id:内核目的标识

(7)src_id: 内核源的标识

(8)param_len:嵌入式结构参数长度

(9)param:嵌入式结构参数

 

2.3 消息标识

消息标识定义如下:

Typedef uint16_t ke_msg_id_t;

 

2.4 参数管理

在消息的分发中,参数的大小被发送并且为其在内核堆中分配内存。为了存储数据,参数中指针将被返回。因为在传输完成后,时序会释放这部分内存。

 

2.5 消息队列实体

一个消息队列被定义为由消息元素组成的链表:

(1)*first:指向链表的第一个元素

(2)*last:指向最后一个元素

如果核心规范使能,则下面将被添加:

(1)cnt:链表中元素的数目

(2)maxcnt:链表中元素的最大数目

(3)mincnt:链表中元素的最小数目

2.6 消息队列原语

2.6.1 消息分发(函数)

原型:

Void *ke_msg_alloc(ke_msg_id_t const id,

   Ke_task_id_t const dest_id,

   Ke_task_id_t const src_id,

   Uint16_t const param_len)

函数参数表

返回:指向ke_msg参数成员的指针。如果这个参数结构是空,这个指针将指向消息的末尾并且不被使用(除非要检索消息指针或是发送消息)。

描述:这个原语为一个被设定的消息分发内存。内存被动态的分发在堆上并且可用参数结构及的长度被提供,使得分发正确的大小。

2.6.2 消息发送

原型:

Void ke_msg_send(void const *param_ptr)

参数:param_ptr 指向将被发送的消息的参数成员

返回:None

描述:发送被类似ke_msg_alloc()函数分发的消息。内核将会小心释放这个消息的内存。

一旦这个函数被调用,将不可能进入它的任何数据,因为内核可能占用这个消息并且释放原始内存。

 

2.6.3 消息发送基础(basic该怎么理解,理解成基础好奇怪啊?

原型:

Void ke_msg_send_basic(ke_msg_id_t const id,

Ke_task_id_t const dest_id,

Ke_task_id_t const src_id)

返回:None

描述:发送一个参数成员长度为0的消息,它将被在内部完成,不需要进行分发。(何为分发allocation)

2.6.4 前向消息

原型:void ke_msg_forward (void const *param_ptr,

ke_task_id_t const dest_id,

ke_task_id_t const src_id)

描述:提供一个消息给另一个任务,通过改变它的目的和源的任务ID。

2.6.5 释放消息

Void ke_msg_free(struct ke_msg const *msg)释放分发的消息

3 时序

3.1 概述

这个时序在主循环的后台被调用,在后台循环中,内核检查事件域是否为空,当通信事件位被置位则执行该事件句柄。

3.2 要求

3.2.1 优先级控制

这个时序检查事件域并获取最高优先级的事件,下面的函数负责发现被设置为最高优先级的事件。

co_clz(field);

事件的优先级被定义在ke_event.h文件中

0具有最高优先级直到31(最低优先级)

3.2.3 保存服务

这个服务允许保存一个消息去存储它在内存而不被注销。如果在一个消息接收后任务状态改变,这个时序将会试图在安排其他消息之前保存消息。

4 任务

4.1 定义

内核任务被定义为

(1)它的任务类型,内核为每个任务单独定义一个常量值。

(2)它的任务描述,一个包含任务所有信息的结构体

(3)在任何状态都能接收的消息

(4)在默认状态能接收的消息

(5)实时任务的数目

(6)任务状态的数目

(7)每个实时任务的当前状态

内核为每个任务描述分配一个指针,被用于处理从从一个任务到另一个任务上的消息传输。

 

5 内核定时器

5.1 概述

(1)RW内核提供一个时间基准(就是时间计数)

(2)RW内核提供定时器服务:开始和停止计时器

(3)定时器通过一个保存延时消息队列的方法来实现

(4)定时器消息没有参数

5.2 定时器定义

定时器被定义为间隔,最小的一步为10ms

5.3 定时器实体

定时器消息的结构体包括:

(1)*next:  指向下一个定时器的指针

(2)id:     消息定义

(3)task:   目标任务的定义

(4)time:   间隔

5.4定时器设置

 

 

 

 

你可能感兴趣的:(低功耗蓝牙开发,嵌入式开发)