This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5529:我们可以在 newlib c 中启用纳米规格吗? 如何获得更小的格式化打印件?

Guru**** 1633940 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1354423/msp430f5529-can-we-enable-nano-specs-in-newlib-c-how-to-get-a-smaller-formatted-print

器件型号:MSP430F5529

您好!

我的开发代码、调试代码以及 sprintf 变得过大、因此我得到以下错误:

msp430-elf-gcc -T /home/summers/msp430/include/msp430f5529.ld -L /home/summers/msp430/include -mmcu=MSP430F5529 -Wl,--gc-sections gcc/sinlookupuart2048.o -o gcc/sinlookupuart2048.out
/home/summers/msp430/lib/gcc/msp430-elf/13.2.0/../../../../msp430-elf/bin/ld: error: final size of uleb128 value at offset 0x71b in .debug_loclists from /home/summers/msp430/lib/gcc/msp430-elf/13.2.0/../../../../msp430-elf/lib/libc.a(libc_a-vfiprintf.o) exceeds available space
很明显、字符串打印占用了太多的空间(我的十六进制文件现在是89KB)。 我可以更正错误、只需手动写入字符串、而不使用 sprintf、然后十六进制文件会降至6KB。

我检查了使用的 c lib 以及它的 newlib c;现在对于某些器件(例如 ARM)、您可以启用能够生成更小 sprintf 的纳米规格。

在 MSP430环境中尝试过这样做、运气不好-看起来 MSP430 newlib c 并不属于通过规格进行选择的微型变体。 我缺少什么吗?

在 MSP430开发环境中、有没有任何更小的格式化 print 语句选项?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    sprintf()和它所绘制的东西都很大。 但不是83kB 大。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我同意-这就是为什么我张贴的实际链接指令,我正在使用-作为怀疑我错过了一些东西。 这里提供了一个~90KB 十六进制文件的代码如果有用:

      uint16_t busy0=HWREGW( ADC12_A_BASE | OFS_ADC12CTL1 )&ADC12BUSY);
    ...
      sprintf(print,"%i%i- \0", busy0,
      	  HWREGW( ADC12_A_BASE | OFS_ADC12CTL1 )&ADC12BUSY);

    提供6KB 十六进制代码的相同代码

      print[0]='0'+(HWREGW( ADC12_A_BASE | OFS_ADC12CTL1 )&ADC12BUSY);
    ...
      print[1]='0'+(HWREGW( ADC12_A_BASE | OFS_ADC12CTL1 )&ADC12BUSY);
      print[2]='-';
      print[3]=' ';
      print[4]=0;

    这就是为什么它对我来说意义不大,所以我认为我的链接是错误的!

    是的、也值得说的是、Intel 十六进制以2个十六进制字节对每个目标字节进行编码-因此目标中的大小差异仅为~40KB

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请使用 msp430-elf-size、而不是按十六进制文件大小执行。 我觉得 gcc 的参数没有什么问题。 我的常用方法是:

    CFLAGS = -g -mmcu=${CPU} -I $(SUPPORT_FILE_DIRECTORY)  -Wall  -Wl,--gc-sections
    

    当我使用浮点格式添加 sprintf 调用时、大小增加了约6KB。

    该器件具有128KB 存储空间、因此即使代码 bloat 也应够用。 当然、假设您使用"-mlarge"编译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我通常使用十六进制文件大小、因为十六进制文件会被去除。 我通常不会剥离 elf 文件、但这样做有两种大小:

    -rwxr-xr-x 1 summers summers 3380 Apr 25 12:07 gcc/sinlookupuart2048.out
    -rwxr-xr-x 1 summers summers 33080 Apr 25 12:09 gcc/sinlookupuart2048.out
    

    您可以看到、它的包装盒上实际增加了大约30KB 的大小。 目标文件的大小几乎完全相同。 我认为它所需要的链接标志不是它-它只是在链接到 libc 期间,我得到 bloat。

    并尝试了 SIZE 命令、

       text	   data	    bss	    dec	    hex	filename
      29974	   1850	    212	  32036	   7d24	gcc/sinlookupuart2048.out
    

    因此、大部分大小位于来自 libc 的文本中! 有多奇怪。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    虽然它是一个.elf 文件、但常规的 Linux bintools 版本的大小也能正常工作。 它们也可以用于您的.o 文件。

    有许多工具可用于检查 elf 文件。 "msp430-elf-readelf -A"将显示有关它的信息、"msp430-elf-objdump -S"将会反汇编它。 两者都应提供一些有关额外代码来源的提示。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、您还可以告诉链接器输出一个映射文件、显示其放置内容的位置。 以及在何处得到它们。 可能比您想要的信息更多。

    将其添加到 gcc 选项:-wl、-Map=yourfilenamehere.map