【问题标题】:Declaring/adressing output port on a microchip声明/寻址微芯片上的输出端口
【发布时间】:2014-01-07 18:26:32
【问题描述】:

我是 C 的新手,正在尝试编写一些带有七段显示器的基本应用程序。在声明绝对地址时,对于 8 位端口,我可以编写如下内容:

typedef char *port8ptr;
#define OUT_ADR 0x400
#define OUT *((port8ptr) OUT_ADR)

然后简单地写出类似的变量

OUT = 0x80;

获取十六进制 80 到端口。但是上面的代码到底是什么意思?也就是说,为什么要定义一个指针(第一行),然后将地址转换为指向指针的指针(?!)?它显然有效,但我不太喜欢使用我无法理解的示例中的代码。

他们进行类型转换的另一种方式是使用行

((unsigned char *) 0x400)

但老实说我也不明白。

非常感谢!

阿克塞尔

【问题讨论】:

    标签: c microprocessors


    【解决方案1】:

    当你完成所有预处理后,你会得到这一行:

    *((char*)0x400) = 0x80;
    

    让我们剖析一下。 (char *)0x400 表示将数字 0x400 转换为“pointer-to-a-char”。基本上它在这里说:让我们创建一个指向地址0x400的指针。

    然后,我们将 * 放在前面,它的意思是“取消引用”,这样你就可以在指针指向的内存点(在本例中为地址 0x400)中实际写入一些内容。然后你在里面写0x80

    【讨论】:

    • 谢谢,我想我现在明白了!所以基本上我们对“(port8ptr)OUT_ADR”行所做的是将地址转换为指针,然后取消引用它以实际向表达式前面带有星号的端口写入一些东西?
    【解决方案2】:

    这里的混淆是第二行 - 你认为它是一个指向指针的指针的转换,而它实际上是指针转换的取消引用。

    让我们回到基础。保存你有一个字符和指向该字符的指针

    char c = 'A';
    char *p = &c;
    

    您可以取消引用 p 并返回 c - printf('%c', *p) 将打印 A,*p='B' 会将 c 的内容更改为 B。

    另一个基本的事情是将整数转换为指针 - ((char *)0x400) 表示指向地址 0x400 处的字节的指针。

    所以第二行实际上意味着'将 0x80 写入地址 0x400 处的字节'

    【讨论】:

    • 谢谢!但是我可以简单地写“char *ptr; ptr = 0x400; *ptr = 0x80”。在我看来,这应该启动一个指针,将“指针地址”设置为 0x400,然后取消引用它并将 0x80 写入 ptr 指向的位置?
    【解决方案3】:

    语言 B 和 C 的最大区别在于 C 添加了类型。因此,您可以为某个地方指定一个地址,该类型会告诉编译器是否需要为该值加载一个、两个、四个或更多字节。因此,虽然您可以指向系统中的任何地址,但您需要向编译器提供有关您要加载的该位置有多少字节的附加信息。这些都会做不同的负载:

    int x1= * ( unsigned char *) 0x400 ;
    int x2= * ( unsigned short *) 0x400 ;
    int x4= * ( unsigned int *) 0x400 ;
    

    所以x1 将有来自0x400 的一个字节数据,而x4 将有四个字节。这就是为什么你告诉编译器地址是什么,然后让它去查找那里的值。

    【讨论】:

    • 谢谢!我必须更多地检查这种类型,尤其是在使用指针算法时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多