zoukankan      html  css  js  c++  java
  • 关于在MDK中使用 printf 函数

    microlib 提供了一个有限的 stdio 子系统,它仅支持未缓冲的 stdinstdoutstderr。 这样,即可使用 printf() 来显示应用程序中的诊断消息。

    要使用高级 I/O 函数,您必须提供自己实现的以下基本函数,以便与您自己的 I/O 设备配合使用。

    fputc()

    为所有输出函数实现此基本函数。 例如,fprintf()printf()fwrite()fputs()puts()putc()putchar()

    fgetc()

    为所有输入函数实现此基本函数。 例如,fscanf()scanf()fread()read()fgets()gets()getc()getchar()

    __backspace()

    如果输入函数使用 scanf()fscanf(),则实现此基本函数。

    Notemicrolib 中不支持的转换为 %lc%ls%a

    下面是完整的资料:

    在keil (我用的是realview mdk3.11)建立ARM的工程时
    其中有一项是选 use MicroLIB
    由于对KEIL不是很熟悉,于是就查了查,得到了以下信息:
    microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。
    microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()
    与缺省 C 库之间的差异

    microlib 与缺省 C 库之间的主要差异是:

    • microlib 不符合 ISO C 库标准。 不支持某些 ISO 特性,并且其他特性具有的功能也较少。

    • microlib 不符合 IEEE 754 二进制浮点算法标准。

    • microlib 进行了高度优化以使代码变得很小。

    • 无法对区域设置进行配置。 缺省 C 区域设置是唯一可用的区域设置。

    • 不能将 main() 声明为使用参数,并且不能返回内容。

    • 不支持 stdio,但未缓冲的 stdinstdoutstderr 除外。

    • microlib 对 C99 函数提供有限的支持。

    • microlib 不支持操作系统函数。

    • microlib 不支持与位置无关的代码。

    • microlib 不提供互斥锁来防止非线程安全的代码。

    • microlib 不支持宽字符或多字节字符串。

    • 与 stdlib 不同,microlib 不支持可选择的单或双区内存模型。 microlib 只提供双区内存模型,即单独的堆栈和堆区。

    • 可以合理地将 microlib 与 --fpmode=std--fpmode=fast 配合使用。

    microlib 中的函数负责:

    • 创建一个可在其中执行 C 程序的环境。 这包括:

      • 创建一个堆栈

      • 创建一个堆(如果需要)

      • 初始化程序所用的库的部分组成内容。

    • 调用 main() 以开始执行程序。

    要使用 microlib 构建程序,必须使用命令行选项 ??library_type=microlib。 根据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。 将此选项与链接器配合使用时,将覆盖所有其他选项。

    Example 3.1 说明了编译器使用此选项的情形,它仅为 main.c 文件选择了 microlib。

    Example 3.1. 编译器选项

    armcc ??library_type=microlib ?c main.c
    
    armcc ?c extra.c
    
    armlink ?o image.axf main.o extra.o

    Example 3.2 说明了汇编程序使用此选项的情形,它仅为 more.s 文件选择了 microlib。

    Example 3.2. 汇编程序选项

    armcc ?c main.c
    
    armcc ?c extra.c
    
    armasm ??library_type=microlib more.s
    
    armlink ?o image.axf main.o extra.o more.o

    Example 3.3 说明了链接器使用此选项的情形,它为 main.cextra.c 文件均选择了 microlib。

    Example 3.3. 链接器选项

    armcc ?c main.c
    
    armcc ?c extra.c
    
    armlink ??library_type=microlib ?o image.axf main.o extra.o
    使用MicroLIB:

    3.3.1. 创建堆栈

    可通过将符号 __initial_sp 定义为与堆栈顶部相等来指定初始堆栈指针。 初始堆栈指针的对齐边界必须为 8 字节的倍数。

    Example 3.4 说明了如何使用汇编语言来设置初始堆栈指针。

    Example 3.4. 汇编语言

         EXPORT __initial_sp
    
    __initial_sp EQU 0x100000         ; equal to the top of the stack

    Example 3.5 说明了如何使用 C 中的嵌入式汇编程序来设置初始堆栈指针。

    Example 3.5. C 中的嵌入式汇编程序

    __asm void dummy_function(void)
    
    {
    
         EXPORT __initial_sp
    
    __initial_sp EQU 0x100000         ; equal to the top of the stack
    
    }

    3.3.2. 创建堆

    可通过定义符号 __heap_base__heap_limit 来分别指定堆的开头和结尾。 完成后,您可以按通常方式使用堆函数。

    Note

    __heap_limit 必须指向堆区中最后一个字节后面的字节。

    Example 3.6 说明了如何使用汇编语言来设置堆指针。

    Example 3.6. 汇编语言

         EXPORT __heap_base
    
    __heap_base EQU 0x400000         ; equal to the start of the heap
    
         EXPORT __heap_limit
    
    __heap_limit EQU 0x800000        ; equal to the end of the heap

    Example 3.7 说明了如何使用 C 中的嵌入式汇编程序来设置堆指针。

    Example 3.7. C 中的嵌入式汇编程序

    __asm void dummy_function(void)
    
    {
    
         EXPORT __heap_base
    
    __heap_base EQU 0x400000         ; equal to the start of the heap
    
         EXPORT __heap_limit
    
    __heap_limit EQU 0x800000        ; equal to the end of the heap
    
    }

    3.3.3. 进入和退出程序

    应在程序开头使用 main()。 不要将 main() 声明为使用参数。

    Note

    程序不能从 main() 返回内容。

    microlib 不支持以下内容:

    • 操作系统中的命令行参数

    • 调用 exit() 的程序

    3.4. 调整 microlib 输入/输出函数

    microlib 提供了一个有限的 stdio 子系统,它仅支持未缓冲的 stdinstdoutstderr。 这样,即可使用 printf() 来显示应用程序中的诊断消息。

    要使用高级 I/O 函数,您必须提供自己实现的以下基本函数,以便与您自己的 I/O 设备配合使用。

    fputc()

    为所有输出函数实现此基本函数。 例如,fprintf()printf()fwrite()fputs()puts()putc()putchar()

    fgetc()

    为所有输入函数实现此基本函数。 例如,fscanf()scanf()fread()read()fgets()gets()getc()getchar()

    __backspace()

    如果输入函数使用 scanf()fscanf(),则实现此基本函数。

    Notemicrolib 中不支持的转换为 %lc%ls%a

    3.5. microlib 中缺少的 ISO C 特性

    本节提供了 microlib 不支持的主要 ISO C90 特性的列表。

    宽字符和多字节支持

    microlib 不支持所有处理宽字符或多字节字符串的函数。 如果使用这些函数,则会产生链接器错误。 例如,mbtowc()wctomb()mbstowcs()wcstombs()。 microlib 不支持在标准附录 1 中定义的所有函数。

    操作系统交互

    microlib 不支持与操作系统交互的所有函数。 例如,abort()exit()atexit()clock()time()system()getenv()

    文件 I/O

    与文件指针交互的所有 stdio 函数将返回错误(如果已实现)。 唯一的例外情况是以下三个标准流:stdinstdoutstderr

    可配置的区域设置

    缺省 C 区域设置是唯一可用的区域设置。

    信号

    虽然提供了 signal()raise() 函数,但 microlib 不会生成信号。 唯一的例外情况是程序显式地调用 raise()

    浮点支持

    浮点支持不符合 IEEE 754 标准。

    产生不可预测的输出的运算是指:

    • 涉及 NaN、无穷大或非正规数

    • 依照正确的 IEEE 754 规则,并非通过不精确结果产生 IEEE 异常。 但是,microlib 不会产生 IEEE 异常,而是返回不可预测的结果。

    另外,microlib 不会将零的符号视为有效位,并且会产生不可预测的输出。

    与位置无关且线程安全的代码

    microlib 没有可重入变体。 microlib 不提供互斥锁来防止非线程安全的代码。 microlib 的

  • 相关阅读:
    GeoMesa Java API-写入与查询数据
    GeoMesa命令行,索引概述
    HBase,以及GeoMesa设计基于HBase的设计分析,从数据模型到典型查询场景,最后进行RowKey设计
    笔趣看小说Python3爬虫抓取
    python网络爬虫
    Kafka客户端Producer与Consumer
    ScalikeJDBC,操作mysql数据,API
    mysqldb
    Python 反射
    Go 类型转换
  • 原文地址:https://www.cnblogs.com/skl374199080/p/3288726.html
Copyright © 2011-2022 走看看