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

 
 
> local register variable, в определённом регистре
xelax
сообщение Sep 30 2008, 09:56
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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;
}


В документации нашёл только как подобное сделать с глобальными переменными, но это не то.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
tag
сообщение Oct 1 2008, 07:22
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
xelax
сообщение Oct 1 2008, 08:03
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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 тоже предложил переписать код на асме, так как оптимизатор может по своему такие вещи наоптимизировать.
Видимо прийдётся переписать на чистом асме как все нормальные ПАЦЦАНЫ cool.gif , но остаюсь при своём мнении, что за такую кучу баблосов(причём за каждое рабочее место) могли бы сделать более широкую функциональность.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 1 2008, 08:38
Сообщение #4


Гуру
******

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



Цитата(xelax @ Oct 1 2008, 10:03) *
...но остаюсь при своём мнении

Вы бы показали какую функцию хочется "заоптимизировать", а то я тоже "остаюсь при своем мнении" smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Oct 1 2008, 09:04
Сообщение #5


Местный
***

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



Цитата(zltigo @ Oct 1 2008, 12:38) *
Вы бы показали какую функцию хочется "заоптимизировать", а то я тоже "остаюсь при своем мнении" smile.gif

Ну во первых я нигде и словом не обмолвился что хочу что-то оптимизировать. wink.gif
Более того, считаю свои познаниями в ассемблере ниже среднего уровня и стараюсь писать код только на С.
Код который я был ВЫНУЖДЕН написать на асмовских вставках производит измерение тактовый частоты микроконтроллера, с помощью асинхронного осциллятора на часовом кварце. И поэтому мне необходимо знать сколько тактов длиться одно измерение.
Также у меня требования к коду, это работоспособность оного на любом уровне оптимизации компилятора. А теперь добавилось требование это работоспособность под IAR.
А по сему чтобы не зависеть от опций компилятора при сборке библиотеки (а моим конечным продуктом является не конечное работоспособное устройство, а библиотека с набором функций) я сделал вставки на асме.
Не стал делать функции на чистом асме по одной простой причине. Для avr нет никакого стандарта передачи параметров в функцию и обратно подобно thumb-interwork для arm. И поэтому каждый производитель asm компилятора бузует свои правила кто во что горазд. А асмовская вставка в сишный код позволяет невилировать это разнообразия-безобразия за счёт С компилятора. Так что всё таки это не пижонство smile.gif , а суровые будни программиста.

Вот моя функция целиком
Код
/******************************************************************************
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

Первую асмовскую вставку можно было бы и не деалть, а оставить код на С, но её я написал для тренировки smile.gif . А вот без второй я думаю обойтись нельзя.
Go to the top of the page
 
+Quote Post
tag
сообщение Oct 1 2008, 09:38
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(xelax @ Oct 1 2008, 13:04) *
Первую асмовскую вставку можно было бы и не деалть, а оставить код на С, но её я написал для тренировки smile.gif . А вот без второй я думаю обойтись нельзя.


...мне кажется вы себе усложняете жизнь, почему бы это просто на C не написать?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- xelax   local register variable   Sep 30 2008, 09:56
- - Dog Pawlowa   Цитата(xelax @ Sep 30 2008, 12:56) Есть к...   Sep 30 2008, 14:14
|- - xelax   Цитата(Dog Pawlowa @ Sep 30 2008, 18:14) ...   Sep 30 2008, 14:21
- - Rst7   ЦитатаВозникли проблемы с ассемблерными вставками ...   Oct 1 2008, 04:50
|- - xelax   Что-то как-то грустно это всё... IAR немалых денех...   Oct 1 2008, 05:39
- - MrYuran   //размещаем в свободных регистрах ввода/вывода __n...   Oct 1 2008, 05:46
- - Rst7   ЦитатаIAR немалых денех стоит, а функционал компил...   Oct 1 2008, 06:01
|- - zltigo   Цитата(Rst7 @ Oct 1 2008, 08:01) С точки ...   Oct 1 2008, 06:30
|- - xelax   Отлично, определились. Я мелкий пижон, который пиш...   Oct 1 2008, 07:03
- - Rst7   ЦитатаА помимо флуда есть что-то по существу? Вам...   Oct 1 2008, 07:19
|- - zltigo   Цитата(xelax @ Oct 1 2008, 11:04) Более т...   Oct 1 2008, 09:51
|- - xelax   Цитата(zltigo @ Oct 1 2008, 13:51) Это не...   Oct 1 2008, 10:31
|- - zltigo   Цитата(xelax @ Oct 1 2008, 12:31) Вот это...   Oct 1 2008, 10:43
|- - xelax   Цитата(zltigo @ Oct 1 2008, 14:43) Вы к э...   Oct 1 2008, 13:46
|- - zltigo   Цитата(xelax @ Oct 1 2008, 15:46) вот уж ...   Oct 1 2008, 14:11
|- - xelax   Цитата(zltigo @ Oct 1 2008, 18:11) Докуме...   Oct 1 2008, 15:13
- - Rst7   ЦитатаКод который я был ВЫНУЖДЕН написать на асмов...   Oct 1 2008, 09:27
- - Rst7   ЦитатаИзмерения нужны для калибровке RC генератора...   Oct 1 2008, 10:50
- - Rst7   ЦитатаСпасибо, думаю в дальнейшем пригодится. Пож...   Oct 1 2008, 15:34
|- - xelax   Цитата(Rst7 @ Oct 1 2008, 19:34) Пожалуйс...   Oct 1 2008, 15:52
|- - singlskv   Цитата(xelax @ Oct 1 2008, 19:52) На боль...   Oct 1 2008, 19:43
- - Rst7   ЦитатаА как собственно вы можете гарантировать так...   Oct 1 2008, 16:21
- - xelax   Цитата(Rst7 @ Oct 1 2008, 20:21) Я не мог...   Oct 1 2008, 19:07


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:38
Рейтинг@Mail.ru


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