DA14580/1458X Real Time Kernel基本理解

Real Time Kernel概述

DA145x软件平台利用了由Riviera Waves许可的小型高效实时内核。 内核提供以下功能:
●任务创建和状态转换。
●任务之间的消息交换。
●计时器管理。
●动态内存分配。
●BLE事件的调度和处理

Scheduler

Real Time Kernel的核心是在应用程序主循环中运行的调度程序Scheduler。 调度程序检查是否设置了事件,并通过调用相应的处理程序来处理未决事件。 该事件可能是BLE或计时器事件,即两个任务之间的消息。调度程序从BLE内核硬件获取任何时序信息。 主循环代码可确保在BLE内核的硬件模块未处于睡眠模式时不执行内核调度程序。API类型的定义和API函数的原型位于以下头文件。
●ke_task.h-内核任务管理和创建API。
●ke_msg.h-消息处理API。
●ke_mem.h-动态内存分配API。
●ke_timer.h-计时器创建和删除API。

Tasks

通过调用ke_task_create()函数创建任务。任务ID和描述符在函数参数中传递。
通过调用ke_task_set()可以更改任务的状态。任务的当前状态由ke_state_set()返回。
内核任务创建和管理的所有API函数和类型都在ke_task.h头文件中声明。
● Types
○ ke_msg_handler – Message handler structure
○ ke_state_handler – List of message handlers for a specific or default state.
○ ke_task_desc - Task descriptor.
● Functions
○ ke_task_create() – Creates a new task.
○ ke_state_set() – Sets the state of the task.
○ ke_state_get() – Returns the current state of the task

Dynamic Memory Allocation

内核为应用程序代码提供API,以便在内核的堆内存中进行动态内存分配。 DA1458x内核中定义了四个堆存储区
●KE_MEM_ENV –用于环境变量的内存分配
●KE_MEM_ATT_DB –用于ATT协议数据库,即服务,特征,属性
●KE_MEM_KE_MSG –用于内核消息的内存分配
●KE_MEM_NON_RETENTION –通用堆内存。 如果在此堆中分配的内存空间不为零,则在某个时间点,则不允许进入深度睡眠模式。
内核提供的API函数包括:
●ke_malloc()–分配请求的内存空间。
●ke_free()–在请求的内存地址释放分配的内存空间。

Messages

内核提供了一种在任务之间交换消息的机制。内核交换的消息具有特定的格式。格式由ke_msg.h中定义的struct ke_msg类型确定。 ke_msg结构包括以下成员。
●ID:包含消息标识的16位无符号整数。十个最低有效位形成任务消息中唯一的序号。在六个最高有效位中包含任务的ID,以确保系统中消息标识的唯一性。
宏KE_BUILD_ID可用于构建符合此约定的消息ID。
●dest_id:消息的目标任务的任务ID。
●src_id:消息源任务的任务ID。
●param_len:param中包含的消息数据的大小。
●param:消息数据的占位符。结构成员的类型是一个32位无符号整数的位置表。但是,分配的内存空间的大小由堆内存确定,由消息内存分配函数分配,并且它等于param_len。
消息的传输分为三个步骤:
1.通过发送方任务分配消息结构。 通过调用以下宏之一来执行消息分配:
○KE_MSG_ALLOC:为消息分配KE_MEM_KE_MSG堆内存中的空间。 消息ID,源和目标任务ID以及消息的数据类型在
函数的参数。 函数根据数据类型计算要分配的内存空间。 返回指向已分配消息的数据开头的指针。
○KE_MSG_ALLOC_DYN:类似于KE_MSG_ALLOC。 在附加参数中传递与数据类型大小相同的附加内存大小。
2.填充消息参数。 源任务的代码应填写消息的数据。
3.消息结构被推送到内核中。
通过调用ke_msg_send()将消息发送到目标任务。 由KE_MSG_ALLOC或KE_MSG_ALLOC_DYN返回的指针必须在函数的参数中传递。 如果消息已分配但未发送,则必须调用ke_msg_free()释放已分配的内存空间。
通过在消息的任务描述符(ke_task_desc)中定义消息处理程序功能(结构ke_msg_handler),可以实现发送到任务的消息的接收。 当目标任务使用消息时,状态处理程序应返回KE_MSG_CONSUMED,而将消息转发到另一个任务时,状态处理程序应返回KE_MSG_NO_FREE。 函数ke_msg_forward()必须用于此操作。

Timer

DA1458x内核提供计时器服务来创建和删除计时器事件。 内核计时器的时间参考是BLE硬件内核的BLE_GROSS_TIMER。 BLE_GROSS_TIMER计时器的精度为10毫秒。 通过接收消息,将通知请求计时器事件的任务计时器的到期时间。 消息ID等于用于定时器创建的定时器ID,因此,定时器ID必须是有效的消息ID。 还必须在任务处理程序列表中定义计时器处理程序功能。 内核计时器是一次性计时器。
●API函数
○app_timer_set()–这是ke_timer_set()的包装。 计时器ID,任务ID和超时,以10毫秒为单位。 最大有效超时为30000,相当于5分钟。
○ke_timer_delete()–删除活动的内核计时器。

发布了19 篇原创文章 · 获赞 4 · 访问量 1716

猜你喜欢

转载自blog.csdn.net/ydgd118/article/details/104435322