使用COSMIC编译器的stm8l上printf的奇怪行为

时间:2019-07-07 15:48:31

标签: c stm8

printf在某些情况下为我提供了怪异的附加值。可能会发生什么?

我正在处理uint8_t数组中的值,并将其打印到我的终端上,以验证一切是否正确。但是由于某种原因,我在打印uint8_t时会得到怪异的值-我得到了期望值加上一些其他值(它始终是相同的额外值),就像我在打印uint16_t或其他16位值一样。我将其全部修剪为以下示例:

这是测试代码

test_payload[0] = (uint8_t)0x58;
test_payload[1] = (uint8_t)0x7B;
test_payload[2] = (uint8_t)0x6B;
test_payload[3] = (uint8_t)0x05;
test_payload[4] = (uint8_t)0x4F;
test_payload[5] = (uint8_t)0x81;
test_payload[6] = (uint8_t)0x69;
test_payload[7] = (uint8_t)0x00;

printf("%x\n\r", test_payload[0]);
printf("%x\n\r", test_payload[1]);
printf("%x\n\r", test_payload[0] + test_payload[1]);

for(i = 0; i < 8; i++)
{
    printf("%x", test_payload[i]);
}

我得到的输出是

5803
7b03
d3
58037b0333034f03810369033

是什么使其表现得如此?

2 个答案:

答案 0 :(得分:2)

def make_model(): inp = Input(shape=(10,)) h1 = Dense(16, activation='relu')(inp) h2 = Dense(4, activation='linear')(h1) # output layer and last hidden layer must have the same dims out = Dense(4, activation='softmax')(h2) model = Model(inp, out) loss_calculator = SampledSoftmaxLoss(model) model.compile('adam', loss_calculator.loss) return model tf.set_random_seed(42) model = make_model() model.summary() 需要一个%x作为参数;如果您想打印一个字节,例如作为unsigned int,您需要编写uint8_t

答案 1 :(得分:2)

第一个代码片段应产生58,但是您不输出换行符,因此任何后续输出都将在58之后出现。您可能在片段后面的代码中输出86。发布显示出令人反感行为的完整程序,或将格式更改为%x\n,以将58与后续输出分开。

从技术上讲,printf期望为unsigned int转换格式使用%x参数,但是int值应该可以正常工作,并且test_payload[0]会提升为{{ 1}},并原样传递给int。您可以尝试将格式更改为printf或将参数强制转换为%hhx,但是仅凭这些更改之一就可以解决问题,这是令人惊讶的

编辑:,从您的额外信息看来,嵌入式目标的编译器很特殊。一定要像在

中那样强制转换参数
(unsigned int)test_payload[0]

观察到printf("%x\r\n", (unsigned int)test_payload[0]); 似乎工作正常,问题不是传递printf("%x\n\r", test_payload[0] + test_payload[1]);而不是int,这本来就够糟糕的……似乎{{1} }以不符合标准的方式错误地传递了unsigned int值。

另一个潜在的问题根源是,如果您忘记包含printf()并在没有定义原型的情况下调用uint8_t。如果C函数( 6.5.2.2函数调用)(在库中)被定义(带有包含省略号的原型),则将该调用明确定义为具有未定义的行为。 <stdio.h>