Я программирую микроконтроллер AVR, используя смесь C и ASM, но у меня возникли некоторые проблемы.
У меня есть следующий код в моем коде C:
uint8_t amplitudes32[32] = {.. constant values ..};
uint8_t amplitudes64[64] = {.. constant values ..}
uint8_t* amplitudes;
(амплитуды 32/64 - это, в основном, справочные таблицы)
А иногда я хочу, чтобы амплитуды были равны амплитудам32, а иногда я хочу, чтобы они были равны амплитудам64.
Я делаю это, идя
amplitudes = amplitudes32;
в моем коде c.
Затем в моей программе прерываний ASM я хочу прочитать адрес массива следующим образом:
ldi r30, lo8(amplitudes)
ldi r31, hi8(amplitudes)
Затем я делаю еще несколько инструкций, чтобы получить значение массива с определенным индексом для определенного порта. Однако, когда я проверяю вывод, он не работает должным образом, и я получаю то, чего не ожидаю. Я получаю одно и то же, независимо от того, из какого массива состоит ... это то же самое, даже когда amplitudes
указывает на массив всех нулей.
Если я изменю код сборки на
ldi r30, lo8(amplitudes64)
ldi r31, hi8(amplitudes64)
Тогда все работает как положено. Но, как я уже сказал, мне нужно иметь другую справочную таблицу в разное время, и из-за проблем со скоростью я не могу принять это решение в подпрограмме прерывания, поэтому было бы хорошо, если бы у меня был массив 'variable', который я может измениться в моем C-коде, который затем использует прерывание.
Что я делаю не так?