如何在嵌入式系统中使用C库(SDT开发环境)
2004-07-05 22:40
941 查看
在嵌入式系统开发中,可以根据需要选择是否采用C库,如果应用程序较大,可能需要经常使用C库中的一些函数,如需要使用动态分配内存malloc,free,stdio.h中的printf,sprintf,string.h中的strcmp,strcpy等等。这时移入合适的C库是很好的选择,本文主要讲述在SDT2.5版本的ARM编译开发工具中使用C库需要解决的一些问题。 在SDT2.5版本的开发环境中,可以采用semihosted ANSI C library或者Embedded C library,Embedded C只是作为ANSI C的一个子集。ANSI C一般适用于早期的开发工作,可以和Angle,ARMulator等软件调试工具配合使用,方便软件的开发,在用户自己的代码执行之前,使用库前,所有的系统初始化工作必须完成。后者由于代码更小,不使用底层硬件资源,在与应用程序集成的时候比较适合与最终的版本发布。而且配合一些硬件调试仿真工具,对于程序的调试来讲,应该非常方便。 带Embedded C library应用程序执行流程: 1.系统启动之后,底层的一些初始化, 在跳转到C程序前,必须用汇编完成一些底层的一些初始化工作,只有包括异常中断跳转地址的处理,根据嵌入式系统的需要是否采用remap,以及异常中断的处理等等。 2.初始化嵌入式堆栈管理器 在C程序中,一般都需要采用动态分配内存,可以调用嵌入式C库中的堆管理器,根据堆的位置和大小来初始化堆,以便在C程序可以用malloc()函数动态分配内存。具体的动态内存分配算法在下面会继续阐述。 初始化调用的函数是: struct Heap_Descriptor *__rt_embeddedalloc_init(void *base, size_t size); 该函数返回一个堆描述符的指针。 由于嵌入式C库被设计成可以完全可重入的,不包含静态数据,用户在自己的代码中必须提供回调函数 struct Heap_Descriptor *__rt_heapdescriptor(void),该函数返回__rt_embeddedalloc_init()的值,这样库可以根据返回值定位堆描述符。 3.调用顶层对象构建器 如果在嵌入式C库中使用C++库,则需要调用顶层对象构建器void __cpp_initialise(void) 4.执行主程序 5.调用顶层对象析构器 在程序终断前,必须调用顶层对象析构器 void _cpp_finalise(void)。 代码实例: #include extern struct Heap_Descriptor *__rt_embeddedalloc_init(void *base, size_t size); void ApplicationCode(void); struct Heap_Descriptor *hp; extern struct Heap_Descriptor *__rt_heapdescriptor(void) { return hp; } extern void C_Entry(void) { hp = __rt_embeddedalloc_init((void *)0x2030000, 0x20000); ApplicationCode(); } 使用Embedded C library其他需要注意的地方: 1)在SDT编译环境中,armlink选项的库搜索路径选择/arm/lib/embedded/,该目录下有四个库文件,分别对应16位big,little,32位big,little。 2)代码必须重新实现实现__main(),_main(),不然在SDT下编译会出错。3)如果使用c库函数,根据需要可能还要实现__rt_trap, __rt_errno_addr, __rt_ft_status_addr,具体实现同__rt_heapdescriptor(), 但在SDT下不会编译出错,在symbol table中会出现undefinded, weak reference信息。
相关文章推荐
- (单片机原理与应用)proteus(嵌入式系统设计仿真与开发平台)的使用和编译环境(汇编版)
- 嵌入式应用/驱动开发网络环境设置-使用NFS网络文件系统挂载根文件系统
- 如何在开发嵌入式系统时做出明智的选择
- 如何为嵌入式开发建立交叉编译环境
- 如何进入到嵌入式系统开发行业
- 如何为嵌入式开发建立交叉编译环境[转帖]
- 嵌入式系统开发学习如何起步、如何深入?
- 如何为嵌入式开发建立交叉编译环境
- 如何为嵌入式开发建立交叉编译环境
- 嵌入式系统及如何开发自己的嵌入式系统
- 嵌入式系统开发学习如何起步、如何深入?[转]
- 如何自己配置和编译一个完整的Linux嵌入式开发环境?
- 利用VC开发环境进行嵌入式系统内核调试
- 如何组建和管理一个嵌入式系统软件开发团队
- 解答:如何使用PHP开发高效的WEB系统
- 如何为嵌入式开发建立交叉编译环境
- 嵌入式3D-嵌入式3D开发环境的建立-嵌入式linux系统
- 系统环境变量与注册表及.net中如何使用系统环境变量
- 【嵌入式Linux学习七步曲之第一篇 Linux主机开发环境】如何通过vnc图形界面远程控制Linux主机
- 如何为嵌入式开发建立交叉编译环境