Arduino Due ASM массив

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

помогоите разобраться с ассемблерными вставками в скетче. 

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

задача: написать на асме чтение данных из порта он же "REG_PIOC_PDSR = 0x400e123c" и сложить их в массив.

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

 от компиляторов зависит. В асм вставки передавал через ссылку на переменную или начало массива.

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

прям в ардуиновском редакторе пишу...

можно пример?

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

разве нет знающих?

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

Да правильно всё написали - это штука не стандартизированная, и зависит от конкретного компилятора.

По личному опыту - такой прямой доступ к переменным из ассемблера видел только каком-нибудь Borland C.

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

И лучше, по-моему, не мучиться с ассемблерными вставками, а вынести нужный код в отдельную ассемблерную функцию. Но опять же, придётся покопать документацию на компилятор, чтобы выяснить, в каких регистрах передаются параметры, в каких возвращается значение, и какие разрешено/запрещено в функции изменять.

Или не копать, а написать какую-нибудь простую функцию на C, а потом сгенерить из сишного файла ассемблерный, и посмотреть, как и что передаёт сам компилятор.
Только я не знаю, как это делать в ардуиновской среде. Где там задаются параметры для вызова компилятора, и где хранятся выходные файлы - там же не найдёшь ничего. Нужен специалист, но это не я, точно. :)
По мне уж проще какую-нибудь AVR-студию настроить, или IAR AVR.

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

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

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

Datak пишет:

Да правильно всё написали - это штука не стандартизированная, и зависит от конкретного компилятора.

По личному опыту - такой прямой доступ к переменным из ассемблера видел только каком-нибудь Borland C.

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

И лучше, по-моему, не мучиться с ассемблерными вставками, а вынести нужный код в отдельную ассемблерную функцию. Но опять же, придётся покопать документацию на компилятор, чтобы выяснить, в каких регистрах передаются параметры, в каких возвращается значение, и какие разрешено/запрещено в функции изменять.

Или не копать, а написать какую-нибудь простую функцию на C, а потом сгенерить из сишного файла ассемблерный, и посмотреть, как и что передаёт сам компилятор.
Только я не знаю, как это делать в ардуиновской среде. Где там задаются параметры для вызова компилятора, и где хранятся выходные файлы - там же не найдёшь ничего. Нужен специалист, но это не я, точно. :)
По мне уж проще какую-нибудь AVR-студию настроить, или IAR AVR.

и мне так проще, но увы, для того, чтобы получилось максимально быстро нужен ASM, и доступ до массива из НЕГО.

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

poskotinov_av пишет:
и мне так проще, но увы, для того, чтобы получилось максимально быстро нужен ASM, и доступ до массива из НЕГО.

Так я же про ASM и писал. Я только предложил заставить C-компилятор сгенерить ASM-код, чтобы понять, как он сам передаёт параметры.

А что за проблема с массивом для кадра? Он же, скорей всего, будет именно глобальным. Просто обращаться к нему по имени, из ассемблера - и должно работать, насколько я понимаю.

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

Datak пишет:

poskotinov_av пишет:
и мне так проще, но увы, для того, чтобы получилось максимально быстро нужен ASM, и доступ до массива из НЕГО.

Так я же про ASM и писал. Я только предложил заставить C-компилятор сгенерить ASM-код, чтобы понять, как он сам передаёт параметры.

А что за проблема с массивом для кадра? Он же, скорей всего, будет именно глобальным. Просто обращаться к нему по имени, из ассемблера - и должно работать, насколько я понимаю.

видимо не так понял. 

не могу я никак получить ссылку в пямяти (адрес в памяти) этого массива.

допустим есть:

byte line[320];
 
void setup() {
  Serial.begin(115200);
  Serial.println(*line, HEX);
}
 
void loop() {
}
 
так вот этот скетч  выдаст значение ячейки line[0], а как получить адрес памяти где лежит этот массив, а ля:
0x00112233
 
Datak
Offline
Зарегистрирован: 09.10.2014












byte line[ ] = { 1, 2, 3, 4, 5, 6, 7 };
  
void setup( )
{
  Serial.begin( 115200 );

  Serial.println( *line, HEX );   // печатается значение line[0];
  Serial.println( line[0], HEX ); // и так тоже

  Serial.println( ( int16_t )line, HEX ); // печатается адрес массива line
  
  asm( "ldi  r18, 8" );
  asm( "sts  line, r18" );

  Serial.println( line[0], HEX ); // данные в line[0] уже изменились
}
  
void loop( )
{
}

Так примерно. А вот можно ли так свободно использовать, не сохраняя, регистр r18 - это уже надо читать в документации на компилятор, т.к. у разных компиляторов способ использования регистров будет разным.

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

и не только регистров. Пользуюсь microC pro, так у них ошибка в компиляторе была при работе с сылками и указателями до версии 2.4. Потом все исправили.

Да и если вы решили лезть в железо Due, то среда ардуины может и не подойти.  Это больше игрушечная среда программирования.

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

Datak пишет:













byte line[ ] = { 1, 2, 3, 4, 5, 6, 7 };
  
void setup( )
{
  Serial.begin( 115200 );

  Serial.println( *line, HEX );   // печатается значение line[0];
  Serial.println( line[0], HEX ); // и так тоже

  Serial.println( ( int16_t )line, HEX ); // печатается адрес массива line
  
  asm( "ldi  r18, 8" );
  asm( "sts  line, r18" );

  Serial.println( line[0], HEX ); // данные в line[0] уже изменились
}
  
void loop( )
{
}

Так примерно. А вот можно ли так свободно использовать, не сохраняя, регистр r18 - это уже надо читать в документации на компилятор, т.к. у разных компиляторов способ использования регистров будет разным.

 

спасибо, глаза открыли

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

Michal пишет:

и не только регистров. Пользуюсь microC pro, так у них ошибка в компиляторе была при работе с сылками и указателями до версии 2.4. Потом все исправили.

Да и если вы решили лезть в железо Due, то среда ардуины может и не подойти.  Это больше игрушечная среда программирования.

судя по дизассемблированному коду, ассемблерные вставки могут спасти ситуацию...

с камеры, получается считывать на 10,5 Mhz и складывать в массив

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

а есть где-нить для DUE описание какая комманда сколько тактов выполняется?