Arduino Due ASM массив
- Войдите на сайт для отправки комментариев
Пнд, 05/01/2015 - 20:02
помогоите разобраться с ассемблерными вставками в скетче.
как передать ссылку на массив в ассемблерную вставку?
задача: написать на асме чтение данных из порта он же "REG_PIOC_PDSR = 0x400e123c" и сложить их в массив.
от компиляторов зависит. В асм вставки передавал через ссылку на переменную или начало массива.
прям в ардуиновском редакторе пишу...
можно пример?
разве нет знающих?
Да правильно всё написали - это штука не стандартизированная, и зависит от конкретного компилятора.
По личному опыту - такой прямой доступ к переменным из ассемблера видел только каком-нибудь Borland C.
Это если речь о локальных переменных. С глобальными намного проще - никакую ссылку передавать не надо, переменная доступна из ассемблера просто по имени. Имя, правда, иногда может изменяться - например, часто добавляется символ подчёркивания.
И лучше, по-моему, не мучиться с ассемблерными вставками, а вынести нужный код в отдельную ассемблерную функцию. Но опять же, придётся покопать документацию на компилятор, чтобы выяснить, в каких регистрах передаются параметры, в каких возвращается значение, и какие разрешено/запрещено в функции изменять.
Или не копать, а написать какую-нибудь простую функцию на C, а потом сгенерить из сишного файла ассемблерный, и посмотреть, как и что передаёт сам компилятор.
Только я не знаю, как это делать в ардуиновской среде. Где там задаются параметры для вызова компилятора, и где хранятся выходные файлы - там же не найдёшь ничего. Нужен специалист, но это не я, точно. :)
По мне уж проще какую-нибудь AVR-студию настроить, или IAR AVR.
вот и хочу написать функцию принятия кадра с камеры, для этого мне надо указать адрес массива в памяти, чтобы положить в этот массив картинку, которую потом можно было бы обрабатывать ардуиновским языком.
Да правильно всё написали - это штука не стандартизированная, и зависит от конкретного компилятора.
По личному опыту - такой прямой доступ к переменным из ассемблера видел только каком-нибудь Borland C.
Это если речь о локальных переменных. С глобальными намного проще - никакую ссылку передавать не надо, переменная доступна из ассемблера просто по имени. Имя, правда, иногда может изменяться - например, часто добавляется символ подчёркивания.
И лучше, по-моему, не мучиться с ассемблерными вставками, а вынести нужный код в отдельную ассемблерную функцию. Но опять же, придётся покопать документацию на компилятор, чтобы выяснить, в каких регистрах передаются параметры, в каких возвращается значение, и какие разрешено/запрещено в функции изменять.
Или не копать, а написать какую-нибудь простую функцию на C, а потом сгенерить из сишного файла ассемблерный, и посмотреть, как и что передаёт сам компилятор.
Только я не знаю, как это делать в ардуиновской среде. Где там задаются параметры для вызова компилятора, и где хранятся выходные файлы - там же не найдёшь ничего. Нужен специалист, но это не я, точно. :)
По мне уж проще какую-нибудь AVR-студию настроить, или IAR AVR.
и мне так проще, но увы, для того, чтобы получилось максимально быстро нужен ASM, и доступ до массива из НЕГО.
Так я же про ASM и писал. Я только предложил заставить C-компилятор сгенерить ASM-код, чтобы понять, как он сам передаёт параметры.
А что за проблема с массивом для кадра? Он же, скорей всего, будет именно глобальным. Просто обращаться к нему по имени, из ассемблера - и должно работать, насколько я понимаю.
Так я же про ASM и писал. Я только предложил заставить C-компилятор сгенерить ASM-код, чтобы понять, как он сам передаёт параметры.
А что за проблема с массивом для кадра? Он же, скорей всего, будет именно глобальным. Просто обращаться к нему по имени, из ассемблера - и должно работать, насколько я понимаю.
видимо не так понял.
не могу я никак получить ссылку в пямяти (адрес в памяти) этого массива.
допустим есть:
Так примерно. А вот можно ли так свободно использовать, не сохраняя, регистр r18 - это уже надо читать в документации на компилятор, т.к. у разных компиляторов способ использования регистров будет разным.
и не только регистров. Пользуюсь microC pro, так у них ошибка в компиляторе была при работе с сылками и указателями до версии 2.4. Потом все исправили.
Да и если вы решили лезть в железо Due, то среда ардуины может и не подойти. Это больше игрушечная среда программирования.
Так примерно. А вот можно ли так свободно использовать, не сохраняя, регистр r18 - это уже надо читать в документации на компилятор, т.к. у разных компиляторов способ использования регистров будет разным.
спасибо, глаза открыли
и не только регистров. Пользуюсь microC pro, так у них ошибка в компиляторе была при работе с сылками и указателями до версии 2.4. Потом все исправили.
Да и если вы решили лезть в железо Due, то среда ардуины может и не подойти. Это больше игрушечная среда программирования.
судя по дизассемблированному коду, ассемблерные вставки могут спасти ситуацию...
с камеры, получается считывать на 10,5 Mhz и складывать в массив
а есть где-нить для DUE описание какая комманда сколько тактов выполняется?