Создание переменной по адресу
- Войдите на сайт для отправки комментариев
Пт, 03/01/2014 - 16:07
Здравствуйте, необходимо создать переменную по определенному адресу в SRAM, чтобы из ассемблерных вставок писать в нее значения, как это можно сделать? Или можно ли перекидывать значение регистра (или ячейки SRAM) в переменную?
А в чем проблемма
uint8_t *variable = 0x101;
void setup()
{
*variable = 10;
}
А в чем проблемма uint8_t *variable = 0x101; void setup(){ *variable = 10;}
Вряд ли автор вопроса не знаком с косвенной адресацией.
Наверняка ему нужна не просто ссылка, а резервирование этой области памяти под переменную.
Собственно сохранить переменную в память или загрузить не сложно, а вот как понять что эта область не занята или как дать понять компилятору что эта область занята под вашы нужды...
или
или
Собственно сохранить переменную в память или загрузить не сложно, а вот как
[...]
дать понять компилятору что эта область занята под вашы нужды...
Никак.
Давать понять необходимо редактору связей, для чего придется декларировать отдельную секцию памяти для размещения таких данных (директива SEGMENT в ассемблере и х.з. в Си).
Либо учесть, что все переменные размещаются в двух стандартных секциях - DATA (проинициализированные переменные) и BSS (непроинициализированные глобальные и статические переменные) в порядке (вроде бы) их объявления в программе и размещать объявления переменных так, чтобы "нужная" переменная попала на "тот самый" адрес в RAM.
Главное, что на второй вариант ТС ответ есть.
Скорей всего можно и секцию данных выделить в памяти, но есть ли смысл париться, если можно хранить в переменной.
Кстати, да, а зачем оно надо? Может ТС просто не знает как передать СИшную переменную в асм-вставку... вот и придумал себе проблему...
Спасибо за ответы, да, мне нужно получить доступ к глобальной переменной из обработчика прерывания, обьявленного ассемблерной вставкой, стандартная функция attachInterrupt(*,*,FALLING) не входит в прерывание (Сигнал на прерывание идет от конденсатора счетчика гейгера через транзистор, подключенный как в схеме с общим эмиттером, поэтому инвертируется. Проверял вольтметром напряжение при регистрации частицы на коллекторе транзистора - 0.5 В, в простое 4.5 В, вроде как прерывание должно вызываться). Вот обработчик, Reg не инкрементируется.
Вы вообще о чем?
стандартная функция attachInterrupt(*,*,FALLING) не входит в прерывание.
....
Reg не инкрементируется.
С чего вдруг?
а как ассемблеру передать ссылку на массив?
А вот это, к примеру, : "+r" (a) - это что такое? Ткните пожалуйста, где почитать?
А вот это, к примеру, : "+r" (a) - это что такое? Ткните пожалуйста, где почитать?
он туда передаст 123, а не адрес в памяти где эти 123 лежат.