【发布时间】:2020-10-07 14:28:13
【问题描述】:
我一直在 Coverity 中调试此 RTOS 代码,但遇到了一些小错误。这些错误是不言自明的,因为它们是格式说明符错误。这两个错误都在主要功能上。第一个错误就行了:
RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);
错误:printf 格式说明符 (PRINTF_ARGS) 的参数类型无效 invalid_type:格式说明符 %X 的参数结果应为 unsigned int 类型,但类型为 unsigned long。
第二个错误就行了:
RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
错误:printf 格式说明符的额外参数 (PRINTF_ARGS) extra_argument:格式字符串未使用此参数:status。
我不确定我如何传递一个额外的参数,因为 RTOS_TEST 确实需要一个参数。请告诉我我做错了什么。
#if !defined(__arc__)
#define RTOS_TEST(...) printf(__VA_ARGS__)
#else
#define RTOS_TEST(...)
#endif
typedef uint_32 _mqx_uint, _PTR_ _mqx_uint_ptr;
typedef uint32_t Status_t;
void SECTION_CODE("CODE_SLOW") WrappersTest(uint_32 parameter)
{
_lwmem_pool_id lwmem_pool_id;
pointer error_ptr;
pointer error2_ptr;
Status_t status;
_mqx_uint result;
BOOL fail = FALSE;
RTOS_TEST("Start MQX integrity tests ...\n");
TestQueue();
TestLightWeightSemaphore();
TestMutexAPI();
TestLightWeightEvent();
TestFastMessageQueue();
TestLightWeightMemory();
#if defined(MQX_TEST_EVENT_TEST)
RTOS_TEST("Calling _event_test ..."); fflush(stdout);
result = _event_test(&error_ptr);
if (result != MQX_OK)
{
RTOS_TEST(" ***FAILED*** _event_test: 0x%08X\n", result);
fail = TRUE;
}
else
{
RTOS_TEST("PASSED!\n");
}
#endif // MQX_TEST_EVENT_TEST
status = RTOS_MutexInit(&testMutex, (uint8_t*)Name);
if (status != STATUS_OK)
{
RTOS_TEST("MQX init mutex FAILED: 0x%08X\n", status);
}
for (; loopCount > 0; loopCount--)
{
status = RTOS_MutexLock(&testMutex);
if (status != STATUS_OK)
{
RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
}
}
int main()
{
.........,
RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);
..........
if (status != STATUS_OK)
{
RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
}
..........
return 0;
}
【问题讨论】:
-
第二个格式字符串缺少
%。第一行的错误似乎不言自明:您的参数类型错误。 -
@AdrianMole 我应该在第一个中使用 %u 还是 0x%08X
-
将
0x%08lX用于无符号长整数。 (注意添加的是小写 L)。 -
@AdrianMole 但 0x%08lX 不是无符号长整数。它要求一个无符号整数。另外,如果我写大写 L 会有什么区别?
标签: c operating-system printf rtos format-specifiers