|
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, 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 Первую асмовскую вставку можно было бы и не деалть, а оставить код на С, но её я написал для тренировки  . А вот без второй я думаю обойтись нельзя.
|
|
|
|
|
Oct 1 2008, 09:51
|

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

|
Цитата(xelax @ Oct 1 2008, 11:04)  Более того, считаю свои познаниями в ассемблере ниже среднего уровня и стараюсь писать код только на С. Тем не менее, написали кусок на ASM и это нормально! Цитата Код который я был ВЫНУЖДЕН написать на.... Читать не стал, поскольку см. ниже... Цитата Не стал делать функции на чистом асме по одной простой причине. Для avr нет никакого стандарта передачи параметров в функцию и обратно подобно thumb-interwork для arm. И поэтому каждый производитель asm компилятора бузует свои правила кто во что горазд. Это не имеет никакого значения, поскольку у тех, котоые "во что горазд" и форматы/линкеры соответственно несовместимые, посему так или иначе библиотеку придется пересобирать и править исходники. Править всегда однотипные места в ASM исходниках, почитав абзац-другой в документации на конкретный компилятор много проще, чем разбираться с разнообразнейшими ASM вставками и последствиями их применения, для того-же конкретного компилятора. Цитата Так что всё таки это не пижонство  , а суровые будни программиста. "А я тогда кто?" © анекдот  Цитата(tag @ Oct 1 2008, 11:38)  ...мне кажется вы себе усложняете жизнь, почему бы это просто на C не написать? На ум приходит только: Цитата Также у меня требования к коду, это работоспособность оного на любом уровне оптимизации компилятора Хотя для этого просто нужно воспользоваться соответствующей прагмой жестко задающий нужный( высокий ) уровень оптимизации для кода/куска кода. Кроме того, а причем это к "библиотеке"-то? Если это действительно библиотека, то как соберете сами, так и будет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
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    tag Цитата(xelax @ Oct 1 2008, 13:04) Первую ... Oct 1 2008, 09:38     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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|