如何在嵌入式系统中使用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信息。

在C++ class 中使用CUDA

现在位置:首页 >> 正文在C++ class 中使用CUDA(包含texutre 2d的使用) 发表时间:2008-12-24晚上熬夜写了一个简单的C++ class 封装CUDA的demo,里面涉...
  • mydear_33000
  • mydear_33000
  • 2010年11月23日 14:49
  • 596

PCL(Point Clouds Library)在windows下的环境配置与使用

(注:本文实验环境为windows7+VS2010)     PCL是3D的视觉与图形库,可以说是OpenCV的little sister,这个库好像是2011年年中才放出来的,所以相关的资料还比较...
  • chentingpc
  • chentingpc
  • 2012年03月05日 00:14
  • 10381

C如何调用C++的库

前段时间遇到了一个C调用C++的接口的问题,现在把思路整理一下。提供给我们的是C++头文件(.h)和静态库(.a)C不可以直接调用C++,我们采用C++调用C++的方法,另外建一个适配层在我们的C++...
  • pochuanpiao
  • pochuanpiao
  • 2010年07月16日 20:15
  • 5090

TS科普26 SDT解析

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

UE4 引用Windows自带的静态库和动态库

想在UE4 引擎源码模块中引用windows 系统自带的静态库和静态库,方法很简单。 找到源码所在的模块的"*.Build.cs"文件,在对应的Platform分支下面: 静态库:PublicAddi...
  • u011417605
  • u011417605
  • 2017年11月08日 09:46
  • 125

libcurl在嵌入式设备C 的使用

最近公司用
  • linuxjourney
  • linuxjourney
  • 2014年08月05日 15:44
  • 2369

ARM嵌入式系统移植环境搭建

ARM嵌入式系统移植环境搭建 安装eldk42 QA 列表 安装eldk时报sh opteldkbinrpm not found footnote 找不到ia32-libs包E Package ia3...
  • taotaoyouarebaby
  • taotaoyouarebaby
  • 2016年09月23日 23:35
  • 891

zabbix client端安装

安装基础软件包 yum install wget vimtree gcc gcc-c++ -y安装zabbix_agentdgroupadd -g zabbix useradd -g zabbix ...
  • lijingkuan
  • lijingkuan
  • 2017年02月12日 01:56
  • 226

《调用opencv库的简单makefile示例》

SRCS = $(wildcard *.cpp) # wildcard把 指定目录 ./ 下的所有后缀是cpp的文件全部展开。 OBJS = $(SRCS:.cpp = .o) # OBJ...
  • u011583798
  • u011583798
  • 2017年11月08日 11:26
  • 174

如何在Ubuntu中使用Eclipse + CDT开发C/C++程序

在Ubuntu中安装Eclipse和CDT步骤如下:   1. 下载资源(都下载到/home/maxw/Download/Eclipse下)     A、 下载JRE(Java Runtime ...
  • zhuyi12315
  • zhuyi12315
  • 2014年06月12日 09:17
  • 276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在嵌入式系统中使用C库(SDT开发环境)
举报原因:
原因补充:

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