DA14580软件开发平台参考(四)

2 篇文章 1 订阅

在这里插入图片描述
翻译的是这个文档。
它介绍了整个系统架构,组件,应用程序编程接口(API)以及开发工具链,环境和过程。
问题点请在评论中留言,我看到了回去改正。

8 Application Software

8.1 Overview

消息是从BLE堆栈和配置文件代码的不同层生成的,用于向应用程序任务发出事件信号。
另一方面,应用程序会生成消息并将其发送到堆栈以开始大量操作。
There are two distinct directions for the messages.
● Messages from the stack and the profiles to the application task.
● Messages from the application task to the stack and the profiles.
尽管所提供的消息API功能强大且完整,但它对应用程序的构建速度以及构建简单应用程序所需的系统知识的最低要求构成了一些限制。为了解决5.0.x SDK中的此问题,已在一个库中收集了构建应用程序所需的部分常用功能,该库公开了许多API和帮助程序功能。已经采取了许多措施,以尽可能向用户隐藏任务管理和消息管理,并提供类似于API的功能/回调。

另外,执行操作所需的大多数参数已转换为在用户空间中定义的常量。
在模板项目中为用户预定义了一组工作常数。

8.2 API

● SDK Application: SDK中定义,实现库功能。
● User Application: 这部分包含通过模板的配置常量,回调定义。配置SDK应用库。用户应用的源码位于此处。在这里插入图片描述
8.2.1 Message API
在堆栈和配置文件中执行操作的标准和最通用的方法是使用消息API。
这包括内核的标准消息分配和消息发送功能,以及每个任务支持的消息列表。
消息列表和每个消息的数据结构通常在文件<destination_task> _task.h中定义。 请参阅每个任务的相关文档(gapm,gapc,gatt等)以获取更多详细信息。
只要没有从app_mid.h和app_easy.h API提供功能(如本文档后面所述),用户就可以使用消息API。

8.2.2 Mid Layer API
中层API是一组轻量级的无状态宏,用于描述如何执行间隙和安全性的最常见操作。 它描述了特定消息的生成,用数据填充消息以及将消息分发到所需任务的过程。 其背后的想法是提供功能API而不是消息API。 使用以下模式:
● <message pointer*> app_<message_name>msg_create(): Allocates a message and fills in the
correct destination task.
● void app
<message_name>_msg_send(<message pointer*>): Sends the message.
● void _op(parameters): Performs a complete operation. The _op
function usually creates a message, fills the message with the required data as provided from the
caller through the parameters, and dispatches the message.

8.2.3 Easy API
Easy API概念试图减轻应用程序程序员在正确执行堆栈或内核中某些操作所需的消息处理,任务处理和特殊序列方面的负担。
Easy API还解决了以下事实:消息中使用的大多数数据在编译时都是常量。 在执行函数调用时要求程序员提供所有常量很麻烦,并且会产生更大的代码。 此外,即使对于最简单的应用程序,也需要定义许多常量,这对于新手程序员来说,使其程序快速进入运行状态具有挑战性。
因此,大多数(如果不是全部)常量都是在用户应用程序空间中从模板预定义的,并在编译时从Easy API进行访问。 程序员可以快速启动其应用程序,然后更改默认行为。 通常,更改行为仅需要更改适当的常量参数并重新编译代码。 另外,Easy API的函数调用中使用的参数数量较少,从而为程序员提供了更好的可读性和更好的可见性。
在这里插入图片描述
图没看懂,下面这段话就是描述这个图。

向用户公开的每个app_easy_ 都有一个静态app_easy_ msg_createfunction和一个指针(msg_pointer)。当用户调用app_easy 函数时,将调用相关的msg_create函数。消息创建功能将检查msg_pointer是否指向已为此操作创建的消息。如果已经有一条消息,它将把现有消息返回给app_easy_ 函数。如果没有消息,它将创建一个新消息,用用户配置数据文件提供的常量数据填充它,并将其分配给msg_pointer。 app_easy_ 将发送消息并清除msg_pointer。

