|
local register variable, в определённом регистре |
|
|
|
Sep 30 2008, 09:56
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Коллеги, у меня есть код, который собирается с помощью avr-gcc, необходимо сделать чтобы он теперь собирался и с помощью IAR. Возникли проблемы с ассемблерными вставками, а в частности я не понимаю, как мне разместить локальную переменную в фиксированном регистре внутри функции. Вот как это у меня реализованно на gcc. Есть какие нибудь идеи как сделать аналогично на iar. Код static uint16_t halMeasurement(void) { register volatile uint16_t cnt asm ("r24") = 0; ... ... ... return cnt; } В документации нашёл только как подобное сделать с глобальными переменными, но это не то.
|
|
|
|
|
Oct 1 2008, 06:30
|

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

|
Цитата(Rst7 @ Oct 1 2008, 08:01)  С точки зрения красоты лучше, когда чистый асмовский код живет отдельной жизнью в отдельных файлах. Абсолютно поддерживаю и читабельность, и портируемость, и невыкручивание рук оптимизатору. Использование ASM вставок, при наличии продуманной системы intrinsics, больше тянет на мелкое пижонство, нежели на действительно полезный механизм.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2008, 07:19
|

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

|
Цитата А помимо флуда есть что-то по существу? Вам же ответили: Цитата перепишите нужные процедуры на чистом асме Кроме того, хорошо бы знать задачу более глобально. Покажите всю функцию.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 1 2008, 07:22
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(xelax @ Sep 30 2008, 13:56)  static uint16_t halMeasurement(void) { register volatile uint16_t cnt asm ("r24") = 0; ... ... ... return cnt; } [/code]
В документации нашёл только как подобное сделать с глобальными переменными, но это не то. ...попробуйте вот так Код static uint16_t halMeasurement(void) { static __regvar __no_init uint16_t cnt @ 14; ... ... ... return cnt; } будут использоваться регистры R14,R15
|
|
|
|
|
Oct 1 2008, 08:03
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(tag @ Oct 1 2008, 11:22)  ...попробуйте вот так Код static uint16_t halMeasurement(void) { static __regvar __no_init uint16_t cnt @ 14; ... ... ... return cnt; } будут использоваться регистры R14,R15 Это понятно, примерно такое я нашёл в мануале на компилятор. Но проблема в том, что это static переменная, а меня интересует именно локальная. Так что такой вариант не прокатит. К стати иаровский support тоже предложил переписать код на асме, так как оптимизатор может по своему такие вещи наоптимизировать. Видимо прийдётся переписать на чистом асме как все нормальные ПАЦЦАНЫ  , но остаюсь при своём мнении, что за такую кучу баблосов(причём за каждое рабочее место) могли бы сделать более широкую функциональность.
|
|
|
|
|
Oct 1 2008, 09:04
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(zltigo @ Oct 1 2008, 12:38)  Вы бы показали какую функцию хочется "заоптимизировать", а то я тоже "остаюсь при своем мнении"  Ну во первых я нигде и словом не обмолвился что хочу что-то оптимизировать. Более того, считаю свои познаниями в ассемблере ниже среднего уровня и стараюсь писать код только на С. Код который я был ВЫНУЖДЕН написать на асмовских вставках производит измерение тактовый частоты микроконтроллера, с помощью асинхронного осциллятора на часовом кварце. И поэтому мне необходимо знать сколько тактов длиться одно измерение. Также у меня требования к коду, это работоспособность оного на любом уровне оптимизации компилятора. А теперь добавилось требование это работоспособность под IAR. А по сему чтобы не зависеть от опций компилятора при сборке библиотеки (а моим конечным продуктом является не конечное работоспособное устройство, а библиотека с набором функций) я сделал вставки на асме. Не стал делать функции на чистом асме по одной простой причине. Для avr нет никакого стандарта передачи параметров в функцию и обратно подобно thumb-interwork для arm. И поэтому каждый производитель asm компилятора бузует свои правила кто во что горазд. А асмовская вставка в сишный код позволяет невилировать это разнообразия-безобразия за счёт С компилятора. Так что всё таки это не пижонство  , а суровые будни программиста. Вот моя функция целиком Код /****************************************************************************** Calculates number of cycles during EXTERNAL_TICKS period. Parameters: none Returns: number of the cycles. ******************************************************************************/ static uint16_t halMeasurement(void) { register volatile uint16_t cnt asm ("r24") = 0;
ASM ( "push r21 \n\t"
"lds r21, 0x00B6 \n\t" /* ASSR |= (1 << AS2) */ "ori r21, 0x80 \n\t" /* ASSR |= (1 << AS2) */ "sts 0x00B6, r21 \n\t" /* ASSR |= (1 << AS2) */
"ldi r21, 0x01 \n\t" /* TCCR2B = 1 << CS20 */ "sts 0x00B1, r21 \n\t" /* TCCR2B = 1 << CS20 */
"pop r21 \n\t" );
cnt = 0; ATOMIC_SECTION_ENTER
#if EXTERNAL_TICKS == 100 ASM ( ".set EXTERNAL_TICKS, 0x64 \n\t" "push r21 \n\t"
"ldi r21, 0 \n\t" /* TCNT2 = 0 */ "sts 0x00B2, r21 \n\t" /* TCNT2 = 0 */
"__l0: \n\t" "lds r21, 0x00B6 \n\t" "andi r21, 0x1B \n\t" "brne __l0 \n\t" /* while (ASSR & 0x1B); */
"__l1: \n\t" "adiw r24, 0x01 \n\t" /* cnt ++ (2 cycle) */ "lds r21, 0x00B2 \n\t" /* read TCNT2 */ "subi r21, EXTERNAL_TICKS \n\t" /* TCNT2 - EXTERNAL_TICKS */ "brmi __l1 \n\t" /* if TCNT2 > EXTERNAL_TICKS then exit */
"pop r21 \n\t" );
ATOMIC_SECTION_LEAVE return cnt; } #else #error " EXTERNAL_TICKS must be 100 " #endif Первую асмовскую вставку можно было бы и не деалть, а оставить код на С, но её я написал для тренировки  . А вот без второй я думаю обойтись нельзя.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|