Чтение из порта с помощью ассемблера
- Войдите на сайт для отправки комментариев
Чт, 08/01/2015 - 16:38
Читаю данные из порта "С" адрес: (0x400e123c) ассемблеровской командой ldr r0, [r1, #0], в r1 соответственно 0x400e123c, данная команда выполняется за 4 такта, если в r1 загружаю адрес не порта (0x200e123c) то та же команда выполняется за 2 такта.
1. Почему?
2. Как компилятору указать чтобы процедура была размещена по указанному адресу в памяти? Тем самым сократив дистанцию между адресом, в котором находится команда чтения из порта и самим адресом порта, от куда производится чтение.
3. Может это быть из-за того, как сконфигурирован порт?
Если у кого есть еще какие-нибудь соображения по моей проблеме?
А это ещё зачем? :)
А так, если действительно есть необходимость - пожалуйста, всё можно. Только это уже не компилятору надо объяснять, а линкеру.
И да, это будет уже явно не в ардуиновском стиле. Получается, что мы пытаемся получить доступ к настройкам, которые ардуиноразработчики от нас специально подальше спрятали, чтоб мы случайно чего не накосячили.
А это ещё зачем? :)
Хочу понять почему в одном случае команда выполняется 2 такта, в другом - та же команда 4 такта
Понятно. В это миконтроллере ничего не понимаю, не занимался им. Но думаю, адрес кода и адрес данных на скорость выполнения никак не могут влиять.
Точнее, наоборот, влиять могут, и тот и другой - но не их взаимное расположение.
А разное количество тактов при обращении к памяти и к порту - вещь вполне правдоподобная, я бы этому не удивился.
Насчёт конфигурирования скорости портов - очень сомневаюсь. В крутых контроллерах/процессорах иногда конфигурится скорость интерфейсов, например, под внешнюю память. Но чтобы так - обычные ноги GPIO - такого не знаю, не встречал.