这意味着每次app_easy_ 要么创建新消息,要么发送并自动使用现有消息。为了支持消息的动态配置,提供了app_easy_ _get_active函数。该函数将调用消息创建函数,并将指针返回到活动消息。这样,用户应用程序可以动态更改消息。

为了节省内存空间,有些操作可以共享msg_pointer,例如不同的app_easy_ _advertise操作。

8.2.4 app_ API
对于SDK随附的某些配置文件,存在一个附加的应用程序层,该层公开了创建数据库,初始化和特定于配置文件的操作功能。 请参阅相关的头文件以获取每个配置文件支持的功能列表。

8.2.5 App Entry Point API
在SDK 5.0.2中,我们引入了一个新的软件,用于处理到达应用程序任务中的消息。该模块称为app_entry_point.c。到达app_entry_point_handler的消息将传递到SDK包含的所有应用程序模块,直到模块确认已处理该消息为止,
在这种情况下,应用程序入口点将把已报告的消息状态返回给内核调度程序。

如果消息没有被任何模块处理,它将通过app_process_catch_rest_cb函数指针传递到应用程序,用户可以在其中钩住他的消息处理程序。到达用户空间的消息始终被视为已消耗,无法保存或转发。

与app_entry_point_handler和app_process_catch_rest_cb函数指针一起,app_entry_point.c模块还公开了在user_modules_config.h中定义的一组EXCLUDE_DLG_ 选项。这些选项可用于禁用SDK的特定消息处理程序,以通过app_process_catch_rest_cb在用户应用程序空间中接收消息。
这使用户可以覆盖或扩展现有SDK模块的功能,而无需触摸任何SDK文件。

8.2.6 User Callback API

SDK提供了许多挂钩在入口点上的模块,用于处理发送给应用程序任务的消息。 模块的主要功能是将收到的消息转换为事件,这些事件作为具有有意义名称和参数的函数指针公开给用户应用程序空间。 还有一些模块可以实现许多应用程序功能,例如app_spotar_task.c。 遵循此模式的模块是gap,安全性和所有现有的app_ _task.c模块。

该库在user_callback_config.h中查找指针的值。 在那里,用户可以分配其应用程序的新功能,以在发生特定事件时被调用。
间隙和安全功能指针在user_app_callbacks结构中分组,而与配置文件相关的指针(对于具有app_ _task.c的配置文件)在user_profile_callbacks结构中分组。

struct app_callbacks{
void (*app_on_connection) (const uint8_t, struct gapc_connection_req_ind const *);
void (*app_on_disconnect) (struct gapc_disconnect_ind const *); //app disconnect
void (*app_on_update_params_rejected) (const uint8_t);
void (*app_on_update_params_complete)(void);
void (*app_on_set_dev_config_complete)(void);
void (*app_on_adv_undirect_complete) (const uint8_t);
void (*app_on_adv_direct_complete) (const uint8_t);
void (*app_on_db_init_complete)(void);
void (*app_on_scanning_completed)(void);
void (*app_on_adv_report_ind)(struct gapm_adv_report_ind const *);
void (*app_on_connect_failed)(void);
void (*app_on_pairing_request) (uint8_t const, struct gapc_bond_req_ind const *);
void (*app_on_tk_exch_nomitm) (uint8_t const, struct gapc_bond_req_ind const *);
void (*app_on_irk_exch)(struct gapc_bond_req_ind const *);
void (*app_on_csrk_exch) (uint8_t const, struct gapc_bond_req_ind const *);
void (*app_on_ltk_exch) (uint8_t const, struct gapc_bond_req_ind const *);
void (*app_on_pairing_succeded)(void);
void (*app_on_encrypt_ind) (const uint8_t);
void (*app_on_mitm_passcode_req) (const uint8_t);
void (*app_on_encrypt_req_ind) (uint8_t const, struct gapc_encrypt_req_ind const *);
};

