Jump to content

    

инструкция BX

Приветствую!

подскажите что не так с инструкциями BX, BLX. В мануалах пишут что необходимо в регистре, в котором инструкции передается адрес перехода, нулевой бит устанавливать в единицу, иначе генерируется UsageFault. Но это не работает, МК "повисает", в том что адрес верный, я уверен на 100%

если в нулевом разряде 0, то хардфаулт.

в общем и так не так, и эдак

с чем это может быть связано?

речь о cortex M7
 

Edited by TTTTTTS

Share this post


Link to post
Share on other sites
21 minutes ago, TTTTTTS said:

В мануалах пишут что необходимо в регистре, в котором инструкции передается адрес перехода, нулевой бит устанавливать в единицу, иначе генерируется UsageFault.

Почитайте примечание внизу по этой ссылке. Оно?

 

 

Share this post


Link to post
Share on other sites

Вы невнимательны

23 минуты назад, TTTTTTS сказал:

В мануалах пишут что необходимо в регистре, в котором инструкции передается адрес перехода, нулевой бит устанавливать в единицу, иначе генерируется UsageFault. Но это не работает

 

Share this post


Link to post
Share on other sites

Покажите "мануал", где вы это вычитали.

Share this post


Link to post
Share on other sites

ARM Cortex-M7 Devices Generic User Guide страница 128
 

вернее страница 174.  там внизу написано 3-128 подумал что это номер страницы
 

The BX and BLX instructions result in a UsageFault exception if bit[0] of Rm is 0
 

For BX and BLX, bit[0] of Rm must be 1 for correct execution but a branch occurs to the target
address created by changing bit[0] to 0
 

Edited by TTTTTTS

Share this post


Link to post
Share on other sites
39 минут назад, TTTTTTS сказал:

подскажите что не так с инструкциями BX, BLX. В мануалах пишут что необходимо в регистре, в котором инструкции передается адрес перехода, нулевой бит устанавливать в единицу, иначе генерируется UsageFault. Но это не работает, МК "повисает", в том что адрес верный, я уверен на 100%

Купили Cortex-M7, а на эмулятор нет денег? Разоритесь уже, чтобы не страдать такой ерундой.

Share this post


Link to post
Share on other sites
17 minutes ago, TTTTTTS said:

ARM Cortex-M7 Devices Generic User Guide страница 128
 

Стр. 3-181: "Use NOP for padding, for example to place the following instruction on a 64-bit boundary".

Оно?

 

 

зы Прекращайте писать на ASM на этом "жалком" CM7, возьмите для этой важной задачи ядро по-серьезнее :)

Share this post


Link to post
Share on other sites
1 минуту назад, jcxz сказал:

Купили Cortex-M7, а на эмулятор нет денег? Разоритесь уже, чтобы не страдать такой ерундой.

какой эмулятор? я в кейле отладчиком смотрел, в железе.

когда в регистре 0 бит равен 0- то выкидывает в хардфаулт

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

Share this post


Link to post
Share on other sites
6 minutes ago, TTTTTTS said:

я в кейле отладчиком смотрел, в железе.

 

Вот теперь наконец-то подбираемся к сути проблемы!

В 99.9999% подобных случаев проблема  в коде, а не в ядре проца, как ошибочно многим кажется ;)

 

Share this post


Link to post
Share on other sites
53 minutes ago, TTTTTTS said:

в том что адрес верный, я уверен на 100%

Значит, надо довести уверенность до 146%. Другого объяснения нет.

Share this post


Link to post
Share on other sites
2 минуты назад, Forger сказал:

Use NOP for padding, for example to place the following instruction on a 64-bit boundary

а причем здесь NOP? нет разницы что там по этому адресу, ноп или не ноп, процессор ведет себя одинаково в моем случае

Share this post


Link to post
Share on other sites
11 минут назад, TTTTTTS сказал:

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

Значит у вас что-то не в порядке с этим самым кейлом или эмулятором.

Следите за руками. Шаг 1:

20190507-142.gif.1b6a98fa7888e788d291178b692c83b9.gif

Шаг 2:

20190507-143.gif.3a0fbe147d3971ea2a6292c7125c7321.gif

 

Как видно всё работает чётко. Да и не может не работать: в любой программе вагон этих инструкций.

 

Share this post


Link to post
Share on other sites
13 минут назад, TTTTTTS сказал:

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

Ищите в опциях отладчика галку, которая называется как то типа "Запретить прерывания при пошаговой отладке". И возможно произойдёт чудо!  :biggrin:

Не знаю где она в Кейле, ибо пользую IAR. Но она должна быть.

Возможно у вас просто за время шага успевает произойти какое-то прерывание. Вот в него и улетаете.

Share this post


Link to post
Share on other sites

 

Покажите оригинальный кусок кода, по аналогии с картинками коллеги.

Share this post


Link to post
Share on other sites

все заработало. спасибо за помощь.

натупил я, пол дня коту под хвост

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now