|
local register variable, в определённом регистре |
|
|
|
Oct 1 2008, 09:38
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(xelax @ Oct 1 2008, 13:04)  Первую асмовскую вставку можно было бы и не деалть, а оставить код на С, но её я написал для тренировки  . А вот без второй я думаю обойтись нельзя. ...мне кажется вы себе усложняете жизнь, почему бы это просто на C не написать?
|
|
|
|
|
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, 10:50
|

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

|
Цитата Измерения нужны для калибровке RC генератора. Алгоритм калибровки из атмеловского даташита, асм частично позамствован тоже оттуда Ага. Таки я телепат  )) Я так и думал. Ну так вот что я Вам скажу. Если Вас не устраивает начальная точность калибровки внутреннего RC, то Вам необходимо подстраивать его все время, он от температуры и питания плавает больше погрешности заводской калибровки. Посему я делаю так (это код, который поддерживает тактовую частоту равной 8 МГц) Код #pragma vector=TIMER2_OVF_vect __interrupt void INT_PLL(void) { unsigned int i=TCNT1; TCNT1=0; if (i<7813) OSCCAL++; //Увеличиваем тактовую частоту else OSCCAL--; //Уменьшаем тактовую частоту SECOND_PULSE=1; }
void InitPLL(void) { TCCR1B=5; //Прескаллер 1:1024, за одну секунду - 7812.5 тактов => сравнение с 7813 TCCR2B=5; //Прескаллер 1:128 - раз в секунду ASSR=1<<AS2; TIMSK2=1<<TOIE2; } Вот это решение правильно со всех сторон - и асма нет, и постоянно подстраивает.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
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.
|
|
|
|
|
Oct 1 2008, 15:34
|

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

|
Цитата Спасибо, думаю в дальнейшем пригодится. Пожалуйста. Но, видимо, главная моя мысль в Ваш мозг пока не проникла. Она заключается в следующем - надо сравнивать значения 2х аппаратных таймеров, а не одного программного и одного аппаратного. Именно в этом корень Ваших проблем, а не в том, как разработчики разных компиляторов смотрят на идеологию написания програм на языке Си. Цитата И на каком минимально интервале обеспечивается приемлемая точность калибровки Тут надо смотреть, на каком интервале ошибка, вносимая программными задержками при чтении данных с таймера станет меньше, ну скажем, 0.2% (в худшем случае). Но ответить на этот вопрос сможете только Вы сами, зная программно-аппаратную архитектуру Вашей разработки.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 1 2008, 15:52
|

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

|
Цитата(Rst7 @ Oct 1 2008, 19:34)  Пожалуйста. Но, видимо, главная моя мысль в Ваш мозг пока не проникла. Она заключается в следующем - надо сравнивать значения 2х аппаратных таймеров, а не одного программного и одного аппаратного. Именно в этом корень Ваших проблем, а не в том, как разработчики разных компиляторов смотрят на идеологию написания програм на языке Си. Это Вы как определили? Опять телепатическими способностями Цитата(Rst7 @ Oct 1 2008, 19:34)  Тут надо смотреть, на каком интервале ошибка, вносимая программными задержками при чтении данных с таймера станет меньше, ну скажем, 0.2% (в худшем случае). Но ответить на этот вопрос сможете только Вы сами, зная программно-аппаратную архитектуру Вашей разработки. А как собственно вы можете гарантировать такую задержку. Контролллер прерываний в меге не имеет программируемых приоритетов. Может возникнуть одновременно эн прерываний более приоритетных нежели от пререполнения асинхронного таймера. На больших интервалах это примерно усредняется, а на малых как повезёт получается?
|
|
|
|
|
Oct 1 2008, 16:21
|

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

|
Цитата А как собственно вы можете гарантировать такую задержку Я не могу. Я же сказал, что Цитата ответить на этот вопрос сможете только Вы сами, зная программно-аппаратную архитектуру Вашей разработки
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 1 2008, 19:43
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(xelax @ Oct 1 2008, 19:52)  На больших интервалах это примерно усредняется, а на малых как повезёт получается? Ну Вы же сами себе и ответили...  , вот и усредняйте по 256 секундам например, те смена OSCCAL не чаще чем 1 раз за 256 секунд, для уплывания по температуре это более чем достаточно... А для начальной настройки сделайте функции которые вызываются с отключенными остальными прерываниями.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|