8.2.7 Default Handlers
简单的BLE外围应用在很大程度上共享通用功能。 他们应发布广告并响应中央设备的特定请求以建立连接。 为了最大程度地减少应用程序程序员启动应用程序所需的代码量,已创建了默认处理程序函数库。 这些功能已经从用户回调中的模板项目中挂起,从而使工作中的外围设备无需编写任何代码即可。 然后,程序员可以更改功能,从而覆盖默认功能。

默认处理程序具有自己的配置选项和功能挂钩。 用户可以在user_default_hnd_conf文件中配置由默认处理程序实现的通告操作方案或外围设备的安全性请求方案。 他还可以在user_default_app_operations结构中完全覆盖advertise操作。

9 Memory Organization

9.2 Memory Map

BLE内核需要访问名为“ Exchange Memory”的存储空间来存储控件结构和帧缓冲区。 BLE内核地址空间到系统总线地址空间的映射是通过寄存器字段GP_CONTROL_REG [EM_MAPPING](请参见参考资料[1])控制的。
在这里插入图片描述
在这里插入图片描述
总的RAM资源是这样的。
● 42 kB System SRAM.
● 8 kB Retention SRAM.
Case 23分配的资源是这样的:
(BLE EM: 12 kB)这个是BLE core用到的RAM资源=8 kB Retention SRAM+4kB System SRAM.
(SysRAM: 38 kB)=0x20000000 to 0x200097FF there is 38 kB of RAM space (SysRAM)

是从这里理解的。
In 0x80000 to 0x81FFF the Retention RAM is located. Above it, at 0x82000 to 0x82FFF
there is 4 kB of RAM space that is not retained when the chip goes into Deep Sleep mode.
From 0x20000000 to 0x200097FF there is 38 kB of RAM space (SysRAM).

在SDK应用程序示例中,选择了案例23,并且寄存器的编程位于文件sdk \ platform \ arch \ boot \ rvds \ system_ARMCM0.c中:
SetBits32(GP_CONTROL_REG,EM_MAP,23);
请注意,需要通过初始化文件sdk \ common_project_files \ misc \ sysram_case23.ini将内存映射选择传递给Keil(J-Link)调试器,以便调试器可以使用正确的内存映射。 在此文件中,以下行提供了此信息:
E long 0x50003308 = 0x2e
图12说明了情况23的地址映射,该情况在SDK的所有示例应用程序中使用。 参见附录A。

9.3 ARM Scatter File

分散文件指示链接器将代码和数据放置在何处。它由加载区描述符和执行区描述符组成。

加载区域指示链接器在何处放置代码和数据,以及用于加载代码和数据的初始化代码。在代码到达arch_main.c中的main_func()之前,将执行初始化代码。在初始化期间,如有必要,会将代码和数据从加载区域复制到执行区域。例如,当使用闪存存储代码和数据时,此体系结构允许将数据和代码区域无缝传输到系统RAM。

对于DA1458x,不需要此功能,因为从OTP复制,系统加电期间或退出深度睡眠模式时,是由BootROM代码完成的,并且此过程对应用程序代码完全透明。因此,DA1458x分散文件中的加载区域至少与0x20000000到0x200097FF的内存范围匹配它们各自的执行区域。
其余的加载区应仅包含零个初始化数据。应该将区域0x80000至0x82FFF声明为包含不必初始化的数据(UNINIT)。由于这个区域是
芯片启动时置零,可以在此处放置零个初始化数据。必须为所有区域禁用数据压缩。

10 Peripheral Drivers

10.1 Overview

Note that even though the source code for all drivers is provided in the SDK to aid debugging,
modifying the core drivers is not recommended.

Note: Upon system wakeup from Extended Sleep or Deep Sleep mode, the device initialization and configuration functions have to be called again. The dedicated location to implement these calls is the periph_init() function in periph_setup.c.

The following sections first describe the core driver for each interface (GPIO, SPI, UART, ADC,
Quadrature and Timers) and then the sample drivers, listing the various functions that support them.

后续需要用到哪些外设模块,再来这里看详细的API使用说明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值