在我的8位Freescale HCS08 Micro上,每当我调用库函数返回值的库函数时,我都会通过它,而我真的不想要它们,我都会扔进空中,例如

UART_SendBlock((char *)txstr, strlen(txstr), NULL);

最后一个参数的类型是 uint16_t * 并返回实际发送的字符数量,这是我不在乎的值。

但是,每次调用该功能时,我的微型港口A上都有问题,并且调试使我指出了这一论点使事情搞砸了。端口A的配置寄存器现场直播在地址0x0000和0x0001,这是 NULL (又名 (void *)0)积分。我想 NULL 它是某种程度上什么都不会做任何事情的魔术,但似乎并非如此。

我的解决方法真的很骇客:

#define MNUL (void *)(&mynull)
uint32_t mynull;

有更好的解决方案吗?我尝试将MNUL定义为我的处理器上未使用的内存段,但这会立即重置。

有帮助吗?

解决方案

除非UART_SENDBLOCK的文档指出将其传递给无效指针是可以的,否则您可能会得到未定义的行为 - 在这种情况下,似乎函数只是写入地址的函数,地址为0,它将在“未定义”下进行。行为”。

只需使用一个参数称呼它,就没有理由对此“聪明”。

uint16_t unused_16;
UART_SendBlock((char *)txstr, strlen(txstr), &unused_16);

如果您受到资源的限制,请进行 unused_16 全球并在其他地方重复使用

其他提示

该函数试图将值写入最后一个参数点的位置。您是通过null(0x0000)传递的,因此结果是写入内存位置0x0000或您的端口A。通常(通常编程)该函数会检查参数,而不会在位置上写入该位置。 null,但看来此功能并不遵循该约定。即使您不使用它,您也需要分配一个变量才能将其编写结果写入。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top