Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-дек-16 10:22

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 7 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Инструкции передачи управления
СообщениеДобавлено: 2016-окт-17 10:37 
Не в сети

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


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2016-окт-17 10:52 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1390
Откуда: Тула
Благодарим пользователя 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);

_________________
сочувствующий…


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2016-окт-17 11:30 
Не в сети

Зарегистрирован: 2015-янв-19 16:23
Сообщения: 16
Вставил в код функцию, предложенную выше, но теперь при заходе в нее зацикливается в 3 строчке ("B .") нижеприведенного кода из файла startup_MDR1901VC1T.s:
PendSV_Handler                 PROC
                   EXPORT   PendSV_Handler [WEAK]
                   B        .
                            ENDP
Для меня это глушь ещё та, и, кстати, я не понял, что в parametr из предложенного кода должно записываться?! Может проблема в этом.


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2016-окт-17 11:46 
Не в сети

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

_________________
сочувствующий…


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2016-окт-18 13:18 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 722
Откуда: г. Санкт-Петербург
prostoRoman писал(а):
...
если параметры не нужны
__asm void RunRam(unsigned int adr)
{
            LDR   r2,[r1]
            BX    r2
}
В числе прочего надо учесть, что адрес перехода всегда должен заканчиваться единичным битом.
Этот код ошибочный(первый параметр функции передается через R0). д.б.
__asm void RunRam(unsigned int adr) // adr - адрес перехода
{
          BX    r0
}


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2016-ноя-08 11:04 
Не в сети

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


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2016-ноя-08 14:16 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1390
Откуда: Тула
Обратите внимание на примеры из стандартной библиотеки Миландра и на соответствующие ветки форума. (в пятом вся кейле эта задача решается ровно одной галочкой).


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

_________________
сочувствующий…
Вынести предупреждение
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 7 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей


Быстрые действия:
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB