1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
|
|
1 | |
Запрет оптимизации макроса (Atmel Studio, GCC)03.08.2015, 11:43. Показов 4695. Ответов 18
Метки нет (Все метки)
Есть макрос, написанный на ассемблере. Как запретить оптимизацию этого макроса?
#define delayUs(us) __asm volatile(" <ассемблерный код> ") Среда разработки Atmel Studio, компилятор GCC.
0
|
03.08.2015, 11:43 | |
Ответы с готовыми решениями:
18
Atmel Studio 6.2, GCC, повторное использование кода Почему AVR Studio 4, а не Atmel Studio 6? Оптимизации при компиляции gcc в ассемблерный код Atmel Studio Atmel studio 6.1 |
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
03.08.2015, 20:10 | 2 |
непонятен контекст. Что значит запретить оптимизацию? то что вы показали - это не макрос в ассемблерном понимании. Покажите, в каком именно месте компилятор его выкидывает, и что написано в кавычках.
0
|
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
|
||||||
04.08.2015, 09:08 [ТС] | 3 | |||||
Вот код полностью:
1
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
04.08.2015, 09:26 | 4 |
Сдается мне, вы вообще отключаете в этом случае оптимизацию ), для всего проекта.
Чтобы ограничить действие атрибута функцией организуйте вашу задержку в виде inline-функции, а не дефайна. девайн - хоть и точнее можно понять, но в данном случае менее гибок и коряво выглядит в исходнике.
0
|
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
|
|
04.08.2015, 12:18 [ТС] | 5 |
Если делать через inline функцию, не будет ли меняться время вызова этой функции при изменении оптимизации?
0
|
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
|
|
04.08.2015, 12:47 | 6 |
1
|
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
|
|||||||||||
04.08.2015, 14:40 [ТС] | 7 | ||||||||||
В заголовочном файле:
Что я делаю не так?
0
|
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
|
||||||
04.08.2015, 15:00 | 8 | |||||
1. Модификатор inline оставьте только в си файле в хендоре inline уберите.
2. Есть правило/соглашение в СИ Кстати, из какого файла проекта, Вы, пытаетесь вызвать функцию? И вообще не стал бы париться с асм вставками
0
|
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
|
|
04.08.2015, 15:19 [ТС] | 9 |
1. Уже сам дошел до этого экспериментальным путем
2. Я правильно понял, вместо объявления функции в хедере, можно сразу определить ее? Не работает... А это принципиально? Из main.c прям в самой функции main. Всё дело в точности. Хотелось чтобы функция/макрос delayUs выполнялась ровно микросекунду Почему-то никакого инлайна не получается. Смотрел в дизассемблере, хоть с инлайн, хоть без, происходит просто вызов функции, что дает большую погрешность по времени задержки. Вобщем вернулся к тому, с чего начинал. Решил оставить макрос и забить на всякие там оптимизации. С оптимизацией O2 погрешность меньше процента.
0
|
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
|
||||||
04.08.2015, 16:00 | 10 | |||||
Документация наше всё
Смотрите документацию на свой компилятор. Про мой пишут, что вот так надо:
Не по теме: Всё дело в волшебных пузырьках
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
||||||
04.08.2015, 16:55 | 11 | |||||
Haamu, попробуйте еще так написать:
0
|
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
|
||||||
04.08.2015, 17:29 [ТС] | 12 | |||||
Попробовал все три варианта:
0
|
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
|
|
04.08.2015, 17:41 | 13 |
Я таки говорил, что лучше читать документацию
Вот документ как раз по Вашей проблеме, короче inline не нужен http://www.ethernut.de/pdf/GCCAVRInlAsmCB.pdf
0
|
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
|
|
05.08.2015, 09:17 [ТС] | 14 |
Спасибо, но немного не то. Во-первых нет ничего на счет оптимизации, во-вторых у меня ARM, а не AVR.
0
|
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
|
|
05.08.2015, 10:15 | 15 |
упс, сбило, что Atmel Studio, как то забыл, что она умеет и с Atmel(овскими) ARM работать. Но для arm еще легче документация ищется, например http://www.ethernut.de/en/docu... e-asm.html
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
05.08.2015, 21:43 | 16 |
Haamu, сомневаюсь я однако, что делать на АРМе задержку в цикле - это хорошая идея. Для этого в подавляющем большинстве контроллеров есть таймеры и система прерываний с приоритетами. Добиться большой точности измерения времени не так уж и сложно, чего не скажешь о выполнении задачи тотально без прерываний - на арме это допустимо в архи-критических случаях.
0
|
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
|
|
05.08.2015, 22:04 | 17 |
Поддержу уважаемого Voland_, делать программную задержку на ARM, а зачем? А если еще и для GPIO, то совсем печально. ИМХО конечно.
0
|
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
|
|
06.08.2015, 11:06 [ТС] | 18 |
Полностью с вами согласен, что не хорошо делать задержку в цикле Но я совсем чуть-чуть, всего одну микросекунду и очень редко. Для этих целей пользовать какую-то периферию как-то не хочется. Да и точность по сути не особо критична. Просто для общего развития хотелось попробовать сделать с точностью до такта. Спасибо что откликнулись.
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
06.08.2015, 22:29 | 19 |
ну, а вы вообще читали как выполняются инструкции в АРМах? Насчет PREFETCH, FLASH wait-states, выполнении кода из разных типов памяти? АРМы не выполняют инструкции строго по тактам и посчитать это не так просто.
0
|
06.08.2015, 22:29 | |
06.08.2015, 22:29 | |
Помогаю со студенческими работами здесь
19
Atmel Studio 6.0 Atmel Studio Atmel studio 6 Atmel Studio 7 и Arduino Дизассемблирование в Atmel Studio 6.2 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |