我的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)
我想创建一个允许我轻松遍历计时器的结构,类似于在任务列表中循环执行任务。我可能在想这个。
答案 0 :(得分:2)
我认为你错了,只有一个指针和一个解引用运算符,第一个是强制转换运算符。代码可以这样看:
TC0_t *ptc0 = 0x8000 ; // Pointer pointing to the '0x8000 address'
TC0_t TCC0 = *ptc0 ; // Value at the '0x8000 address'
如果这是你所理解的,那么你的问题就不那么清楚......
在您的示例中,如果TCD0
与TCC0
相同,那么您的代码是错误的,因为TCC0
是TC0_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 *
,因此这显然是一个错误(假设TCD0
是TCC0
的拼写错误。)
在我看来,你想要:
xtimer.timer = &TCC0;
或:
#define TCC0 ((TC0_t*) 0x8000)
代码中没有指向指针的指针。