如何在嵌入式系统中使用C库(SDT开发环境)

原创 2004年07月05日 22:40:00

在嵌入式系统开发中,可以根据需要选择是否采用C库,如果应用程序较大,可能需要经常使用C库中的一些函数,如需要使用动态分配内存mallocfreestdio.h中的printfsprintfstring.h中的strcmpstrcpy等等。这时移入合适的C库是很好的选择,本文主要讲述在SDT2.5版本的ARM编译开发工具中使用C库需要解决的一些问题。

    SDT2.5版本的开发环境中,可以采用semihosted ANSI C library或者Embedded C libraryEmbedded C只是作为ANSI C的一个子集。ANSI C一般适用于早期的开发工作,可以和AngleARMulator等软件调试工具配合使用,方便软件的开发,在用户自己的代码执行之前,使用库前,所有的系统初始化工作必须完成。后者由于代码更小,不使用底层硬件资源,在与应用程序集成的时候比较适合与最终的版本发布。而且配合一些硬件调试仿真工具,对于程序的调试来讲,应该非常方便。

    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)

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

   代码实例:

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/,该目录下有四个库文件,分别对应16biglittle32biglittle

2)代码必须重新实现实现__main(),_main(),不然在SDT下编译会出错。

3)如果使用c库函数,根据需要可能还要实现__rt_trap, __rt_errno_addr, __rt_ft_status_addr,具体实现同__rt_heapdescriptor(), 但在SDT下不会编译出错,在symbol table中会出现undefinded weak reference信息。

使用ARM标准C库进行嵌入式应用程序开发

引 言     随着对高处理能力、实时多任务、超低功耗等方面需求的增长,高端嵌入式处理器已经进入了国内开发人员的视野,并在国内得到了普遍的重视和应用。ARM是目前嵌入式领域应用最广泛的RISC微处理...
  • zhanglianpin
  • zhanglianpin
  • 2012-02-25 18:02:42
  • 1201

嵌入式系统的c程序设计

  • 2009年10月26日 11:05
  • 1.61MB
  • 下载

opencv嵌入式ARM系统中安装

转自:http://wiki.opencv.org.cn/index.php/%E5%B5%8C%E5%85%A5%E5%BC%8FARM%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%...
  • yueguanyun
  • yueguanyun
  • 2016-05-03 16:31:59
  • 1985

初学者如何在linux/ubuntu下搭建c/c++编程环境

编译器的安装 Linux 下最流行的C/C++ 编译器是 gcc. 安装 gcc 只需在终端输入命令   sudo apt-get install build-essential ...
  • liuqinstudy
  • liuqinstudy
  • 2013-06-04 15:21:26
  • 2787

易写易库(EXEK)开发手册 v0.1

  • 2008年08月26日 23:26
  • 242KB
  • 下载

C++ webkit调用javascript

要在c++代码中调用Javascript函数,首先要做的是得到需要调用的Javascript函数的引用。 第一步:得到定义了该函数的Javascript context。 WinLaunche我没有...
  • cyxz061111
  • cyxz061111
  • 2011-09-21 20:47:39
  • 4903

TS科普26 SDT解析

SDT, Service description section,服务描述段 SDT可以提供的信息包括: (1) 该节目是否在播放中 (2) 该节目是否被加密 (3) 该节目的名称...
  • cabbage2008
  • cabbage2008
  • 2016-06-29 10:49:15
  • 1261

wxwidgets配置

  • 2007年08月27日 09:29
  • 26KB
  • 下载

在visual studio中使用C语言

  • 2012年04月07日 20:11
  • 725B
  • 下载

visual studio2010使用c语言

  • 2012年04月07日 20:08
  • 390B
  • 下载
收藏助手
不良信息举报
您举报文章:如何在嵌入式系统中使用C库(SDT开发环境)
举报原因:
原因补充:

(最多只允许输入30个字)