炬芯(Actions)TWS ATS301X 之应用代码开发指南

US301A是基于一款全ROM IC的软件方案,SDK全部固化到内部ROM中,对软件功能和流 程修改,只能通过修复的方式完成。

SDK 简介

目录结构
发布的 SDK 包,其目录结构和对应的说明如下所示:
目录                  说明

case                  用户开发目录
case_rom          ROM code,对应 SDK 源码,不能修改
documents       开发文档
fwpkg               固件生成目录
include             ROM 接口头文件,不能修改
lds                    链接脚本
library               C 库等
make                GCC makefile
tools                 工具链

空间限制
本方案是 ROM 版本,所以提供给外部使用的数据空间、代码空间、栈空间也是有限制的。


》代码空间指的是开发者编译链接生成的.sys 文件大小, 不能超过 100 k bytes。
》 数据空间不能超过 1k bytes,malloc 申请的空间根据应用场景不同而不同,如果在某个场景下通过 malloc 还能成功申请到你所需要的空间,则认为是 ok 的。
》栈空间在开发者新增应用的时候会制定,不应该超过 2K Bytes(栈默认 2k,不可修改)

开发限制
除 case 目录下可以自由修改外,其他目录原则上不要去修改;


函数修改

在“引言”部分有提到过,这是一个 ROM 版本的方案,所有的代码修改都是以修复的方式进行,修复的最小单位是“函数”,针对函数的修复,有如下三个场景。

修改已有的函数
比如你想在 bt_music_view.c 文件中的 bt_music_led_display 函数中增加一行打印或做其他修改,可以将函数上面的宏“#ifndef APP_FIX_ENABLE”改成“#if 1”,然后在这个函数里面增加打印或者做其他的修改即可。如下所示:


替换已有的函数

在某些情况下,你想修改的函数比较大,但你需要修改的内容很少,比如只有简单的几条赋值,并且不关心执行的位置。这时候如果直接用方式(1)去修改 已有的函数,则会占用很多代码空间,这时我们可以用替换已有函数的方式来修复,比如下面这个函数是需要修改的函数:
int funcA(my_struct param) //my_struct 是定义的一个数据结构

{
          param.i = 10;
          param.j = 100;
          return 0;
}
假如你想修改 funcA 里面 param.i 和 param.j 的值,假如 funcA 很大,修改 funcA 会占用很大的代码空间,我们可以新定义一个函数 funcA_FIX(函数名没有限制),参数和返回值和funcA 一样,然后在这个新定义的函数里面调用 funcA,最后再修改 param.i 和 param.j 的值,

如下所示:
int funcA_FIX(my_struct param) //my_struct 是定义的一个数据结构

{
          funcA(param);
          param.i = 10;
          param.j = 100;
          return 0;
}
增加了这个函数之后,你需要在脚本中定义才行,只有定义之后才会用funcA_FIX代替funcA。

定义的方式是修改\user\lds\fix 下的 app.ini 文件,增加如下声明:
CODE_S_FIX = funcA funcA_FIX

增加自定义函数
在开发某个功能的时候,单纯修改原有函数已经无法满足需求了,就需要增加自己的函数,新增函数跟正常的编码没什么差别,只需要将你的函数实现出来,然后在原有 ROM 的函数里面调用即可。
比如说我想在 bt_music_led_display 函数中增加一个自定义的函数 func_new,
实现如下:



应用修改

替换已有的应用
在发布的 SDK 中,有蓝牙播歌,蓝牙通话,LINEIN 播放等应用,如果你的某个产品不需要 LINEIN 播放应用,但在原来启动 linein 应用的地方也需要启动你的应用,那么就可以使用你自己的应用实现来替换 linein 应用,这种方式很简单,只需要在对应的消息下面调用你的实现代码即可,如下所示:



增加自定义应用
如果需要在保留原有应用的基础上,增加一个应用,则需要在 app_reserved 目录下增加。发布的 SDK 保留了 3 个应用给客户扩展,开发者可以在 app_define.h 里面找到这 3 个应用的名称定义和 ID 定义,如下所示:



bg_reserved 表示后台保留应用,可以在任何时候启动,没有互斥关系

fg_reserved 表示前台保留应用,启动的时候需要保证当前的前台应用已经被卸载
bt_reserved 表示蓝牙前台保留应用,属性和 fg_reserved 一样
开发者只需要在对应的 xxx_main.c 里面找到 xxx _app_msg_proc 函数,然后实现对应的消息处理即可,比如在 fg_reserved_main.c 中的 fg_reserved_app_msg_proc 函数中实现你的代码。

开发者实现了一个新的应用之后,需要调用 manager_do_launch_app 函数来启动这个应用(启动的地方可以根据需求来决定,具体的启动方式可以参考manager_launch_app.c里面的代码),

当不需要这个应用的时候可以调用 manager_do_quit_app 函数来卸载(具体的卸载方式可以参考 manager_quit_app.c 里面的代码)。


编译链接和生成固件
如果是第一次使用 sdk,则在 cygwin 中 cd 到 user 目录执行 make clean;make 即可进行编译链接,如果不是第一次使用 sdk,则 cd 到 user 目录执行 make 即可。执行命令之后会同时在
\user\fwpkg 目录下生成固件,固件的名称为 US301A.FW。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论