基于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();
}
pdf 文件大小:361KB