Чтение из порта с помощью ассемблера

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

Читаю данные из порта "С" адрес: (0x400e123c) ассемблеровской командой ldr r0, [r1, #0], в r1 соответственно 0x400e123c, данная команда выполняется за 4 такта, если в r1 загружаю адрес не порта (0x200e123c) то та же команда выполняется за 2 такта.

1. Почему?

2. Как компилятору указать чтобы процедура была размещена по указанному адресу в памяти? Тем самым сократив дистанцию между адресом, в котором находится команда чтения из порта и самим адресом порта, от куда производится чтение.

3. Может это быть из-за того, как сконфигурирован порт?

Если у кого есть еще какие-нибудь соображения по моей проблеме?
Datak
Offline
Зарегистрирован: 09.10.2014

poskotinov_av пишет:
Тем самым сократив дистанцию между адресом, в котором находится команда чтения из порта и самим адресом порта, от куда производится чтение.

А это ещё зачем? :)

А так, если действительно есть необходимость - пожалуйста, всё можно. Только это уже не компилятору надо объяснять, а линкеру.

И да, это будет уже явно не в ардуиновском стиле. Получается, что мы пытаемся получить доступ к настройкам, которые ардуиноразработчики от нас специально подальше спрятали, чтоб мы случайно чего не накосячили.

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

Datak пишет:

poskotinov_av пишет:
Тем самым сократив дистанцию между адресом, в котором находится команда чтения из порта и самим адресом порта, от куда производится чтение.

А это ещё зачем? :)

Хочу понять почему в одном случае команда выполняется 2 такта, в другом - та же команда 4 такта

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

poskotinov_av пишет:
Хочу понять почему в одном случае команда выполняется 2 такта, в другом - та же команда 4 такта

Понятно. В это миконтроллере ничего не понимаю, не занимался им. Но думаю, адрес кода и адрес данных на скорость выполнения никак не могут влиять.

Точнее, наоборот, влиять могут, и тот и другой - но не их взаимное расположение.

А разное количество тактов при обращении к памяти и к порту - вещь вполне правдоподобная, я бы этому не удивился.

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