Миландр

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

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 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
Сообщения: 997
Откуда: Тула
Благодарим пользователя 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
Сообщения: 997
Откуда: Тула
Раз глушь - надо разбираться что и как работает конкретно. Или искать "более обычные" практики.
вот хорошая книжка 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
Сообщения: 615
Откуда: г. Санкт-Петербург
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
Сообщения: 997
Откуда: Тула
Обратите внимание на примеры из стандартной библиотеки Миландра и на соответствующие ветки форума. (в пятом вся кейле эта задача решается ровно одной галочкой).


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

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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB