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

 
 
> Про IAR компилятор С
Dopler
сообщение Feb 6 2007, 14:45
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Здравствуйте.

Раньше никогда на C под железо не писал, только на ассемблере. Но жизнь показывает, что для ARM писать все на asm не актуально. Начал смотреть, какой код генерирует компилятор. Вот для примера две строки на C:

Код
      for(waiting_time = 1999; waiting_time >= 0; waiting_time--);

      for(waiting_time = 0; waiting_time <= 2000; waiting_time++);


Обе эти строки эквивалентны с точки зрения выполнения программы на С (т.е. будет 2000 шагов). Компилятор генерирует следующий код:

\ main:
\ ??main_0:
\ 00000000 CF00A0E3 MOV R0,#+207
\ 00000004 700E80E3 ORR R0,R0,#0x700
\ 00000008 000000EA B ??main_1
\ ??main_2:
\ 0000000C 010040E2 SUB R0,R0,#+1
\ ??main_1:
\ 00000010 000050E3 CMP R0,#+0
\ 00000014 FCFFFF5A BPL ??main_2
19
20 //AT91C_BASE_PIOB->PIO_CODR = 1 << 22;
21 for(waiting_time = 0; waiting_time < 2000; waiting_time++) ;
\ 00000018 0000A0E3 MOV R0,#+0
\ ??main_3:
\ 0000001C 7D0E50E3 CMP R0,#+2000
\ 00000020 F6FFFFAA BGE ??main_0
\ 00000024 010080E2 ADD R0,R0,#+1
\ 00000028 FBFFFFEA B ??main_3



Мне кажется, что выделенная строка явно лишняя, так как флаг нулевого значения выставляется и в предыдущей команде. Во-вторых, при декременте (в первом варианте) есть лишний переход. Таким образом, эквивалентность циклов на С достигнута искуственно. Возможно, это сделано специально (а возможно, человек пока способен генерировать все же лучший код)? Возможно, это где-то описанно или отключается?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Feb 9 2007, 11:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Если я правильно понял, нужно получить малые задержки. Предлагаю для этих целей написать функцию на ассемблере и вызывать её из Си. Если пытаться добиться этого при помощи компилятора, то результат будет зависеть от опций компилятора и, возможно, его версии, что не очень приятно (проапгрейдили компилятор - будьте готовы к тому, что старый код перестанет работать).
Время выполнения кода зависит от модели процессора и задержек при доступе к памяти. Для процессора ARM7TDMI времена выполнения инструкций указаны в "ARM7TDMI Technical Reference Manual":
http://www.arm.com/pdfs/DDI0210C_7tdmi_r4p1_trm.pdf (2 MB)
О задержках при доступе к памяти: см. документацию на используемый микроконтроллер.
Go to the top of the page
 
+Quote Post
Dopler
сообщение Feb 9 2007, 12:36
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата(scifi @ Feb 9 2007, 11:37) *
Если я правильно понял, нужно получить малые задержки. Предлагаю для этих целей написать функцию на ассемблере и вызывать её из Си.


Просто для совсем маленьких функций накладные расходы по вызову и передаче параметров неприятны. Если бы можно было бы функцию на asm сделать inline, было бы здорово.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 19 2008, 08:37
Сообщение #4


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

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



Цитата(Dopler @ Feb 9 2007, 15:36) *
Просто для совсем маленьких функций накладные расходы по вызову и передаче параметров неприятны. Если бы можно было бы функцию на asm сделать inline, было бы здорово.

А функцию на си можно инлайн объявить?
Если да, то что мешает внутри написать
asm("something asm text");

Я вот чё-то только __no_inline нашёл, то есть наоборот, запрет инлайна


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 19 2008, 08:48
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(MrYuran @ Mar 19 2008, 10:37) *
А функцию на си можно инлайн объявить?
Если да, то что мешает внутри написать
asm("something asm text");

Я вот чё-то только __no_inline нашёл, то есть наоборот, запрет инлайна

#pragma inline=forced
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dopler   Про IAR компилятор С   Feb 6 2007, 14:45
- - Newegor   Поиграйтесь с настройками оптимизации. При различн...   Feb 6 2007, 15:08
- - VAI   я, обычно, смотрю листинг, что у меня получилось, ...   Feb 6 2007, 16:58
|- - scifi   Забавно, а у меня комилятор в обоих случаях сгенер...   Feb 8 2007, 15:26
|- - Dopler   Цитата(scifi @ Feb 8 2007, 15:26) Приме...   Feb 8 2007, 16:02
|- - Сергей Борщ   Цитата(Dopler @ Feb 8 2007, 15:02) Если у...   Feb 8 2007, 17:28
- - scifi   ЦитатаСледующий вопрос, а как-нибудь вообще можно ...   Feb 8 2007, 20:49
|- - Dopler   Цитата(scifi @ Feb 8 2007, 20:49) Попробу...   Feb 8 2007, 22:21
|- - zltigo   Цитата(Dopler @ Feb 8 2007, 21:21) И при ...   Feb 8 2007, 22:50
- - Dopler   Похоже самый надежный способ, это тот, который рек...   Feb 9 2007, 08:51
|- - zltigo   Цитата(scifi @ Feb 9 2007, 10:37) Время в...   Feb 9 2007, 13:13
|- - Dopler   Цитата(zltigo @ Feb 9 2007, 13:13) Цитата...   Feb 9 2007, 14:40
|- - zltigo   Цитата(Dopler @ Feb 9 2007, 13:40) Я имел...   Feb 9 2007, 15:09
- - Dopler   Так #pragma optimize не позволяет повысить уровень...   Feb 9 2007, 13:02
- - Dopler   Вернемся к поиску оптимального кода. Приведенный в...   Feb 9 2007, 23:21
- - Dopler   А вообще, компилятор действительно не плох, он цеп...   Feb 9 2007, 23:32
|- - MALLOY2   Вот что у меня получилось IAR 4.41 оптимизция полн...   Feb 20 2007, 00:07
- - aspID   дабы не открывать новую ветку... Помогите понять,...   Mar 19 2008, 07:03
- - IgorKossak   Цитата(aspID @ Mar 19 2008, 09:03) дабы н...   Mar 19 2008, 08:03
- - aspID   Цитата(IgorKossak @ Mar 19 2008, 14:03) Н...   Mar 19 2008, 08:08
- - IgorKossak   Цитата(aspID @ Mar 19 2008, 10:08) Да, им...   Mar 19 2008, 08:13


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

 


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


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