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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Как оценить время в Keil, Не могу посчитать количество тактов
RabidRabbit
сообщение Mar 19 2010, 20:29
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(Nikitoc @ Mar 19 2010, 17:27) *
Я здесь вроде не читаю, а записываю...


Ну как же:
AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800;
Если подумать, откуда берётся значение выражения, выделенного жирным шрифтом? smile.gif
Поэтому вполне достаточно будет просто:
AT91C_BASE_PIOA -> PIO_CODR = 0x00000800;
То же самое для PIO_SODR.
Если записать в CODR 0x800 то установится в 0 только 11-й бит порта, на остальные никакого влияния не будет smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2010, 20:37
Сообщение #17


Гуру
******

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



Цитата(Nikitoc @ Mar 19 2010, 17:27) *
Код
AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800

Я здесь вроде не читаю, а записываю...
Как это сделать - на асме или на Си тоже можно?

Читаете, естественно. Откуда иначе возьмется содержимое PIO_CODR, над которым производится операция bitwise OR?

Если принять во внимание совершенную бесполезность чтения PIO_CODR (вредность, точнее, ибо никто даже не гарантирует,
что из этого регистра будет считан 0, хотя на практике это и так), то останется:
Код
AT91C_BASE_PIOA->PIO_CODR = 0x00000800;

И этот код даст точно такой же результат.

P.S. Запись вида a |= 1 вместо a = a | 1 делает код гораздо более удобочитаемым.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Mar 19 2010, 22:45
Сообщение #18


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Огромное спасибо за пояснения уважаемым гуру. Я, видите ли, не силен в arm-ассемблере (в СИ тоже не профессор biggrin.gif ), знаю более-менее только микрочиповский, для 8-битников, но это совсем другое дело . С этим чтением запутался вообще. В общем сделал как вы рекомендовали и скомпилилось компактней:
Код
0x00103C14  E3A01B02  MOV       R1,#0x00000800
0x00103C18  E3A00000  MOV       R0,#pI2C(0x00000000)
0x00103C1C  E5001BD0  STR       R1,[R0,#-0x0BD0]
  3169:       AT91C_BASE_PIOA -> PIO_CODR =  0x00000800;
0x00103C20  E5001BCC  STR       R1,[R0,#-0x0BCC]
0x00103C24  EAFFFFFC  B         0x00103C1C

здесь:
Код
AT91S_TWI  * pI2C = AT91C_BASE_TWI;
#define AT91C_BASE_TWI       (AT91_CAST(AT91PS_TWI)     0xFFFB8000) // (TWI) Base Address


Вроде бы (особенно с вашими разъяснениями) код стал понятен, кроме строки:
Код
0x00103C18  E3A00000  MOV       R0,#pI2C(0x00000000)

Как я не отнимал от 0xFFFB8000 0x0BD0 и 0x0BCC, базовых адресов регистров PIO_CODR (0xFFFFF434) PIO_SODR (0xFFFFF430) я не получил wacko.gif . Что я неправильно понимаю? Почему нельзя занести в регистр R0 значение не pI2C, а pPIO? Относительно него смещения были бы меньше.

Сообщение отредактировал Nikitoc - Mar 19 2010, 22:47
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2010, 22:51
Сообщение #19


Гуру
******

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



Цитата(Nikitoc @ Mar 20 2010, 01:45) *
Вроде бы (особенно с вашими разъяснениями) код стал понятен, кроме строки:
Код
0x00103C18  E3A00000  MOV       R0,#pI2C(0x00000000)

Как я не отнимал от 0xFFFB8000 0x0BD0 и 0x0BCC, базовых адресов регистров PIO_CODR (0xFFFFF434) PIO_SODR (0xFFFFF430) я не получил. Что я неправильно понимаю? Почему нельзя занести в регистр R0 значение не pI2C, а pPIO? Относительно него смещения были бы меньше.

А почему от 0xFFFB8000, а не от 0, как, собственно, и написано в команде? 0 - 0x0BD0 = 0xFFFFF430; 0 - 0x0BCC = 0xFFFFF434
Откуда в листинге взялся pI2C - остается только гадать. Вполне допускаю, что это просто своеобразный глюк дизассемблера.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Mar 19 2010, 23:11
Сообщение #20


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Хм. Ну ладно, но нафига тогда эта петрушка со смещениями? Почему в качестве операнда надо указывать [R0,#-0x0BD0] или [R0,#-0x0BCC] а не, непосредственно адрес, допустим, [0xFFFFF434] ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2010, 23:15
Сообщение #21


Гуру
******

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



Потому что в 32 бита команды не получится упихать 32 бита адреса. Изучите систему команд, многое прояснится.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Mar 19 2010, 23:27
Сообщение #22


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Да я вообще и пытаюсь это делать. Но блин, тяжело дается. С помощью сообщества гораздо проще. Да и в любом случае, на примерах удобней учится, чем тупо читать англоязычный даташит и пытаться уместить его весь в голове, а потом по кусочкам доставать нужное.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2010, 23:39
Сообщение #23


Гуру
******

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



Цитата(Nikitoc @ Mar 20 2010, 02:27) *
Да я вообще и пытаюсь это делать.

Это хорошо, это правильно smile.gif
Посмотрите вот этот старый кошерный даташит с подробным разбором системы команд и примерами. Современные, увы, уже не так хороши.

Прикрепленный файл  arm7tdmi.part1.rar ( 400 килобайт ) Кол-во скачиваний: 128

Прикрепленный файл  arm7tdmi.part2.rar ( 400 килобайт ) Кол-во скачиваний: 107

Прикрепленный файл  arm7tdmi.part3.rar ( 375.09 килобайт ) Кол-во скачиваний: 113
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Mar 20 2010, 09:49
Сообщение #24


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Пасибки. Попробую дочитать хотя бы до половины smile.gif Лично у меня в библиотеке имеются два "учебника" по армовскому асму 1999 и 2004 годов. Увлекательно, конечно, читать. Особенно когда доходит смысл написанного. Но иногда нужно прочесть одно и то же раз 5-10, чтобы въехать. Но если не применять на практике, то оно моментально выветривается. А вот за вчерашний день я аж 4 команды выучил (LDR, MOV, ORR и STR)! И теперь не скоро их забуду :-) В общем, большое спасибо за помощь. Будем двигаться дальше помаленьку.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 21 2010, 00:23
Сообщение #25


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Nikitoc @ Mar 19 2010, 15:47) *
А не подскажете, случайно, где можно подробно посмотреть время исполнения (в тактах) ассемблерных команд?

Да собсно можно просто подумать логически, например команда LDR загружает слово из памяти в регистр.
Проц делает выборку слова команды из ОЗУ, а затем выполняя эту команду читает еще одно слово из того же ОЗУ в регистр. Не может же он за один такт оба слова прочитать.
Аналогично и с STR.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 21 2010, 01:11
Сообщение #26


Гуру
******

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



По такой логике LDR и STR должны занимать одинаковое число тактов, что не соответствует действительности.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 21 2010, 01:34
Сообщение #27


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Mar 21 2010, 03:11) *
По такой логике LDR и STR должны занимать одинаковое число тактов, что не соответствует действительности.

