S3C2440开发工具realview MDK4.22之库的使用
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:
__FILE, the file structure.
__stdin, the standard input object of type__FILE.
__stdout, the standard output object of type__FILE.
fputc(), outputs a character to a file.
ferror(), returns the error status accumulated during file I/O.
fgetc(), gets a character from a file.
fgetwc()
fputwc()
__backspace(), moves the file pointer to the previous character.
__backspacewc().
C库输出函数族仅依赖fputc() ferror();C库输入函数族仅依赖于fgetc() __FILE __backspace()。
二十八。重定义低层函数,以便直接使用高层函数库函数
如果你重定义了__FILE fputc() ferror() __stdout可以使用所有的printf()函数族。
Example 9. Retargeting printf()#includestruct __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()必须仅在从流里读取一个字符后调用。
S3C2440开发工具realviewMDK4 2 相关文章:
- S3C2440开发工具realview MDK4.22使用入门(11-19)
- Linux2.4内核为我们带来了什么?(11-12)
- RedHatLinux新手入门教程(11-12)
- RedHatLinux新手入门教程(2)(11-12)
- 让Windows系统也能访问Linux文件系统(04-15)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)