在 Code Composer Studio 6.1.1 中建立 TMS320F2812 工程,調用 printf("Hello DSP!\r\n") 後編譯報錯:
#10099-D program will not fit into available memory.
placement with alignment/blocking fails for section ".text" size 0x1be0 page 0.
原因:標準 printf 功能龐大 (支持格式化、浮點、寬字符等),生成的代碼段 .text 超過芯片可用 RAM/ROM 空間。
-stack 和 -heap 大小:無效,因為是代碼段溢出,非數據段。rts2800_ml.lib (大內存模型) 替換 rts2800.lib:無效,庫模型不影響 printf 內部實現大小。full 改為 minimal。| 支持級別 | 功能 | 代碼大小 | 適用場景 |
|---|---|---|---|
full | 完整 ANSI C 標準:%f, %e, %g, %lld, 寬字符, 精度/寬度控制等 | 極大 (~7KB+) | PC 應用、資源充足嵌入式 |
minimal | 僅支持 %c, %s, %d, %u, %x, %X, %p, %n 等基本整數/字符/指針格式,**不支持浮點數** | 極小 (~1KB) | 資源受限 MCU/DSP、只需簡單調試輸出 |
no | 完全禁用 printf/scanf,調用鏈接時報錯 | 0 | 極度受限、自行實現輸出 |
若連 minimal 仍嫌大,可自寫 uart_putchar + vsnprintf 精簡版:
// 精簡版 printf,僅支持 %d %s %c %x
void mini_printf(const char *fmt, ...) {
char buf[64];
va_list ap;
va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap); // 需庫支持 vsnprintf
va_end(ap);
for (char *p = buf; *p; p++) uart_putchar(*p); // 發送到串口
}
minimal + 串口輸出。#define DEBUG_PRINT(fmt, ...) do{}while(0) 完全編譯移除。full 库。