【发布时间】:2021-12-01 15:25:15
【问题描述】:
我想通过 UART 发送字符串来用 C 语言调试我的微控制器程序。
现在我面临将调试字符串连接在一起的问题,因为我必须使用 c 字符串。
我需要在堆栈上有debugMessageOnStack。
考虑以下示例: 我需要一个像“我最喜欢的颜色是蒙巴顿粉红色”这样的字符串
const char debugMessageStart[] = "My favorite color is ";
const char* colors[MAX_COLORS] = {[GREEN] = "green", [ORANGE] = "orange", [PINK] = "mountbatten pink"};
char debugMessageOnStack[DEBUG_MESSAGE_LENGTH];
我知道手动计算DEBUG_MESSAGE_LENGTH 很容易,但我希望它是动态计算的,所以每次我添加一个比所有现有颜色都长的新颜色字符串时,我不必手动重新计算它字符串。
理论上应该是可能的,因为colors 中的每个字符串长度在编译之前都是已知的,但我不知道该怎么做。
谢谢!
【问题讨论】:
-
简单的方法:如果你不是真的缺少堆栈空间,你应该只声明
char debugMessageOnStack[DEBUG_MESSAGE_LENGTH];,DEBUG_MESSAGE_LENGTH]比任何消息都长,例如 300,这应该绰绰有余。 -
@Jabberwocky 在堆栈上分配 300 字节在大多数微控制器系统中是不允许的,即使是高端系统也是如此。如果您需要那么多,您可以将其分配为
static中的.bss。 -
我现在添加了嵌入标签。微控制器是一种具有内置硬件外围设备的嵌入式系统 CPU。它不是一个从事金融工作的小人物,也不是个人电脑。因此,答案需要适合微控制器嵌入式系统。
-
更好的解决方案可能是不要尝试在内存中组装整个字符串,而只是将其逐步输出到串行输出流。如果您的串行 I/O 被缓冲,那么您将有效地使用现有的缓冲区来组装字符串。
-
@Clifford 如果它使用 DMA,那么可能需要提前(在 DMA 缓冲区中)一次写下所有内容。
标签: c string embedded microcontroller