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

 
 
> Как не звать __aeabi_idiv и иже сними?
kosyak©
сообщение Dec 9 2010, 11:59
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Есть код
Код
...
    volatile int d = 100;
    volatile int k = 11;
    volatile int q = d / k;
...

Компилятор (EWARM6101) при любом из уровней оптимизации компилирует это как
Код
                   volatile int d = 100;
  MOV      R1,#+100
  STR      R1,[SP, #+4]
                     volatile int k = 11;
  MOV      R1,#+11
  STR      R1,[SP, #+0]
     65              volatile int q = d / k;
                                  ^
   LDR      R0,[SP, #+4]
   LDR      R1,[SP, #+0]
   BL       __aeabi_idiv
   STR      R0,[SP, #+8]


Как заставить его не использовать __aeabi_idiv?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
demiurg_spb
сообщение Dec 9 2010, 14:00
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Код
    static const int D = 100;
    static const int K = 11;
  
    volatile int d = D;
    volatile int k = K;
    volatile int q = D / K;


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 9 2010, 19:02
Сообщение #3


Гуру
******

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



Цитата(kosyak© @ Dec 9 2010, 14:59) *
Как заставить его не использовать __aeabi_idiv?

А зачем, если не секрет?
Ну и, как уже отметил demiurg_spb, компилятор не стал оптимизировать этот код из-за того, что применено ключевое слово volatile. Всё правильно компилятор сделал.
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 9 2010, 20:11
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Так и думал что в волатиле начнут носом тыкать sm.gif
Ну тогда по порядку - волатиле написал сознательно, чтоб компилятор не проявлял чудеса оптимизМА и не посчитал мне это выражение на этапе компиляции sm.gif
Интересует конкретно вопрос как его заставить не использовать __aeabi_idiv а скомпилировать деление прям в функцию.
Вот, например (пример из пальца выососан сразу предупреждаю), - есть функция, она выполняется из рамки (RAM) и затирает скажем внутреннюю флэш.. в функции считается страница ( / ) и смещение ( % ) - и тут компилятор решил выпендриться и использовать для деления __aeabi_idiv, вместо того чтобы честно скомпилировать нужный код, __aeabi_idiv ессно лежит в стираемой флэше..вот такая вот загогулина...
Да, я конечно, понимаю что можно вю библиотеку используемых компилятором функций запихнуть в рамку и проблемы вроде как бы не станет - но интересует именно как заставить его их не использовать...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 10 2010, 08:06
Сообщение #5


Шаман
******

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



QUOTE (kosyak© @ Dec 9 2010, 22:11) *
Интересует конкретно вопрос как его заставить не использовать __aeabi_idiv а скомпилировать деление прям в функцию.

Вы не указали архитектуру. Если это ARM7TDMI-S, то функция __aeabi_idiv вместе с __aeabi_idivmod занимает 332 байта (Code Sourcery Lite). При таком размере компилятор её не проинлайнит.
QUOTE (kosyak© @ Dec 9 2010, 22:11) *
Вот, например (пример из пальца выососан сразу предупреждаю), - есть функция, она выполняется из рамки (RAM) и затирает скажем внутреннюю флэш.. в функции считается страница ( / ) и смещение ( % ) - и тут компилятор решил выпендриться и использовать для деления __aeabi_idiv, вместо того чтобы честно скомпилировать нужный код, __aeabi_idiv ессно лежит в стираемой флэше..вот такая вот загогулина...

Если размер Вашей страницы не является константой и не кратен степени двойки, то ничего удивительного в поведении компилятора нет.
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 10 2010, 08:13
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Архитектура действительно ARM7TDMI-S. Я тоже считаю что ничего удивительного нет, но осталась ли возможность принудительно инлайнить подобные функции?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 10 2010, 08:18
Сообщение #7


Шаман
******

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



А всё же. Каков размер страницы и почему он не константный?
Ведь всё могло свестись к сдвиговым операциям.
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 10 2010, 08:23
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Ну тогда дополню картину:
Стоит датафлэш AT45DBxxx (именно xxx), перепрошивка осуществляется через эту флэш - т.е. сперва полный бинарь записывается в нее, а потом, если все хорошо, камень перепрошивается. Вот тут и возник прикол с __aeabi_idiv. Я прекрасно понимаю что можно написать загручик который будет полностью работает в рамке и проблема снимется.... Предвосхищая вопросы - питание у устройства аккумуляторное.

Да и вообще - сейчас это уже больше академический интерес sm.gif.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 10 2010, 09:03
Сообщение #9


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Академический вопрос, что в загрузчике делает __aeabi_idiv ? На верняка можно обойтись без деления, ну если конечно не используется паковка, шифрование, хитрые CRC (обычные работают без деления).
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 10 2010, 09:12
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Страничная организация DataFlash. Из линейного адреса нужно посчитать - номер страницы, смещение в странице...
Делается все примерно так


page = la / page_size;
offs = la % page_size;

Предложите другой метод? Метод вычисления page и offs, а не метод нахождения частного и остатка.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 10 2010, 09:39
Сообщение #11


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Мда..... так и знал sm.gif

Все делается через маску и сдвиг
Код
#define ADDR_TO_SECTOR_NUMBER(x) ((x) >> 9) //for page == 512 bytes

#define ADDR_TO_PAGE_OFFSET(x) ((x) & 0x1FFu) //for page == 512 bytes





Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 10 2010, 09:45
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Цитата(kosyak© @ Dec 10 2010, 11:23) *
...
Стоит датафлэш AT45DBxxx (именно xxx)
...


Тем что "(именно xxx)" я хотел подчеркнуть, что на этапе компиляции я не знаю какую флэш поставят. Соответственно не знаю размер страницы... Мало того, сейчас стали приходить dataflash, у которых размер страницы - степень двойки... раньше у атмела в этих флэшах страница была с аппендиксом и ее размер не был равен степени двойки sm.gif.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 10 2010, 09:53
Сообщение #13


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



И какие с этим проблемы ?

Глава 14. Manufacturer and Device ID Read

Изучайте мат часть

Цитата
степень двойки... раньше у атмела в этих флэшах страница была с аппендиксом и ее размер не был равен степени двой


По моему вы вобще мануал не читали или не умеете sad.gif
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 10 2010, 09:57
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Уф!
Вообщем так - на плату может быть поставлена любая микросхема из серии AT45DBXXXD, программа должна определять по выше упомянутому Вами "Manufacturer and Device ID Read" тип микросхемы и, соответственно, размер страницы. Еще раз повторю - не все микросхемы серии AT45DBXXXD имеют размер страницы кратный степени двойки, соотвественно нельзя использовать "маску и сдвиг" для преобразования линейного адреса в страничный....
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 10 2010, 09:59
Сообщение #15


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



13. "Power of 2" Binary Page Size Option
"Power of 2" binary page size Configuration Register is a user-programmable nonvolatile regis-
ter that allows the page size of the main memory to be configured for binary page size
(512 bytes) or DataFlash standard page size (528 bytes). The "power of 2" page size is a one-
time programmable configuration register and once the device is configured for "power
of 2" page size, it cannot be reconfigured again. The devices are initially shipped with the
page size set to 528 bytes. The user has the option of ordering binary page size (512
bytes) devices from the factory. For details, please refer to Section 26. "Ordering Information" on
page 48.
For the binary "power of 2" page size to become effective, the following steps must be followed:
1. Program the one-time programmable configuration resister using opcode sequence
3DH, 2AH, 80H and A6H (please see Section 13.1).
2. Power cycle the device (i.e. power down and power up again).
3. The page for the binary page size can now be programmed.
If the above steps are not followed to set the page size prior to page programming, incorrect
data during a read operation may be encountered.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:24
Рейтинг@Mail.ru


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