内存映射指向指针?

时间:2014-06-28 19:22:36

标签: c pointers syntax microcontroller

我的C非常生疏,但我想知道我是否在理解以下语法的情况下走上正轨。(这是在io头文件中)

#define TCC0 (*(TC0_t*) 0x8000)

TCC0      TC0_t
[ • ] --→ [ • ] --→ [xxxx xxx] 0x8000
  • [•] =指针
  • TC0_t是一个结构,这里基本上是结构定义的样子。

    typedef struct TC0_struct
    {
        ...
    }TC0_t;
    

所以我的假设是TCC0指向一个结构指针,该指针指向与我的微控制器上的定时器寄存器对应的存储器地址。

如果我想为多个计时器创建自己的结构,如果这是真的,myTimer结构看起来像

typedef struct myTimer
{
    TC0_t    *timer;
    //other useful stuff
 }myTimer;

myTimer Xtimer;
xtimer.timer = TCD0;

感谢。

编辑:

所以holt建议在myTimer中添加更多内容。基本上我会有不同的定时器对应不同的端口,这将在io头文件

#define TCC0 (*(TC0_t*) 0x8000)
#define TCD0 (*(TC0_t*) 0x9000)

我想创建一个允许我轻松遍历计时器的结构,类似于在任务列表中循环执行任务。我可能在想这个。

3 个答案:

答案 0 :(得分:2)

我认为你错了,只有一个指针和一个解引用运算符,第一个是强制转换运算符。代码可以这样看:

TC0_t *ptc0 = 0x8000 ; // Pointer pointing to the '0x8000 address'
TC0_t TCC0 = *ptc0 ; // Value at the '0x8000 address'

如果这是你所理解的,那么你的问题就不那么清楚......

在您的示例中,如果TCD0TCC0相同,那么您的代码是错误的,因为TCC0TC0_t而不是TC0_t*的实例。如果TCD0不是TCC0,那么可以解释它是什么。

顺便说一下,请注意命名约定:如果你不想使用以大写字母开头的caml case,至少不要用大写字母开始你的变量,这对任何人来说都可能是误导想要了解你的代码。

答案 1 :(得分:2)

这里只有一个指针。第一个*是指针解除引用。

如下定义:

#define TCC0 (*(TC0_t*) 0x8000)

TCC0表示:

  • 取整数0x8000
  • 将其转换为指向TC0_t
  • 的指针
  • 在该指针下访问值。

TCC0的行为类似于TC0_t类型的常规变量。如果你想将它传递到某个地方,你有三个选择:

TC0_t timer = TCC0;
TC0_t *timer = &TCC0;
TC0_t *timer = (TC0_t*) 0x8000;

请记住,第一个只会复制当前值。其他两个应该完全相同。

答案 2 :(得分:1)

#define TCC0 (*(TC0_t*) 0x8000);

这是一个宏定义。在程序中使用它时,文本TCC0将替换为(*(TC0_t*) 0x8000);。例如:

xtimer.timer = TCC0;

变为:

xtimer.timer = (*(TC0_t*) 0x8000);;

(注意双重分号。你应该(可能)从不在宏定义中添加尾部分号。)

常量0x8000转换为类型TC0_t *的指针,产生实现定义的结果。然后取消引用该指针,得到类型为TC0_t的值(从地址0x8000中检索)。

在您的代码中,xtimer.timer的类型为TC0_t *,因此这显然是一个错误(假设TCD0TCC0的拼写错误。)

在我看来,你想要:

xtimer.timer = &TCC0;

或:

#define TCC0 ((TC0_t*) 0x8000)

代码中没有指向指针的指针。