По такой логике ясно, что и LDR, и STR - выполняются не за один такт.
То, что запись и чтение это разные операции это уже другая логика. А конкретное количество тактов смотрится в Instruction Set Reference и зависит от конкретной архитекуры.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 21 2010, 01:47
Сообщение #28


Гуру
******

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



Цитата(defunct @ Mar 21 2010, 04:34) *
...А конкретное количество тактов смотрится в Instruction Set Reference и зависит от конкретной архитекуры.

И может быть на некоторых архитектурах равно одному. Так что все равно начинать надо с чтения и изучения.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 21 2010, 02:09
Сообщение #29


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Mar 21 2010, 03:47) *
И может быть на некоторых архитектурах равно одному. Так что все равно начинать надо с чтения и изучения.

Но только не на ARM7 ;> Со вторым выводом солидарен.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Apr 6 2010, 15:59
Сообщение #30


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Продолжаю терзать at91sam7s256.

Привожу код который я написал для работы с SPI. Самое удивительное (для меня) и чему я не могу найти объяснения - это то, что код этот нормально работал (писал на SD-карточку), а теперь перестал работать.

Код
/////////////////////////////////////////////////////////////////////////////
void CONFIG_SPI () {
    pSPI -> SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | (AT91C_SPI_PCS & (0x0D << 16));    //Master mode,  use freq divider, select 1 chanel CS.
    pSPI -> SPI_CSR[1] = AT91C_SPI_NCPHA | AT91C_SPI_BITS_8 | AT91C_SPI_CSAAT | (AT91C_SPI_SCBR & (SCBR << 8));    // clock idle low, data valid on rising edge, 8-bit data
    pSPI -> SPI_CR = AT91C_SPI_SPIEN | AT91C_SPI_LASTXFER;
}
/////////////////////////////////////////////////////////////////////////////////////
char SPI (char DATA) {
    pSPI -> SPI_TDR = DATA;    
    while (!(pSPI -> SPI_SR & AT91C_SPI_TDRE));   /* Wait for Empty Tx Buffer */    
    while (!(pSPI -> SPI_SR & AT91C_SPI_RDRF));    
    return (pSPI -> SPI_RDR & 0xFF);  
}
////////////////////////////////////////////////////////////////////////////////////


Просьба помочь найти ошибку.
Go to the top of the page
 
+Quote Post

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

 


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


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