Миландр
http://forum.milandr.ru/

Инструкции передачи управления
http://forum.milandr.ru/viewtopic.php?f=36&t=3586
Страница 1 из 1

Автор:  Nzx [ 2016-окт-17 10:37 ]
Заголовок сообщения:  Инструкции передачи управления

И снова здравствуйте!
Вновь столкнулся с проблемой. Необходимо передать управление определенной части кода. Почитал про встроенные функции, нашел функцию BLX, подходящую для мое задания. Но, либо я что-то не так понял или не дописал, либо BLX не распознается компилятором (indentifier "BLX" is undefined). В мануале написано, что встроенные функции могут не поддерживаться компилятором (у меня Keil uVision 4) и что в таких ситуациях следует воспользоваться ассемблерными вставками. Начал изучать ассемблерные вставки, просмотрел кучу форумов и пришел к следующему коду:
Код:
#pragma asm
jmp 0xXXXXXXXX;
#pragma endasm

Но компилятор опять же не хочет воспринимать эту часть кода. Где-то было написано, что нужно подключать какие-то библиотеки (какие, так и не нашел), а где-то - настроить Keil на ассемблерные вставки, при этом опять же тема была не полностью раскрыта.
Помогите пожалуйста разобраться
1) работают ли инструкции передачи управления аля BLX, и, если да, то как?
2) что сделать, чтобы компилятор воспринимал ассемблерные вставки?
Заранее спасибо!

Автор:  prostoRoman [ 2016-окт-17 10:52 ]
Заголовок сообщения:  Re: Инструкции передачи управления

Благодарим пользователя vasili.
Код:
__asm void RunRam(unsigned int parametr, unsigned int adr)
{
            LDR   r2,[r1]
            MSR      msp,r2
            LDR      r2,[r1,#4]
            BX    r2
}

RunRam(parametr, adr);

Автор:  Nzx [ 2016-окт-17 11:30 ]
Заголовок сообщения:  Re: Инструкции передачи управления

Вставил в код функцию, предложенную выше, но теперь при заходе в нее зацикливается в 3 строчке ("B .") нижеприведенного кода из файла startup_MDR1901VC1T.s:
Код:
PendSV_Handler                 PROC
                   EXPORT   PendSV_Handler [WEAK]
                   B        .
                            ENDP

Для меня это глушь ещё та, и, кстати, я не понял, что в parametr из предложенного кода должно записываться?! Может проблема в этом.

Автор:  prostoRoman [ 2016-окт-17 11:46 ]
Заголовок сообщения:  Re: Инструкции передачи управления

Раз глушь - надо разбираться что и как работает конкретно. Или искать "более обычные" практики.
вот хорошая книжка http://we.easyelectronics.ru/TechBooks/ ... -2012.html
если параметры не нужны
Код:
__asm void RunRam(unsigned int adr)
{
            LDR   r2,[r1]
            BX    r2
}


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

Автор:  vasili [ 2016-окт-18 13:18 ]
Заголовок сообщения:  Re: Инструкции передачи управления

prostoRoman писал(а):
...
если параметры не нужны
Код:
__asm void RunRam(unsigned int adr)
{
            LDR   r2,[r1]
            BX    r2
}


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


Этот код ошибочный(первый параметр функции передается через R0). д.б.

Код:
__asm void RunRam(unsigned int adr) // adr - адрес перехода
{
          BX    r0
}

Автор:  Nzx [ 2016-ноя-08 11:04 ]
Заголовок сообщения:  Re: Инструкции передачи управления

Попробовал все указанные варианты, но результат один, описанный мною выше (зацикливанием на В).Пытался разобраться самостоятельно,но безуспешно.
Моя задача состоит в следующем: в озу по адресу 0x20000000 хранится описание функции для записи во флэш. В связи с энергозависимостью ОЗУ, данная часть кода должна изначально храниться во ФЛЭШ и перезаписываться в озу при перезапуске, но тогда получается, что описание будет в двух местах сразу. Поэтому и пришло в голову передавать управление данной части в озу, когда это необходимо.
Может где-то в этом проблема?!
P.s. Я менял на unsigned long int )))) и 1 в младшем разряде ставил
P.p.s. И в моем случае, как я понимаю, нужно использовать BLX, которая осуществляет возврат?!

Автор:  prostoRoman [ 2016-ноя-08 14:16 ]
Заголовок сообщения:  Re: Инструкции передачи управления

Обратите внимание на примеры из стандартной библиотеки Миландра и на соответствующие ветки форума. (в пятом вся кейле эта задача решается ровно одной галочкой).

Вложения:
Комментарий к файлу: Вызов подпрограмм и безусловный переход
b.pdf [959.58 КБ]
Скачиваний: 56

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/