Имеем компилятор AVR-GCC в AVR-студии,
оптимизация отключена, от слова совсем. Для обращения к группам устройств, разбросанных на разных пинах разных портов, сделал такую структуру.
typedef struct {
uint16_t port;
uint16_t ddr;
uint8_t mask;
} power_control;
Пример, инициализации такой структуры:
#define V5_SIZE 5
const power_control PROGMEM power_5v [V5_SIZE] = {
{(uint16_t) &PORTA, (uint16_t) &DDRA, _BV(7)}, //POWER_5B_1
{(uint16_t) &PORTA, (uint16_t) &DDRA, _BV(6)}, //POWER_5B_2
{(uint16_t) &PORTC, (uint16_t) &DDRC, _BV(6)}, //POWER_5B_3
{(uint16_t) &PORTH, (uint16_t) &DDRH, _BV(6)}, //POWER_5B_4
{(uint16_t) &PORTC, (uint16_t) &DDRC, _BV(4)}, //POWER_5B_5
};
При этом, если попробовать сделать все пины в единицу в цикле, а потом в ноль в цикле -
это не работает:
//set to 1
for(int i = 0; i < V5_SIZE; i ++) {
* (uint8_t *) power_5v[i].port |= power_5v[i].mask;
}
_delay_ms(1000);
//set to 0
for(int i = 0; i < V5_SIZE; i ++) {
* (uint8_t *) power_5v[i].port &=~ power_5v[i].mask;
}
Артефакты какие-то есть на пинах, но всё не поднимается. При этом, если просто вручную написать обращение по индексу, то всё работает корректно:
//set to 1
* (uint8_t *) power_5v[0].port |= power_5v[0].mask;
* (uint8_t *) power_5v[1].port |= power_5v[1].mask;
* (uint8_t *) power_5v[2].port |= power_5v[2].mask;
* (uint8_t *) power_5v[3].port |= power_5v[3].mask;
* (uint8_t *) power_5v[4].port |= power_5v[4].mask;
_delay_ms(1000);
//set to 0
* (uint8_t *) power_5v[0].port &=~ power_5v[0].mask;
* (uint8_t *) power_5v[1].port &=~ power_5v[1].mask;
* (uint8_t *) power_5v[2].port &=~ power_5v[2].mask;
* (uint8_t *) power_5v[3].port &=~ power_5v[3].mask;
* (uint8_t *) power_5v[4].port &=~ power_5v[4].mask;
Почему такое может быть, а главное: как это исправить?
З.Ы. Не в первый раз сталкиваюсь, как avr-gcc чудит со структурами, и пока не знаю внятного решения как это победить.