大家好,
我使用 CCS11和 SDK 5.30。
我对 CCS11中编译器附带的 snprintf 函数有两个问题。
1.多线程
据我所知,snprintf 在最常见的实现中是线程安全的。
我检查了 snprintf 调用函数_PRINTFI,该函数也只使用区域变量。
我还在_PRINTFI 的描述中找到了以下评论。
对于 多线程应用,如果在 */上调用此函数,则为/*
/* 代表 fprintf,printf,vfprintf 或 vprintf,调用站点应该 */
/* 封装在保证单线程 */的关键部分中
/* 对文件流的访问。
因此,我假设 snprintf 的 TI 实现也是线程安全的。
我是对的?
2.空指针作为目标缓冲区
以下各行显示了一个示例代码,该代码读取,写入地址0,并使用 NULL 指针调用 snprintf 作为目标缓冲区。
{
#define ADR0 (*(volatile UINT32_t *)(0x0000))
UINT32_t u32_value = ADR0;
log_info (“读取 ADR 0:0x%x”,u32_value);
ADR0 = 0x12345678;
u32_value = ADR0;
log_info (“写入0x12345678后读取 ADR 0:0x%x”,u32_value);
ADR0 = 0x12345678;
I32_result = snprintf((char*) NULL,(size_t)64,“TestString”);// strlen =10
log_info (“格式0:返回%d”,i32_result);
}
结果:
读取 ADR 0:0x20004000
写入0x12345678:0x20004000后读取 ADR 0
格式0:返回10
据我所知,snprintf 的行为与 C99一致。
但我想知道,从地址 NULL 开始的写入真的会发生(见图)。
地址 NULL 似乎是包含堆栈起始位置的映射的第一个 ROM 地址。
我假设对地址 NULL 的写入被忽略,因为内存保护处于非活动状态。
是这样计划的吗?
TIRTOS 7中的行为是否相同?
此致,
罗马