自定义用户主函数
XMOS USB音频参考设计软件提供了充足的灵活性以及完整的源代码,这使得您可以修改软件的任何部分。虽然您可以直接修改main.xc中的代码,以添加自定义的任务,但这样做会让事情变得复杂。因为这会使得您合并我们更新的代码变得更加困难(修改lib库也是如此)。
因此,我们提供了user_main.h,通过宏定义USER_MAIN_CORES与USER_MAIN_DECLARATIONS,更改这两个宏定义相当于在main.xc中添加代码段。这样做的好处是益于维持main.xc的完整性。实际上,开发人员必须权衡使用这些宏定义的痛苦与合并来自XMOS的更新的痛苦。
您可以参考我们给出的示例编写自定义的主函数:user_main.h
user_main.h包含了什么?
- 添加到
main.xc的额外的头文件:例如引用i2c.h以使用协议栈。 - 创建线程时所需的资源:例如函数定义与端口定义。
USER_MAIN_DECLARATIONS宏:这部分包含你想在main.xc中声明的内容。USER_MAIN_CORES宏:这部分用于定义额外的线程,编译时这些定义会被插入到main.xc中。
#ifndef USER_MAIN_H
#define USER_MAIN_H
#ifdef __XC__
#include "i2c.h"
#include <print.h>
#include <xs1.h>
#include <platform.h>
extern unsafe client interface i2c_master_if i_i2c_client;
extern void interface_saver(client interface i2c_master_if i);
extern void ctrlPort();
/* 扩展I2C 接口定义,其定义在audiohw.xc中 */
extern port p_scl;
extern port p_sda;
#define USER_MAIN_DECLARATIONS \
interface i2c_master_if i2c[1]; /* 定义一个I2C master 接口 */
/*在tile1和tile0上分别定义两个任务*/
#define USER_MAIN_CORES on tile[0]: {\
ctrlPort();\
i2c_master(i2c/*接口实例*/, 1/**/, p_scl/*时钟*/, p_sda/*数据*/, 100/*速率*/);\
}\
on tile[1]: {\
unsafe\
{\
i_i2c_client = i2c[0];\
}\
}
#endif
#endif
陷阱
-
反斜杠导致编译错误: 反斜杠(
\)在这段代码中扮演了重要的角色,尤其是在定义USER_MAIN_CORES宏时,编译器会把这些被反斜杠连接的行视为一行来处理。如果用户不小心删除或错误地添加了反斜杠,将导致语法错误。 -
资源所处的位置:
对于端口(port)而言,代码运行的位置需要和端口定义的位置保持一致,即处于同一个tile上。
扩展阅读
本节中的相关XC语法参考: