RW kernel是一个轻量且高效的实时操作系统,提供下面的功能:
(1)交换消息
(2)消息保存
(3)定时器功能
(4)kernel还提供一个用于延迟行为的事件函数
为了使用内核提供的服务,用户需要包括下面的文件:
(1)ke_task.h
(2)ke_timer.h
内核环境结构包括三个队列用于事件、定时器和消息的管理。
(1)evt_field:发送消息的队列,但是不传输给接收器(这个要怎么理解)
(2)queue_sent:发送消息的队列,但是不传输给接收器(这边肯定是有问题的!!)
(2)queue_saved:消息发送队列,但不被接收
(3)queue_timer:定时器队列
(4)mblock_first:指向链表的第一个元素
消息队列提供一种机制传输一个或更多消息给一个任务,下面两个队列被定义:
(1)queue_sent:发送消息队列单不发送给接收方
(2)queue_saved:消息队列发送但不被接收方接收
消息的传输分为三步:(这个在代码中是如何实现的?)
一个消息由一个唯一的ID定义,这个ID由任务类型和一组升序的数字组成。下面的宏定义了任务的第一个消息ID:
#define KE_FIRST_MSG(task) ((ke_msg_id_t)((task)<<10))
TASK_TYPE[15:10] | ID[9:0] |
一个消息有一列定义于结构体的参数。
(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:嵌入式结构参数
消息标识定义如下:
Typedef uint16_t ke_msg_id_t;
在消息的分发中,参数的大小被发送并且为其在内核堆中分配内存。为了存储数据,参数中指针将被返回。因为在传输完成后,时序会释放这部分内存。
一个消息队列被定义为由消息元素组成的链表:
(1)*first:指向链表的第一个元素
(2)*last:指向最后一个元素
如果核心规范使能,则下面将被添加:
(1)cnt:链表中元素的数目
(2)maxcnt:链表中元素的最大数目
(3)mincnt:链表中元素的最小数目
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.2.1 优先级控制
这个时序检查事件域并获取最高优先级的事件,下面的函数负责发现被设置为最高优先级的事件。
co_clz(field);
事件的优先级被定义在ke_event.h文件中
0具有最高优先级直到31(最低优先级)
3.2.3 保存服务
这个服务允许保存一个消息去存储它在内存而不被注销。如果在一个消息接收后任务状态改变,这个时序将会试图在安排其他消息之前保存消息。
内核任务被定义为
(1)它的任务类型,内核为每个任务单独定义一个常量值。
(2)它的任务描述,一个包含任务所有信息的结构体
(3)在任何状态都能接收的消息
(4)在默认状态能接收的消息
(5)实时任务的数目
(6)任务状态的数目
(7)每个实时任务的当前状态
内核为每个任务描述分配一个指针,被用于处理从从一个任务到另一个任务上的消息传输。
(1)RW内核提供一个时间基准(就是时间计数)
(2)RW内核提供定时器服务:开始和停止计时器
(3)定时器通过一个保存延时消息队列的方法来实现
(4)定时器消息没有参数
定时器被定义为间隔,最小的一步为10ms
定时器消息的结构体包括:
(1)*next: 指向下一个定时器的指针
(2)id: 消息定义
(3)task: 目标任务的定义
(4)time: 间隔