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

 
 
> Не надо оптимизировать, Keil
toweroff
сообщение Mar 26 2009, 00:36
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Отдельный кусок с 3-мя циклами записи в external компилятор гонит полную чушь (но не с его, компилятора, точки зрения). В результате получаю 2 вместо трех шинных операций. Код для идентификациии чипа flash банален:

*((unsigned int*) (0x80000000 + (0x555<<2))) = 0xAA00;
*((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
*((unsigned int*) (0x80000000 + (0x555<<2))) = 0x9000;

Смещение на 2 разряда - т.к. шина 32 бита

в результате осциллом вижу только два обращения (записи) в память

Смещение на 8 бит - условие организации не от меня зависящей памяти

дополню:
Код
   281:         *((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
0x00002EA0  E3A01C55  MOV       R1,#0x00005500
   280:         *((unsigned int*) (0x80000000 + (0x555<<2))) = 0xAA00;
   281:         *((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
0x00002EA4  E3A00102  MOV       R0,#0x80000000
0x00002EA8  E58B1AA8  STR       R1,[R11,#0x0AA8]
0x00002EAC  E2800A01  ADD       R0,R0,#0x00001000
   282:         *((unsigned int*) (0x80000000 + (0x555<<2))) = 0x9000;
   283:


более из того куска компилятор не сделал


как компилятор заставить делать именно то (в данном случае) что я хочу? Есть ли описание C для Keil (ARM), чтобы не дергать лишний раз всех?

Сообщение отредактировал toweroff - Mar 26 2009, 00:52
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
aaarrr
сообщение Mar 26 2009, 00:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Компилятор все делает правильно. Используйте volatile unsigned int.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 26 2009, 01:10
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(aaarrr @ Mar 26 2009, 03:48) *
Компилятор все делает правильно. Используйте volatile unsigned int.


вот о чем я и говорю - где взять под Keil описание С? Не пойму, чем volatile отличается от простто (type)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 26 2009, 01:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Есть стандарты C89/C90/C99, у Кейла есть документация, в которой описаны отличия и особенности реализации (и volatile в эту категорию ну никак не попадает).
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 26 2009, 01:26
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(aaarrr @ Mar 26 2009, 04:15) *
Есть стандарты C89/C90/C99, у Кейла есть документация, в которой описаны отличия и особенности реализации (и volatile в эту категорию ну никак не попадает).


ок, перекопаю доки. Но все равно, описание (даже просто функции и типы данных с размерностью и способом хранения) для меня на данный момент - загадка, Keil это, в отличие от x51 не предоставляет в пакете
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 26 2009, 08:32
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Чем Keil-то провинился? Это вещи стандартные для языка, вне зависимости от конкретного типа компилятора.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 26 2009, 08:47
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(aaarrr @ Mar 26 2009, 11:32) *
Чем Keil-то провинился? Это вещи стандартные для языка, вне зависимости от конкретного типа компилятора.


да ничем, просто когда делал что-то под х51 было очень удобно пользоваться хелпом по С и всяким функциям, особенно где кто что требует из хидеров и типы параметров.

по volatile нашел... заставляет компилятор каждый раз обновлять значение из памяти, а не пользоваться регистрами. Indicates that a variable can be changed by a background routine.

Сообщение отредактировал toweroff - Mar 26 2009, 08:50
Go to the top of the page
 
+Quote Post
diwil
сообщение Mar 26 2009, 09:44
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(toweroff @ Mar 26 2009, 11:47) *
да ничем, просто когда делал что-то под х51 было очень удобно пользоваться хелпом по С и всяким функциям, особенно где кто что требует из хидеров и типы параметров.

по volatile нашел... заставляет компилятор каждый раз обновлять значение из памяти, а не пользоваться регистрами. Indicates that a variable can be changed by a background routine.


не совсем точно...
волатила означает, что переменная _может_ меняться неизвестным компилеру образом.
А это влечет за собой то, что все операции с переменной должны быть атомарными.
В любом случае, при записи по физическим адресам лучше использовать volatile
Go to the top of the page
 
+Quote Post
Vladimir_T
сообщение Mar 26 2009, 16:27
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Здравствуйте, уважаемые коллеги. В продолжении темы хотел спросить: если из прерывания модифицирую переменные, к примеру программные счетчики или флаги их также можно объявлять, как volatile. Может такое объявление добавить надежности в работе системы?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 26 2009, 16:42
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Если эти счетчики/флаги используются не только в прерывании, то их нужно объявлять как volatile.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 26 2009, 17:55
Сообщение #11


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(diwil @ Mar 26 2009, 12:44) *
А это влечет за собой то, что все операции с переменной должны быть атомарными.

должны то должны! но вот компилер об этом заботится не будет.
Компилер будет читать из памяти переменную всякий раз (столько раз сколько имя упоминается)
и писать тоже столько раз сколько присваивание происходит!
Но операции атомарными будут не всегда! рид модифи райт атомарной не будет, даже загрузка не всегда будет атомарной ( если нельзя сгенерировать одной асм командой).
Go to the top of the page
 
+Quote Post

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

 


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


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