2

在我的 8 位 Freescale HCS08 micro 上,每当我调用一个返回值到指针的库函数时,我都会传递它,但我并不真正想要它们,我输入了一个 NULL,例如

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

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

但是,每次调用该函数时,我的微型计算机上的端口 A 都会出现问题,并且调试将我指出该论点将事情搞砸了。端口 A 的配置寄存器位于地址 0x0000 和 0x0001,这是NULL(aka (void *)0) 指向的位置。我认为NULL这是某种魔法,它实际上不会做任何事情,但似乎并非如此。

我的解决方法感觉真的很hack:

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

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

4

2 回答 2

9

除非 UART_SendBlock 的文档声明传递一个 NULL 指针是可以的,否则如果你这样做,你可能会得到未定义的行为 - 在这种情况下,函数似乎只是写入你传递它的地址,地址 0 - 这将在“未定义行为”。

只需用参数调用它,没有理由对此“聪明”。

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

如果您资源有限,请创建unused_16一个全局并在其他地方重用它

于 2010-08-03T22:00:12.327 回答
3

该函数正在尝试将值写入最后一个参数指向的任何位置。您传入 NULL (0x0000),因此结果被写入内存位置 0x0000 或您的端口 A。通常(在一般编程中)该函数会检查参数,如果是,则不会尝试写入该位置NULL,但似乎此函数不遵循该约定。即使您不打算使用它,您也需要为函数分配一个变量以将其结果写入其中。

于 2010-08-03T22:00:04.450 回答