有人可以向初学者解释以下构造:
typedef struct
{
__IO uint32_t CTRL; /**< Control Register */
__IO uint32_t CNT; /**< Counter Value Register */
__IO uint32_t COMP0; /**< Compare Value Register 0 */
__IO uint32_t COMP1; /**< Compare Value Register 1 */
__I uint32_t IF; /**< Interrupt Flag Register */
__IO uint32_t IFS; /**< Interrupt Flag Set Register */
__IO uint32_t IFC; /**< Interrupt Flag Clear Register */
__IO uint32_t IEN; /**< Interrupt Enable Register */
__IO uint32_t FREEZE; /**< Freeze Register */
__I uint32_t SYNCBUSY; /**< Synchronization Busy Register */
} RTC_TypeDef;
#define RTC_BASE (0x40080000UL)
#define RTC ((RTC_TypeDef *) RTC_BASE)
尤其是最后一行
为什么括号如此不寻常? *是什么意思?指针或乘法运算符?
由于
答案 0 :(得分:0)
为什么括号如此不寻常? *是什么意思?指针或 乘法运算符?
*
这里是指针而不是乘法运算符。
宏观上没有什么不寻常之处。只是将地址类型转换为类型struct RTC_TypeDef
答案 1 :(得分:0)
结构定义非常简单,变量封装在结构中。然后可以将该结构引用为[diff]
tool = winmerge
[difftool "winmerge"]
cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"
[difftool]
prompt = false
[merge]
tool = winmerge
[mergetool "winmerge"]
cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\"
[mergetool]
keepBackup = false
trustExitCode = false
,因为您使用RTC_TypeDef
。
typedef
以下行表示每次编写typedef struct
{
__IO uint32_t CTRL; /**< Control Register */
__IO uint32_t CNT; /**< Counter Value Register */
__IO uint32_t COMP0; /**< Compare Value Register 0 */
__IO uint32_t COMP1; /**< Compare Value Register 1 */
__I uint32_t IF; /**< Interrupt Flag Register */
__IO uint32_t IFS; /**< Interrupt Flag Set Register */
__IO uint32_t IFC; /**< Interrupt Flag Clear Register */
__IO uint32_t IEN; /**< Interrupt Enable Register */
__IO uint32_t FREEZE; /**< Freeze Register */
__I uint32_t SYNCBUSY; /**< Synchronization Busy Register */
} RTC_TypeDef; /** @} */
时,编译器都会将该行替换为RTC_BASE
(0x40080000UL)
最后,以下几行可以分为两部分:
#define RTC_BASE (0x40080000UL)
这意味着(RTB_TypeDef *)RTC_BASE
- 基本上告诉编译器将内存地址(RTB_TypeDef *)(0x40080000UL)
视为指向0x40080000UL
的指针
并且额外的括号用于表示单个变量作为复合表达式RTC。
从那时起,只要编译器看到RTB_TypeDef
,它就会用RTC
替换它,基本上是一种在内存中标记此结构开头的便捷方法
答案 2 :(得分:0)
每当在数据类型(甚至用户定义的数据类型)之后遇到单个或多个*
时,它就是一个指针。
你称之为建筑:
typedef struct
{
__IO uint32_t CTRL; /**< Control Register */
__IO uint32_t CNT; /**< Counter Value Register */
__IO uint32_t COMP0; /**< Compare Value Register 0 */
__IO uint32_t COMP1; /**< Compare Value Register 1 */
__I uint32_t IF; /**< Interrupt Flag Register */
__IO uint32_t IFS; /**< Interrupt Flag Set Register */
__IO uint32_t IFC; /**< Interrupt Flag Clear Register */
__IO uint32_t IEN; /**< Interrupt Enable Register */
__IO uint32_t FREEZE; /**< Freeze Register */
__I uint32_t SYNCBUSY; /**< Synchronization Busy Register */
} RTC_TypeDef;
是一种结构,以编程方式称为struct
,用户定义的数据类型。 struct
是C中的关键字。typedef
也是如此。为了保持现在的简单,我要说,typedef
这里专门用于编写RTC_TypeDef;
而不是需要编写struct stRTC
。
RTC_BASE
是一个宏。因此,在编译之前,预处理器将RTC_BASE
替换为值(0x40080000UL)
,这是为了方便和可读性。
最后一行:
#define RTC ((RTC_TypeDef *) RTC_BASE)
也是一个宏定义。这只是RTC_Typedef
类型的指针,指向位于地址(0x40080000UL)
的任何内容
因此,在编译之前,预处理器将用RTC
替换((RTC_TypeDef *)0x40080000UL)
的所有实例。
如果递增RTC
指针,它将递增sizeof(RTC_Typedef)
。