|
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
|
|
|
|
|
Oct 1 2008, 10:31
|

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

|
Цитата(zltigo @ Oct 1 2008, 13:51)  Это не имеет никакого значения, поскольку у тех, котоые "во что горазд" и форматы/линкеры соответственно несовместимые, посему так или иначе библиотеку придется пересобирать и править исходники. Править всегда однотипные места в ASM исходниках, почитав абзац-другой в документации на конкретный компилятор много проще, чем разбираться с разнообразнейшими ASM вставками и последствиями их применения, для того-же конкретного компилятора. Вот этого я стремлюсь избежать всеми способами. Очень не хочется править код при переходе с компилятора на компилятор. Хотелось бы иметь единожды написанный и тщательно отлаженный код, который могли бы собирать, проверять и продавать без участия программиста. По крайней мере стремлюсь к этому. Цитата(zltigo @ Oct 1 2008, 13:51)  Хотя для этого просто нужно воспользоваться соответствующей прагмой жестко задающий нужный( высокий ) уровень оптимизации для кода/куска кода. Идея интересная, но в gcc с прагмами туго, а вообще надо покурить документацию. Цитата(Rst7 @ Oct 1 2008, 13:51)  А с какой точностью надо произвести измерение, за сколько времени и зачем результаты этого измерения нужны? Потому как мне кажется, что Вы себе задачу усложняете. Измерения нужны для калибровке RC генератора. Алгоритм калибровки из атмеловского даташита, асм частично позамствован тоже оттуда Один и тот же сишный код даёт разный дизасм от разных компиляторов. Gcc даёт код исполняемый за 11 тактов, iar за 7 (результаты при максимальной оптимизации по размеру). Про различную оптимизацию смотри мой предыдущий пост.
|
|
|
|
|
Oct 1 2008, 10:43
|

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

|
Цитата(xelax @ Oct 1 2008, 12:31)  Вот этого я стремлюсь избежать всеми способами. Вы к этому c Inline ASM просто рветесь всеми способами, а не избегаете  Цитата но в gcc с прагмами туго...  Это входит в джентельменский набор любого компилятора. Цитата ...продавать... Оооооо!
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2008, 13:46
|

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

|
Цитата(zltigo @ Oct 1 2008, 14:43)  Вы к этому c Inline ASM просто рветесь всеми способами, а не избегаете  По крайней мере с первого раза не скомпилировалась только одна вставка. Из ассемблерныйх файлов пришлось править абсолютно все. Объявление переменных, ссылки, дефайны, регистровые пары для передачи параметров и т.д. Так что всё о чём мы здесь разглагольствуем это аргументы, факты говорят о другом. Цитата(zltigo @ Oct 1 2008, 14:43)   Это входит в джентельменский набор любого компилятора. вот уж не факт. см. документацию на gcc gccЦитата(zltigo @ Oct 1 2008, 14:43)  Оооооо!  бывает... Цитата(Rst7 @ Oct 1 2008, 14:43)  Посему я делаю так (это код, который поддерживает тактовую частоту равной 8 МГц) Спасибо, думаю в дальнейшем пригодится. А вы пробовали измерять на интервалах меньше секунды? И на каком минимально интервале обеспечивается приемлемая точность калибровки(достаточная для обмена по уарту)? Дело в том что у меня есть тип девайсов которые работают намного меньше секунды, остальное время находятся в power save.
|
|
|
|
Сообщений в этой теме
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 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
|
|
|