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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 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
Dog Pawlowa
сообщение Sep 30 2008, 14:14
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(xelax @ Sep 30 2008, 12:56) *
Есть какие нибудь идеи как сделать аналогично на iar.

Идеи есть - забить на ассемблер smile.gif
IAR пошевелится и наоптимизирует лучше чем GCC + asm


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 30 2008, 14:21
Сообщение #3


Местный
***

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



Цитата(Dog Pawlowa @ Sep 30 2008, 18:14) *
Идеи есть - забить на ассемблер smile.gif
IAR пошевелится и наоптимизирует лучше чем GCC + asm


smile.gif Эт конечно понятно, но мне необходимо знать точно сколько тактов заимает сия процедура, а на С её размер будет менятся в зависимости от версии компилятора.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 1 2008, 04:50
Сообщение #4


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

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



Цитата
Возникли проблемы с ассемблерными вставками


Немудрено. Потому как инлайновский асм в IAR'е ничего из наворотов гнуся не позволяет делать. Посему - перепишите нужные процедуры на чистом асме, и не мучайтесь.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
xelax
сообщение Oct 1 2008, 05:39
Сообщение #5


Местный
***

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



Что-то как-то грустно это всё... IAR немалых денех стоит, а функционал компилятора слабоват...
Попробую задать этот вопрос в иаровский support...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 1 2008, 05:46
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



//размещаем в свободных регистрах ввода/вывода
__no_init volatile ckps_flags f1@0x22;

не моё, так что без комментариев
насчёт локальности тоже не знаю... а вдруг прокатит?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 1 2008, 06:01
Сообщение #7


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

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



Цитата
IAR немалых денех стоит, а функционал компилятора слабоват...


Не знаю. Крутоват наезд, как по мне. Лично я считаю, что асмовские вставки гнуся - это лишнее. На Си же пишем, а не на помеси рязанского с французким. С точки зрения красоты лучше, когда чистый асмовский код живет отдельной жизнью в отдельных файлах.

А если надо какую-то специфическую комманду исполнить поперек сишного кода - так все в intrinsics'ах есть, всякие __watchdog_reset() и т.д.


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


Гуру
******

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



Цитата(Rst7 @ Oct 1 2008, 08:01) *
С точки зрения красоты лучше, когда чистый асмовский код живет отдельной жизнью в отдельных файлах.

Абсолютно поддерживаю и читабельность, и портируемость, и невыкручивание рук оптимизатору. Использование ASM вставок, при наличии продуманной системы intrinsics, больше тянет на мелкое пижонство, нежели на действительно полезный механизм.


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


Местный
***

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



Отлично, определились.
Я мелкий пижон, который пишет кривой код.

А помимо флуда есть что-то по существу?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 1 2008, 07:19
Сообщение #10


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

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



Цитата
А помимо флуда есть что-то по существу?


Вам же ответили:
Цитата
перепишите нужные процедуры на чистом асме


Кроме того, хорошо бы знать задачу более глобально. Покажите всю функцию.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
tag
сообщение Oct 1 2008, 07:22
Сообщение #11


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

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


Местный
***

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


Гуру
******

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


Местный
***

Группа: Свой
Сообщений: 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
Rst7
сообщение Oct 1 2008, 09:27
Сообщение #15


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

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



Цитата
Код который я был ВЫНУЖДЕН написать на асмовских вставках производит измерение тактовый частоты микроконтроллера, с помощью асинхронного осциллятора на часовом кварце.


А с какой точностью надо произвести измерение, за сколько времени и зачем результаты этого измерения нужны? Потому как мне кажется, что Вы себе задачу усложняете.


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

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

 


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


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