基于ARM C library的USB通讯协议实现
介绍了在不使用微库的情况下,如何基于ARM C library实现USB通讯协议。
工程配置:
在工程配置中,不勾选“Use MicroLIB”选项,这样就能使用ARM C library而不是微库。
堆栈初始化:
由于使用的是ARM C library,需要手动传递堆栈的基地址和大小给库函数。ARM C library会调用__user_initial_stackheap
函数,并将堆栈信息通过R0~R3寄存器传递。
函数实现:
在__main
函数中,首先需要完成一些初始化工作,例如初始化.data段。然后调用__rt_entry
函数进行C库初始化。__rt_entry
函数会调用__user_initial_stackheap
函数完成堆栈初始化。
注意事项:
如果勾选了“Use MicroLIB”,则ARM C library会被屏蔽,编译时会因为找不到__rt_entry
函数而报错。
代码示例:
__main void __main(void) {
void __rt_entry(); /*库函数声明*/
extern unsigned char Image$$RW_IRAM1$$ZI$$Base; /* ZI基地址*/
extern unsigned long Image$$RW_IRAM1$$ZI$$Length; /* ZI段长度*/
extern unsigned char Image$$RW_IRAM1$$Base; /*执行域data段基地址*/
extern unsigned char Load$$RW_IRAM1$$Base; /*加载域data段基地址*/
extern unsigned long Image$$RW_IRAM1$$Length; /* .data段长度*/
unsigned char *drc;
unsigned char *src;
unsigned long length;
/* *初始化.data段*/
drc = (unsigned char *)&Image$$RW_IRAM1$$Base;
src = (unsigned char *)&Load$$RW_IRAM1$$Base;
length = (unsigned long )&Image$$RW_IRAM1$$Length;
// ...
// 调用__rt_entry函数
__rt_entry();
}
361KB
文件大小:
评论区