复位8051微 Controller 后,所有端口引脚锁存器均设置为值“1”。现在,我正在阅读这本书“Embedded C”,它指出以下代码的问题是它可能使开发人员陷入一种错误的安全感中:

// Assume nothing written to port since reset
// – DANGEROUS!!!
Port_data = P1;

如果以后有人修改程序以包含用于写入同一端口的全部或部分端口的例程,则此代码通常无法按要求运行:
unsigned char Port_data;
P1 = 0x00;
. . .
// Assumes nothing written to port since reset
// – WON’T WORK BECAUSE SOMETHING WAS WRITTEN TO PORT ON RESET
Port_data = P1;

精通嵌入式c的人都可以向我解释为什么此代码行不通?它所做的只是将0分配给char变量。

最佳答案

潜在问题。

1)与端口关联的数据方向寄存器(DDR)可能未按预期设置,因此在加电时,DDR可能会设置为“输入”。因此,将端口写入0可能会意外地不会读取0。

2)与该端口关联的数据方向寄存器可能已设置为“输出”,而“读取”数据可能没有明确的含义。根据体系结构,可能需要幻像位来遮盖输出位以进行回读。

3)上电代码可能会通过复位命令输入,无非就是跳转到“复位 vector ”。因此,与“冷”启动有关的任何硬件特定操作都不会发生,因为这是“热”启动。

解决方案:

在加电代码上,显式设置DDR和输出值(以及所需的影子位)。

可能不适用于8051,这通常与嵌入式处理器有关。

10-08 01:11