|
at91, помогите разобраться |
|
|
|
Aug 15 2008, 19:08
|

Участник

Группа: Участник
Сообщений: 35
Регистрация: 8-07-07
Пользователь №: 28 963

|
Помогите разобраться, пожалуйста. в Header AT91SAM7S256.h файле написано: Код typedef struct _AT91S_PMC { AT91_REG PMC_SCER; // System Clock Enable Register AT91_REG PMC_SCDR; // System Clock Disable Register AT91_REG PMC_SCSR; // System Clock Status Register AT91_REG Reserved0[1]; // AT91_REG PMC_PCER; // Peripheral Clock Enable Register AT91_REG PMC_PCDR; // Peripheral Clock Disable Register AT91_REG PMC_PCSR; // Peripheral Clock Status Register AT91_REG Reserved1[1]; // AT91_REG PMC_MOR; // Main Oscillator Register AT91_REG PMC_MCFR; // Main Clock Frequency Register AT91_REG Reserved2[1]; // AT91_REG PMC_PLLR; // PLL Register AT91_REG PMC_MCKR; // Master Clock Register AT91_REG Reserved3[3]; // AT91_REG PMC_PCKR[3]; // Programmable Clock Register AT91_REG Reserved4[5]; // AT91_REG PMC_IER; // Interrupt Enable Register AT91_REG PMC_IDR; // Interrupt Disable Register AT91_REG PMC_SR; // Status Register AT91_REG PMC_IMR; // Interrupt Mask Register } AT91S_PMC, *AT91PS_PMC; далее ниже Код #define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address в программе: Код AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; правильно ли я понял, что AT91PS_PMC - указатель на структуру_AT91S_PMC. AT91C_BASE_PMC - ее начальный адресс, строчка в программе означает, в регистр PMC_SCER (по адресу AT91C_BASE_PMC + 5*AT91_REG) записать значение AT91C_PMC_UDP? ----------------- теперь файл: lib_AT91SAM7S256.h Код __inline unsigned int AT91F_AIC_ConfigureIt ( AT91PS_AIC pAic, // \arg pointer to the AIC registers unsigned int irq_id, // \arg interrupt number to initialize unsigned int priority, // \arg priority to give to the interrupt unsigned int src_type, // \arg activation and sense of activation void (*newHandler) () ) // \arg address of the interrupt handler { unsigned int oldHandler; unsigned int mask;
oldHandler = pAic->AIC_SVR[irq_id];
mask = 0x1 << irq_id; //* Disable the interrupt on the interrupt controller pAic->AIC_IDCR = mask; //* Save the interrupt handler routine pointer and the interrupt priority pAic->AIC_SVR[irq_id] = (unsigned int) newHandler; //* Store the Source Mode Register pAic->AIC_SMR[irq_id] = src_type | priority; //* Clear the interrupt on the interrupt controller pAic->AIC_ICCR = mask;
return oldHandler; } как компилятор узнает адрес регистра AIC_IDCR? Код pAic->AIC_IDCR = mask; ведь pAic это есть AT91PS_AIC, но на какой начальный адрес он указывает НЕТ в библиотеке Код typedef struct _AT91S_AIC { AT91_REG AIC_SMR[32]; // Source Mode Register AT91_REG AIC_SVR[32]; // Source Vector Register AT91_REG AIC_IVR; // IRQ Vector Register AT91_REG AIC_FVR; // FIQ Vector Register AT91_REG AIC_ISR; // Interrupt Status Register AT91_REG AIC_IPR; // Interrupt Pending Register AT91_REG AIC_IMR; // Interrupt Mask Register AT91_REG AIC_CISR; // Core Interrupt Status Register AT91_REG Reserved0[2]; // AT91_REG AIC_IECR; // Interrupt Enable Command Register AT91_REG AIC_IDCR; // Interrupt Disable Command Register AT91_REG AIC_ICCR; // Interrupt Clear Command Register AT91_REG AIC_ISCR; // Interrupt Set Command Register AT91_REG AIC_EOICR; // End of Interrupt Command Register AT91_REG AIC_SPU; // Spurious Vector Register AT91_REG AIC_DCR; // Debug Control Register (Protect) AT91_REG Reserved1[1]; // AT91_REG AIC_FFER; // Fast Forcing Enable Register AT91_REG AIC_FFDR; // Fast Forcing Disable Register AT91_REG AIC_FFSR; // Fast Forcing Status Register } AT91S_AIC, *AT91PS_AIC; спасибо
Сообщение отредактировал i.dmitry - Aug 15 2008, 19:10
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Aug 17 2008, 14:31
|

Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250

|
Цитата(aaarrr @ Aug 17 2008, 17:18)  Если не трудно, приведите пример. Ну не знаю я в SAM'ах регистров, назначение которых может быть не понятно. ... Велика - спать спокойно не смогу  От каких ошибок может предостеречь использование AT91F_AIC_ConfigureIt? Если Вы, когда начали изучать SAM7, имели достаточный опыт, или хотя бы у Вас неподалеку находился знающий коллега, который всегда подскажет, то никаких проблем, все понятно. А если не хватает опыта и некому подсказать, то даже совершенно пустяковые сомнения в правильности своего понимания проблемы могут стать серьезным препядствием и положить начало "копанию" не в ту сторону. У меня, например, помню случались сомнения в правильности выбранной мной последовательности программирования регистров модуля при конфигурировании, и тут "подглядывание" в lib_AT91 помогало быстрее, что называется на примере, разобраться с проблемой. Цитата От каких ошибок может предостеречь использование AT91F_AIC_ConfigureIt? Например, от забывания запретить прерывания в случаях, когда это необходимо, или от забывания сброса флага прерывания. Всякое бывает. Помоему, спор уже идет о вкусах, или спор ради спора. Неконструктивно.
--------------------
- Бендер, ты же робот, зачем тебе пить пиво? - Незачем! Я могу бросить в любой момент!
|
|
|
|
|
Aug 17 2008, 14:54
|

Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250

|
Цитата(zltigo @ Aug 17 2008, 18:01)  Ну в то, что сваять нечто вроде-бы работающее программистом не знающим почти ничего о железе - верю, а вот в "освоение" не верю совсем  Мрачное скопище исходников созданное для создания иллюзии простоты для менеджеров. Ну еще чего-нибудь чисто тестовое железячнику не вникающему ни в тонкости языка, ни в тонкости железа сваять и спихнуть работу. Удивляет безкомпромиссность и безаппеляционность мнений наших Гуру. Да я согласен, что lib_AT91 далека от идеала в плане эффективности и целесообразности использования ее функций, но в качестве наглядного примера по конфигурации каждого модуля, для новичка она все таки имеет некоторую полезность.
--------------------
- Бендер, ты же робот, зачем тебе пить пиво? - Незачем! Я могу бросить в любой момент!
|
|
|
|
|
Aug 17 2008, 15:00
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(injen-d @ Aug 17 2008, 18:31)  У меня, например, помню случались сомнения в правильности выбранной мной последовательности программирования регистров модуля при конфигурировании, и тут "подглядывание" в lib_AT91 помогало быстрее, что называется на примере, разобраться с проблемой. Как раз у AT91 периферию можно программировать практически в любой последовательности, не противоречащей здравому смыслу, в отличие от некоторых других процессоров. Цитата(injen-d @ Aug 17 2008, 18:31)  Например, от забывания запретить прерывания в случаях, когда это необходимо, или от забывания сброса флага прерывания. Всякое бывает. Сброс флага необходим в одном единственном и крайне редком случае. И лучше это знать и понимать, а не лепить всюду одно и то же для перестраховки. Даже начинающему. Цитата(injen-d @ Aug 17 2008, 18:31)  Помоему, спор уже идет о вкусах, или спор ради спора. Неконструктивно. Для меня это не спор ради спора, а попытка съэкономить себе время и нервы в дальнейшем. Цитата(SpiritDance @ Aug 17 2008, 18:45)  Мне схемотехник еще со старой работы сказал что код написанный с помощью этой библиотеки ему читать проще, чем код написанный в старом стиле по регистрам. Собственно для меняя код тоже более читаем - сразу понимаешь какое действие он производит. Так это еще и новый стиль, оказывается. Куда катится этот мир? Действие сразу понимаешь, когда видишь регистры и то, что в них пишется, а не однотипные ConfigureIt, EnableIt и т.п.
|
|
|
|
|
Aug 17 2008, 16:19
|

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

|
Цитата(aaarrr @ Aug 17 2008, 18:00)  Для меня это не спор ради спора, а попытка съэкономить себе время и нервы в дальнейшем. Не понимаю каким боком чужой стиль касается Вас?!  Стиль который Вы пропагандируете по своему хорош, (уверен многие присматриваются к вашим примерам и пытаются делать также), но не стоит его навязывать. Цитата Действие сразу понимаешь, когда видишь регистры и то, что в них пишется Не правда, если не знать/забыть названия регистров, то они мало что скажут.
|
|
|
|
|
Aug 17 2008, 16:30
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Aug 17 2008, 20:19)  Не понимаю каким боком чужой стиль касается Вас?!  Просто вижу часто и погружаюсь в депрессию  Цитата(defunct @ Aug 17 2008, 20:19)  Не правда, если не знать/забыть названия регистров, то они мало что скажут. Если не знать/забыть содержимое функции (что гораздо вероятнее), то её название скажет не больше. Напишу я, например: Код AT91F_PITInit(PIT, mck, 1000) И что, понятно, что оно делает?
|
|
|
|
|
Aug 17 2008, 17:22
|

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

