在我的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定义到处理器上未使用的内存段,但这会导致立即重置。
答案 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,但看起来此函数不遵循该约定。您需要为函数分配一个变量来写入其结果,即使您不打算使用它。