前言
有时候调试代码需要测试某种格式的文件,比如mp3等,常用的有两种办法。
将mp3文件存放到fat等文件系统中,然后使用文件系统API进行读取。
将mp3文件通过一些工具转换成二进制数组,放到代码中进行编译,通过代码直接进行引用。
下面再介绍另外一种方法
直接嵌入二进制文件进行编译,此方法比较适合小文件调试时使用,或者平台的硬件资源特别丰富(内存、flash超大)。
具体操作
汇编级引用
新建一个**.s的汇编文件,如下
/*
下面的宏定义功能是转成字符串
如 TO_STRING(badboys) >>> "badboys"
/
#define TO_STRING_A(s) # s
#define TO_STRING(s) TO_STRING_A(s)
.globl __test_code_start
.globl __test_code_end
/
汇编 .section .rodata_test_code, "a", %progbits的含义
a表示权限,a是 allocation的缩写,表示该节区可分配;
%progbits是type字段的标记:
PROGBITS: 程序内容,包含代码、数据、调试相关信息
/
.section .rodata_test_code, "a", %progbits
.balign 4
/ test_image是具体的二进制文件名称
*/
__test_code_start:
.incbin TO_STRING(test_image)
__test_code_end:
c语言级别引用
#if 32位系统
extern uint32_t __test_code_start[];
extern uint32_t __test_code_end[];
#else
extern uint64_t __test_code_start[];
extern uint64_t __test_code_end[];
#endif
/* 验证是否包含成功
__test_code_start 是文件的起始地址,在C语言中直接使用指针方式就可以引用。
__test_code_end 是是文件的结束地址
*/
printf("start addr=0x%x end addr=0x%x \r\n", __test_code_start, __test_code_end);
原作者:小鳄鱼
|