|
Цитата(aaarrr @ Aug 17 2008, 19:30)  Если не знать/забыть содержимое функции (что гораздо вероятнее), Дык, исходники то есть, все в одном проекте. Забыли - всегда можно быстро подсмотреть. Имена функций тоже не от балды - сами говорят за себя. Цитата Напишу я, например: Код AT91F_PITInit(PIT, mck, 1000) И что, понятно, что оно делает? Импровизирую - инициализирует PIT. (навскидку не вникая в регистры с периодом 1000 тиков частоты mck). Если будет нужно точнее, подсмотрю в исходниках.
|
|
|
|
|
Aug 17 2008, 18:15
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Aug 17 2008, 21:22)  Ипровизирую - инициализирует PIT. (навскидку не вникая в регистры с периодом 1000 тиков частоты mck). Все так, за исключением ряда моментов  1. не 1000 тиков а 1000мкс. 2. частота задается в мегагерцах (вот удобно - где-то в Гц, а где-то в МГц). 3. функция содержит ошибку, так как реальный интервал таймера PIT равен не PIV, а PIV+1. 4. я сделал ошибку, переставив 1000 и mck местами. А в такой записи все как на ладони: Код #define PIT_HZ 1000
AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITEN | AT91C_PITC_PITIEN | ((mck + PIT_HZ * 8) / (PIT_HZ * 16) - 1); Клянусь, функцию специально я не выбирал, и ошибку с PIV заметил только что.
|
|
|
|
|
Aug 17 2008, 20:58
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(SpiritDance @ Aug 17 2008, 16:45)  Мне схемотехник еще со старой работы сказал что код написанный с помощью этой библиотеки ему читать проще, чем код написанный в старом стиле по регистрам. Ага, посмотрите, что я писал буквально об этом-же чуть выше. Только вот ведь беда если кто-то именуется у вас "схемотехником", то программированием он сколь-нибудь серьезно просто не владеет, а зачастую и не хочет. Цитата(injen-d @ Aug 17 2008, 16:54)  Удивляет безкомпромиссность и безаппеляционность мнений..... Дык я тоже назвал целых два случая полезности таких "библиотек". А вообще причин появления таких приблуд несколько: - Профессия программист стала массовой, но само слово уже не значит почти ничего; - Куча "программистов" программируют вызывая некие функции API, OS, "драйверов", "библиотек" добавляя от себя 2+2= - Производители хотят привлекать низкоквалифицированных программистов; - Используя таких "программистов" и подсаживая их на какие-то библиотеки, copy-paste, дикие (но человек ко всему привыкает) конструкции типа AT91C_BASE_PITC->PITC_PIMR производитель чипов привязывает их и к своим контроллерам. Многие довольны. Цитата(sergeeff @ Aug 17 2008, 19:25)  ...их использование или просто тестирование с использованием lib_xxx проще и быстрее. Про тестирование "схемотехником" согласен, а вот разумное использование возможностей железа крайне затруднено  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 07:47
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(sergeeff @ Aug 18 2008, 08:44)  Я считал, что "разумное использование возможностей железа" - это убедиться в том, что железо работает стабильно, быстро, без ошибок и решает твои задачи. Насколько я понимаю, Ваш бизнес изготовление демо бордов? Для быстрой, не вникая в подробности и нюансы железа, проверки, что в каких-то режимах железо в принципе работает? Против пригодности для этого не возражал ни разу.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 12:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(aaarrr @ Aug 18 2008, 13:54)  Еще один показательный пример для любителей lib_AT91  Нормальный компилятор не должен ругаться на число параметров > 4 (ISO/IEC 9899 : 5.2.4.1 Translation limits -> 127 parameters in one function definition). Ни в одной из имеющихся в моем архиве lib_xxx не обнаружил AT91C_BASE_AIC->AIC_IMR = 1 << AT91C_ID_PIOA; Очевидно, что в lib_xxx полно ошибок. А кто мешает их исправить и пользоваться дальше?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|