微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440开发工具realview MDK4.22之库的使用

S3C2440开发工具realview MDK4.22之库的使用

时间:11-19 来源:互联网 点击:

1.扩展堆,栈。

2.调用库函数。该库函数需要调用用户定义的函数。例如__rt_fp_status_addr() 或者clock()。

3.调用使用locale或CTYPE的库函数。

4.执行需要浮点单元或者浮点库支持的浮点运算。

5.通过低层函数的输入输出函数,如putc()或间接通过高层函数,如fprintf()等。

6.发起一个错误或其他信号,例如ferror。

二十三。修改用于错误信号,错误处理和程序退出的C库修改

所有由C库发起的陷阱或错误信号都是通过__raise()函数。可以重定义这个函数或者它所使用到的低层函数。

二十四。避免使用堆和使用堆的库函数

IMPORT __use_no_heap from assembly language#pragma import(__use_no_heap) from C.

二十五。在裸机C代码里使用heap

1.调用__init_alloc(base, top)

2.定义函数unsigned _rt_heap_extend(unsigned size, void block)处理扩展堆得需要。

二十六。栈的初始化和堆界限

可以指定栈指针,指定哪一块区域为堆,用以下任何一种方式:

1.定义__initial_sp,如果需要堆, 定义__heap_base and __heap_limit

2.用scatter文件,下列方式之一

2.1定义ARM_LIB_STACK and ARM_LIB_STACK区

2.2不用堆,只需ARM_LIB_STACK

2.3定义一个ARM_LIB_STACKHEAP,此时堆栈是一体的,相向生长。

微库仅支持上述2种方式。

3.实现__user_setup_stackheap()建立栈指针和返回初始堆区域。

4.用遗留的__user_initial_stackheap()也可以实现

初始化堆指针必须指向的时8字节倍数对齐的区域。

默认情况下,潜在的堆栈冲突会被自动探测到且请求的堆分配失败。如果不希望自动的冲突检测,可以通过用#pragma import __use_two_region_memory预留一小段空间。

5.作为遗留的原因,也可以使用__rt_stackheap_init()和__rt_heap_extend()。

二十七。C库中对低层函数的依赖

表中显示了高层函数对低层函数的依赖,如果定义了自己的低层函数版本,可以直接使用高层函数库中的版本。

fgetc()用__FILE,但是fputc()用__FILE和ferror()。

必须提供__stdin和__stdout的定义,如果使用和它们相关的高层函数。虽然重定义了其它函数,如fgetc()和fputc(),它们没有引用任何在__stdin __stdout里的数据。

Table key:

  1. __FILE, the file structure.

  2. __stdin, the standard input object of type__FILE.

  3. __stdout, the standard output object of type__FILE.

  4. fputc(), outputs a character to a file.

  5. ferror(), returns the error status accumulated during file I/O.

  6. fgetc(), gets a character from a file.

  7. fgetwc()

  8. fputwc()

  9. __backspace(), moves the file pointer to the previous character.

  10. __backspacewc().

如果选择重定义fgetc() fputc() __backspace() 要认识到fopen和相关的函数使用ARM默认的FILE结构。如果重定义了__FILE,那么也必须重定义fopen()和相关的函数。

C库输出函数族仅依赖fputc() ferror();C库输入函数族仅依赖于fgetc() __FILE __backspace()。



二十八。重定义低层函数,以便直接使用高层函数库函数

如果你重定义了__FILE fputc() ferror() __stdout可以使用所有的printf()函数族。

Example 9. Retargeting printf()#include struct __FILE{int handle;/* Whatever you require here. If the only file you are using is *//* standard output using printf() for debugging, no file handling *//* is required. */};/* FILE is typedef’d in stdio.h. */FILE __stdout;int fputc(int ch, FILE *f) {/* Your implementation of fputc(). */return ch;}int ferror(FILE *f){/* Your implementation of ferror(). */return 0;}void test(void){printf("Hello world\n");}


二十九。

__backspace()被scanf()函数族使用。

__backspace()必须仅在从流里读取一个字符后调用。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top