地址0被HCS08上的NULL指针覆盖

时间:2010-08-03 21:50:26

标签: c null embedded 8-bit 68hc11

在我的8位Freescale HCS08 micro上,每当我调用一个库函数返回指向我传递它的指针时,我真的不想要它们,我会抛出一个NULL,例如。

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定义到处理器上未使用的内存段,但这会导致立即重置。

2 个答案:

答案 0 :(得分:9)

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

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

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

如果您受资源限制,请将unused_16设为全局,并在其他地方重复使用

答案 1 :(得分:3)

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