gpt4 book ai didi

avr - AVR-GCC 是否可以与 16 位 AVR I/O 寄存器一起正常工作?

转载 作者:行者123 更新时间:2023-12-04 04:00:04 25 4
gpt4 key购买 nike

前言
众所周知,对于 16 位 I/O 寄存器(定时器计数器、ICR/OCR、ADC...)的原子和同时读/写高和低部分,AVR 使用影子临时寄存器。例如。在 ATmega8 上读取 TCNT1:

uint8_t tl, th;
tl = TCNT1L; // tl <- TCNT1L, avr_temp <- TCNT1H (atomic)
th = TCNT1H; // th <- avr_temp
(这里 avr_temp 是 AVR 临时影子寄存器)。因此,例如,首先读取 TCNT1H 是错误的。

将 AVR-GCC 与如下代码一起使用是否安全?
uint16_t ticks;
ticks = TCNT1;
TCNT1 = 0x1234;
AVR-GCC 总是为这些操作生成正确的代码吗?
(似乎是“否”(GCC 怎么知道访问 TCNT1 指向的内存使用 AVR 影子寄存器?),但是 avr-libc 定义了宏 TCNT1 以及 TCNT1H、TCNT1L 和 avr-libc' FAQ 建议直接使用 TCNT1 。使困惑。)
我测试了 AVR-GCC v4.7.2,它似乎总是生成正确的代码。即使我写 'TCNT1 |= 1' 它也会产生正确的代码 -O3 :
$ avr-gcc -std=c99 -mmcu=atmega8 -S -O3 -o - 1.c
...
in r24,0x2c // TCNT1L
in r25,0x2c+1 // TCNT1H
ori r24,1
out 0x2c+1,r25
out 0x2c,r24
...
即使我用普通的 16 位变量更改 TCNT1 代码也是一样的。那么,“GCC 怎么知道访问 TCNT1 指向的内存使用了 AVR 影子寄存器?” -- 默认情况下,似乎总是在访问任何 16 位变量时假设影子寄存器。

最佳答案

我不知道它是怎么知道的,但我用过 TCNT1直接在几十个程序中没有问题。 FAQ you linked建议你这样做,就像我读过的每个教程一样。

FAQ 的重点是确保在写入两个寄存器之间不会发生中断。尽管 avr-gcc 会生成以正确顺序访问它们的代码,但它不能保证它们之间不会发生中断:您必须注意这一点。

关于avr - AVR-GCC 是否可以与 16 位 AVR I/O 寄存器一起正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14161918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com