2

我正在使用控制 RTC 的 AVR-atmega 处理器。在 atmega 中,来自 RTC 的时间保存为一个结构:

typedef struct {
uint8_t    year;
uint8_t    month;
uint8_t    hours;
uint8_t    minutes;
"and so on..."
} time_t;

我在 atmega 中有一个全局变量“时间”(volatile time_t *time;)。

我编写了一个 C 程序,通过 USB 将当前时间的数组发送到 atmega,以便在 RTC 上设置正确的时间。

在atmega上的USB功能中,代码如下:

time = (void *) data;

其中 data 是我的 C 程序以当前时间发送的数组。这是正确的方法吗?我现在的问题是,当我尝试从 atmega 读取时间时,即 atmega 返回我的结构时,我不时地得到随机值,但大多数时候我得到的是实际设置的时间。

希望我解释它有点可以理解..

谢谢

// 诺克赛特

4

3 回答 3

2

由于时间结构的对齐,您可能会看到问题。如果编译器想要在短或字边界上对齐它,它可以自由地填充您的结构。您可以尝试通过使用 __packed 或 #pragam pack 来指示编译器不要进行任何填充。例如

typedef __packed struct {
uint8_t    length;
uint16_t   weight;
} Fish;

因为这个结构是 3 字节宽,所以一些编译器会填充它(在开头或结尾)以在内存中对其进行字对齐(使其 4 字节宽) - 以提高访问速度等。如果它被打包,它将严格为 3 字节宽.

编辑:AVR 的语法可能如下

typedef __attribute__((packed)) struct { ...

我认为 Eric 试图提出的观点(这是正确的)是您还需要注意data指针的范围。如果该数据的范围有限,即将在您使用的生命周期内被释放,time那么您需要将字节从数据复制到time_t结构,而不是仅仅指向可能被释放的内存(正如 Eric 建议使用 a memcpy)。

于 2013-05-23T22:35:15.160 回答
2

好吧,我们这里有 3 个问题,我将一一解决:

1 - 结构中的对齐架构的 ABI 可以指定所有值在某个任意字边界上对齐,因此结构如下:

struct TheStruct{
    char a;
    int  man;
}

可能真的存储在内存中(假设 32 位intword):

char [0] 
pad  [1]
pad  [2]
pad  [3] 
int  [4]
int  [5]
int  [6]
int  [7]

这在 AVR 和英特尔中可能有所不同...

2 - 字节序

我认为 AVR 和 Intel 都将是小端的......所以这可能不会成为问题,但是:

存储 32 位 int 0x01234567 的计算机可以将其存储在内存中:
[0x01] [0x23] [0x45] [0x67] 大端或
[0x67] [0x45] [0x23] [0x01] 小端

3 - 网络与主机字节顺序
我真的不知道这是如何通过 USB 驱动程序解决的,但有可能进入 uart 会再次切换它的字节序......这是字节序的一个子集,请参阅:wikipedia

如果我是你,我会编写代码来精确处理字节中的缓冲区:

int value1 = 0x1234567

char * buffer =  calloc(1,bufferSize);
buffer[0] = value1 & 0xff000000 > 6;
buffer[1] = value1 & 0x00ff0000 > 4;
buffer[2] = value1 & 0x0000ff00 > 2;
buffer[3] = value1 & 0x000000ff;
...

这有点令人厌烦,而且在组装中可能更容易完成,但我认为这是获得可靠数据交换的最佳方式.. 一定要记录下来。

于 2013-05-24T15:13:16.487 回答
-2

尝试类似的东西

char data[10];
struct time_t myTime;
myTime.year = 2013; 
// ... snip
memcpy(data, myTime, sizeof(myTime)); // copy myTime to the array

要接收它,它是相同的操作,参数颠倒

memcpy(myTime, data, sizeof(myTime)); // copy data into myTime

请注意,只要结构中有指针,这个技巧就不再起作用。

于 2013-05-23T22:15:15.863 回答