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;
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。
评论