嵌入式C和8051微控制器

5

在8051微控制器复位时,所有端口引脚锁存器的值都被设置为“1”。现在我正在阅读这本书《嵌入式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赋值给一个字符变量。

2个回答

2
潜在问题。
1)与该端口关联的数据方向寄存器(DDR)可能没有设置为预期值,因此在上电时,DDR 可能被设置为“input”。 此时将端口写为0可能会意外地不读取0。
2)与该端口关联的数据方向寄存器可能已被设置为“output”,并且“reading” 数据可能没有清晰的含义。 根据架构,可能需要幻影位来阴影输出位以进行读取。
3)上电代码可能通过重置命令进入,该命令只是跳转到“复位向量”。 因此,与“冷”上电相关的任何硬件特定操作都没有发生,因为这是“热”上电。
解决方案:
在上电代码中,显式 设置DDR 和输出值(根据需要设置幻影位)。
可能不适用于8051 - 一般针对嵌入式处理器。

-1
我几个月前也读了同一本书,遇到了同样的困惑。后来在使用PIC18和M0+进行项目开发时,我逐渐弄清楚了它的真正含义。
实际上,这不是一个软件/编程问题,而是一个硬件/电子问题。如果你的805X代码想要从引脚的外部输入读取1和0,那么代码必须事先向引脚写入1。如果你的代码事先将0写入引脚,外部外设就无法拉高引脚并允许代码读取1。为什么?因为涉及到电子元件!可以想象,如果你想享受窗外的风景,你必须先打开窗户。
如果你真的感兴趣,可以自己搜索“引脚值与锁存器值”的内容。我认为程序员可以把这个问题留给硬件工程师。我相信805X没有像现代芯片那样拥有DDR。在输入和输出模式之间切换引脚可能很容易,但也很令人困惑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接