Создание переменной по адресу

daniel_zet
Offline
Зарегистрирован: 22.12.2013

Здравствуйте, необходимо создать переменную по определенному адресу в SRAM, чтобы из ассемблерных вставок писать в нее значения, как это можно сделать? Или можно ли перекидывать значение регистра (или ячейки SRAM) в переменную?

sva1509
Offline
Зарегистрирован: 07.12.2012

А в чем проблемма 

uint8_t *variable = 0x101;

void setup()

{

       *variable = 10;

}

Сяу Ляу Вей
Offline
Зарегистрирован: 25.10.2013

sva1509 пишет:

А в чем проблемма  uint8_t *variable = 0x101; void setup(){       *variable = 10;}

Вряд ли автор вопроса не знаком с косвенной адресацией.

Наверняка ему нужна не просто ссылка, а резервирование этой области памяти под переменную.

maksim
Offline
Зарегистрирован: 12.02.2012

Собственно сохранить переменную в память или загрузить не сложно, а вот как понять что эта область не занята или как дать понять компилятору что эта область занята под вашы нужды...

  byte a = 123;
  //Сохранение в SRAM
  asm volatile (
  "sts 0x0009, %0 \n\t"
  : "+r" (a)
  );
  //Загрузка из SRAM
  asm volatile (
  "lds %0, 0x0009 \n\t"
  : "+r" (a)
  );

или

  int a = 1203;
  //Сохранение в SRAM
  asm volatile (
  "sts 0x0008, %0 \n\t"
  : "+r" (a)
  );
  //Загрузка из SRAM
  asm volatile (
  "lds %0, 0x0008 \n\t"
  : "+r" (a)
  );

или

  int a = 1203;
  //Сохранение в SRAM
  asm volatile (
  "sts 0x0008, %A0 \n\t"
  "sts 0x0009, %B0 \n\t"
  : "+r" (a)
  );
  //Загрузка из SRAM
  asm volatile (
  "lds %A0, 0x0008 \n\t"
  "lds %B0, 0x0009 \n\t"
  : "+r" (a)
  );

 

step962
Offline
Зарегистрирован: 23.05.2011

maksim пишет:

Собственно сохранить переменную в память или загрузить не сложно, а вот как

[...]

дать понять компилятору что эта область занята под вашы нужды...

Никак.

Давать понять необходимо редактору связей, для чего придется декларировать отдельную секцию памяти для размещения таких данных (директива SEGMENT в ассемблере и х.з. в Си).

Либо учесть, что все переменные размещаются в двух стандартных секциях - DATA (проинициализированные переменные) и BSS (непроинициализированные глобальные и статические переменные) в порядке (вроде бы) их объявления в программе и размещать объявления переменных так, чтобы "нужная" переменная попала на "тот самый" адрес в RAM.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Главное, что на второй вариант ТС ответ есть.

Скорей всего можно и секцию данных выделить в памяти, но есть ли смысл париться, если можно хранить в переменной.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Кстати, да, а зачем оно надо? Может ТС просто не знает как передать СИшную переменную в асм-вставку... вот и придумал себе проблему...

daniel_zet
Offline
Зарегистрирован: 22.12.2013

Спасибо за ответы, да, мне нужно получить доступ к глобальной переменной из обработчика прерывания, обьявленного ассемблерной вставкой, стандартная функция attachInterrupt(*,*,FALLING) не входит в прерывание (Сигнал на прерывание идет от конденсатора счетчика гейгера через транзистор, подключенный как в схеме с общим эмиттером, поэтому инвертируется. Проверял вольтметром напряжение при регистрации частицы на коллекторе транзистора - 0.5 В, в простое 4.5 В, вроде как прерывание должно вызываться). Вот обработчик, Reg не инкрементируется.

void setup() 
{ //....
   attachInterrupt(0,&counter,FALLING);
//...
}

void counter(void)// GMode - флаг выбранного режима
{
  if(::GMode){
    if (digitalRead(G2)==LOW){
      ::Reg++;
    }
  }
  else{
    ::Reg++;
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

 

daniel_zet пишет:
...обработчика прерывания, обьявленного ассемблерной вставкой...

Вы вообще о чем?

daniel_zet пишет:

стандартная функция attachInterrupt(*,*,FALLING) не входит в прерывание.

....

Reg не инкрементируется.

С чего вдруг?

volatile uint32_t Reg = 0;

void setup()
{
  attachInterrupt(0, counter, FALLING);
}

void loop()
{
}

void counter()
{
  Reg++;
}

 

poskotinov_av
Offline
Зарегистрирован: 20.12.2014

а как ассемблеру передать ссылку на массив?

Datak
Offline
Зарегистрирован: 09.10.2014

maksim пишет:





  byte a = 123;
  asm volatile (
  "sts 0x0009, %0 \n\t"
  : "+r" (a)
  );

А вот это, к примеру, : "+r" (a) - это что такое? Ткните пожалуйста, где почитать?

poskotinov_av
Offline
Зарегистрирован: 20.12.2014

Datak пишет:

maksim пишет:





  byte a = 123;
  asm volatile (
  "sts 0x0009, %0 \n\t"
  : "+r" (a)
  );

А вот это, к примеру, : "+r" (a) - это что такое? Ткните пожалуйста, где почитать?

он туда передаст 123, а не адрес в памяти где эти 123 лежат.