【问题标题】:Understanding this embedded c code理解这个嵌入式 c 代码
【发布时间】:2011-07-07 20:10:51
【问题描述】:

我正在尝试理解这个嵌入式 c 代码。我认为这意味着它将端口位连接到总线中的某个寄存器。如我错了请纠正我。我们对端口所做的任何更改都将反映在总线寄存器上。这是代码的sn-p。谢谢。

/*--------------------------------------------------------------------------
Local Variables
--------------------------------------------------------------------------*/
// Port bits assigned to Amba Peripheral Bus (APB)
// P0^7..P0^0               // output=reg_addr, input=data_in (APB prdata)
sbit APB_SEL = P1^7;        // select a bus transaction
sbit APB_EN  = P1^6;        // enable/activate a component 0 = disable, 1 = enable

【问题讨论】:

  • 您发布的代码是高度宏化/类型定义的,几乎不可能从您发布的小片段中分辨出来。我建议你寻找sbitP1的定义给你一些线索。
  • @Dave - 显然它比你(或我)想象的更糟糕(见下面 Praetorian 的回答)。显然,“sbit”和“^”是特定于编译器的扩展(不,^ 不是 XOR 运算符......)呃。

标签: c embedded


【解决方案1】:

代码定义要从寄存器读取的位位置。 sbit 在特殊功能寄存器 (SFR) 中定义一个位。

sbit APB_SEL = P1^7;

这里的P1 是先前定义的SFR。该行将 APB_SEL 定义为 P1 的第 7 位(从零开始的编号)。

This 链接包含有关语法的更多详细信息。

【讨论】:

  • 网址 +1。我并不完全清楚异或操作是如何做到这一点的,但这与它似乎是记录在案的行为相比不太相关。
  • @Jonathan Leffler:我认为这不是 XOR 操作,它看起来像是专门为此目的而发明的一些伪语法。
  • 只有 8051(或其变体)编译器才能理解的 C :-) 嵌入式编译器始终构成这样的关键字和语法。例如,我在工作中使用的 TI 编译器包括 cregisterinterrupt 等关键字。
  • 非常感谢Praetorian。你的回复真的很有帮助! :)
  • @Praetorian:您可能是正确的,因为它是特定编译器的特殊语法。这是一个不同的世界,似乎。我必须跨平台工作;显然,使用该符号的代码或多或少不能跨平台工作。 (它不会像我在我工作的机器上使用的编译器所描述的那样工作)。对于某些程序的特定于机器的部分,可以将类似的东西小心地放入一个贫民窟,但我们很少能如此接近硬件。其他人可能经常这样做;世界很大,但即便如此,这也让人大开眼界。
【解决方案2】:

sbit 类型在特殊功能寄存器 (SFR) 中定义一个位。它以下列方式之一使用:

sbit name = sfr-name ^ bit-position;
sbit name = sfr-address ^ bit-position;
sbit name = sbit-address;

在哪里

name 是 SFR 位的名称。

sfr-name 是先前定义的 SFR 的名称。

bit-position 是位在 SFR 中的位置。

sfr-address 是 SFR 的地址。

sbit-address是SFR位的地址。

对于典型的 8051 应用,通常需要访问 SFR 中的各个位。 sbit 类型提供对可位寻址的 SFR 和其他可位寻址的对象的访问。 例如:

sbit EA = 0xAF;

此声明将 EA 定义为地址 0xAF 处的 SFR 位。在 8051 上,这是中断使能寄存器中的使能所有位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2011-02-21
    相关资源
    最近更新 更多