如何为设备编写头文件

3

我是新手嵌入式编程,在上课学习,同时使用ATSTK600工具。

我想寻求一些关于“如何为设备编写头文件”的帮助。具体来说,在编写头文件时需要遵循哪些标准,例如寄存器命名等(关于如何创建.h和include,我已经了解)。

最近,我接到了一个创建头文件的任务,我完成了它,但在重新提交之前需要纠正一些错误。在定义USART时(因为这对我来说很新),犯了一些错误。

#define USART_RX $0032 [教授说由于有$符号,#define无法工作,所以这个定义是不正确的]。那么以下定义是否正确呢?

#define USART0_RX  32
#define USART0_UDRE  34
#define USART0_TX  36

另外一件事是我将端口定义如下,这是否是正确的命名规范?
#define I_PINS_PORTA  0x20
#define DD_PORTA  0x21
#define DATA_PORTA  0x22

我在某处读到了适当的命名约定是#define BASE_ADDR_PORTA 0x20,但是DD_PORTAI_PINS_PORTA应该使用什么呢?

我在网上寻求帮助时找到了这个论坛。

附注:我正在使用C语言进行编程。


1
你不想使用Atmel的头文件,有什么原因吗?它们已经相当棒了。 - Mark Elliot
@Mark:这显然是课程作业。 - Michael Burr
1
@Mark:我猜测教师想让学生在裸机上完全做一些简单的事情,而不依赖于库。我认为这是一个合理的方法 - 就像在某些编程课程中,学生可能会被要求实现类似于strcpy()strcat()的东西,而不使用库函数。这取决于课程的目标。 - Michael Burr
对的,导师要求我们不要使用Atmel头文件,因为存在可移植性问题,并想知道我们如何理解和编写头文件。 - sneezy
2个回答

2

您似乎对UART遵循了一项约定,但对PORTA并未遵循,即在名称开头加上系统名称。这样可以更轻松地在代码中找到它。因此,与其使用

#define DD_PORTA 0x21

你可能已经

#define PORTA_DD 0x21

使用基地址来处理跨寄存器区域的设备也是个好主意。为此,您需要:

#define PORTA_BASE 0x20

#define PORT_I       0x00
#define PORT_DD      0x01
#define PORT_DATA    0x02

#define PORTA_I     (PORTA_BASE + PORT_I)
#define PORTA_DD    (PORTA_BASE + PORT_DD)
#define PORTA_DATA  (PORTA_BASE + PORT_DATA)

这样做需要更多的打字,但有助于避免后期出现错误。

不同的人和公司对此类命名和接口有自己的喜好,因此没有完美的答案。

至于字节对齐,我不确定你在问什么。内存地址的对齐是指地址除以对齐大小(以字节为单位)的余数为0。许多系统只能在地址可以被2、4或8整除时才能进行加载和存储操作(或者更快地处理满足该要求的地址)。此外,CPU高速缓存性能受到对齐方式的影响(需要的一些内存只有一半在高速缓存中可能和没有在高速缓存中一样糟糕)。


谢谢您关于端口地址的指导,我会在我的文件中进行更正。至于字节对齐,我只是感谢论坛上的人们对它的解释得这么好。我应该将那条评论发布在适当的位置...我的错! - sneezy

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接