реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Присвоить переменной значение из регистра РОН, AT91SAM7S64, IAR, C++
RA3PKJ
сообщение Aug 8 2010, 11:13
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 5-08-10
Пользователь №: 58 773



Как начинающий заткнулся казалось бы на простой вещи.
Код
static inline unsigned hw_get_cpsr(void)
{
    unsigned long retval;
    asm ("mrs  r0, cpsr");
    return retval;
}

Надо присвоить переменной retval значение из регистра общего назначения r0, который фигурирует в ассемблерной вставке.
Т.е. retval = ?????????????
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 8 2010, 11:30
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Что за компилятор?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
RA3PKJ
сообщение Aug 8 2010, 11:41
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 5-08-10
Пользователь №: 58 773



IAR для ARM. В заголовке указан.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 8 2010, 11:56
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Можно использовать соответствующую intrinsic-функцию. Для IAR:
Код
#include <intrinsic.h>
...
unsigned long cpsr = __get_CPSR();


P.S. CPSR никак не относится к РОН.
Go to the top of the page
 
+Quote Post
RA3PKJ
сообщение Aug 8 2010, 12:11
Сообщение #5





Группа: Участник
Сообщений: 10
Регистрация: 5-08-10
Пользователь №: 58 773



Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал.
Вероятно регистр r0 именуется на С++ как-то по другому, я не знаю.
Вариант retval = r0 не проходит, знаний не хватает.

Сообщение отредактировал RA3PKJ - Aug 8 2010, 12:26
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 8 2010, 12:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(RA3PKJ @ Aug 8 2010, 16:11) *
Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал.
Вероятно регистр r0 именуется на С++ как-то по другому, я не знаю.
Вариант retval = r0 не проходит, знаний не хватает.

На этот вопрос ответ - никак. Цитата из IAR C/C++ Development Guide:
Цитата
Auto variables cannot be accessed

Так что остается только передавать значения через память. Но лучше использовать intrinsic или честный asm-модуль, если нужно.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 8 2010, 12:34
Сообщение #7


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(RA3PKJ @ Aug 8 2010, 16:11) *
Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал.

Вообще то Ваша функция называется get_cpsr, и возвращает значение регистра CPSR, а не R0.
Вот это чем не устраивает?
Код
unsigned long cpsr = __get_CPSR();

Go to the top of the page
 
+Quote Post
RA3PKJ
сообщение Aug 8 2010, 12:51
Сообщение #8





Группа: Участник
Сообщений: 10
Регистрация: 5-08-10
Пользователь №: 58 773



Буду переваривать.Спасибо.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 8 2010, 13:12
Сообщение #9


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



QUOTE (RA3PKJ @ Aug 8 2010, 14:41) *
IAR для ARM. В заголовке указан.


Пардон. Не заметил.

QUOTE (sonycman @ Aug 8 2010, 15:34) *
Вообще то Ваша функция называется get_cpsr, и возвращает значение регистра CPSR, а не R0.
Вот это чем не устраивает?
CODE
unsigned long cpsr = __get_CPSR();


Это - правильный вариант для IAR'а. Даже более верный, нежели отдельный модуль на асме. Решение типа asm("чего-то") неверно в принципе.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 8 2010, 13:54
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (RA3PKJ @ Aug 8 2010, 14:13) *
Надо присвоить переменной retval значение из регистра общего назначения r0, который фигурирует в ассемблерной вставке.
Т.е. retval = ?????????????

Вам уже выше все объяснили, как ДЕЙСТВИТЕЛЬНО правильно.
Ну а для общего развития, существуют соглашения о передаваемых и возвращаемых параметрах (читаем документацию) , и о чудо smile.gif r0 это и есть Ваш "retval" - ничего присваивать не надо. Только Warning подавить на то, что функция значения не возврвщает.
CODE
.....

    __asm ( "mrs  r0, cpsr" );

#pragma diag_suppress = Pe940
}
#pragma diag_default = Pe940


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016