如何包含 snprintf 而无需 printf 所需的系统调用?

问题描述 投票:0回答:1

在嵌入式平台上,

printf
所需的系统调用通常不可用。标准解决方案是编写简单的存根,例如对于
_write

我不需要也不想要 printf。我需要

snprintf
进行内部字符串格式化。有没有什么方法可以在不必删除系统调用的情况下实现这一点,因为系统调用无论如何都不会被调用?

仅仅为了获得内部字符串格式化例程就必须为系统调用编写存根,这似乎是一种倒退。


更新

如果我

snprintf
一个恒定的字符缓冲区,它链接得很好。这可能是因为编译器取出
snprintf
并只使用
puts

但是如果我有

"%d"
格式字符串,则会出现链接器错误。

编译命令(本文已自动换行):

$ make flash -B
arm-none-eabi-gcc src/main.c -W -Wall -Wextra -Werror 
-Wundef -Wshadow -Wdouble-promotion -Wformat-truncation 
-Wconversion -Wno-attributes -DSTM32F446RE -DSTM32F446XX 
-DSTM32F4 -g3 -Os -fno-common -ffunction-sections 
-fdata-sections -fanalyzer -I. -I./libopencm3/include 
-MMD -mcpu=cortex-m4 -mthumb -mfloat-abi=hard 
-mfpu=fpv4-sp-d16  -Tconfig/link.ld 
--static -nostartfiles -L./libopencm3/lib -lopencm3_stm32f4 
-Wl,--fatal-warnings -Wl,--gc-sections -Wl,--cref 
-Wl,-Map=firmware.map 
-o firmware.elf

错误:

/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libg.a(lib_a-sbrkr.o): in function `_sbrk_r':
/build/newlib-pB30de/newlib-3.3.0/build/arm-none-eabi/thumb/v7e-m+fp/hard/newlib/libc/reent/../../../../../../../../newlib/libc/reent/sbrkr.c:51: undefined reference to `_sbrk'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libg.a(lib_a-abort.o): in function `abort':
/build/newlib-pB30de/newlib-3.3.0/build/arm-none-eabi/thumb/v7e-m+fp/hard/newlib/libc/stdlib/../../../../../../../../newlib/libc/stdlib/abort.c:59: undefined reference to `_exit'
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/10.3.1/../../../
...
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libg.a(lib_a-readr.o): in function `_read_r':
/build/newlib-pB30de/newlib-3.3.0/build/arm-none-eabi/thumb/v7e-m+fp/hard/newlib/libc/reent/../../../../../../../../newlib/libc/reent/readr.c:49: undefined reference to `_read'
collect2: error: ld returned 1 exit status
c io embedded printf
1个回答
0
投票

(部分)问题是有些东西想要中止,并且中止调用 printf (不仅仅是 snprintf)。

您可以通过删除 abort 来防止这种情况发生。

看起来也需要 malloc。如果您有嵌入式版本,您可能还想存根 malloc,或者使用标准 c 库 malloc 但存根 _sbrk 告诉它从哪里获取内存。

© www.soinside.com 2019 - 2024. All rights reserved.