|
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
|
|
|
|
|
 |
Ответов
(45 - 59)
|
Aug 18 2008, 21:52
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Aug 19 2008, 01:05)  Человек ко всему привыкает, но я себя любимого люблю больше, посему так не пишу  Простая тренировка пальцев  Согласитесь, что при написании драйвера периферийного устройства время набора буковок составляет очень небольшой процент. Цитата(defunct @ Aug 19 2008, 01:07)  в этой теме все крутится вокруг lib_AT91 - которую некоторые рекомендуют выбросить и забыть как книжку Редькина  Настоятельно и, по-моему, обоснованно рекомендую. Цитата(defunct @ Aug 19 2008, 01:07)  и вокруг "->" (тут уже imho безосновательно). Как я уже писал, против структур периферии я ничего не имею, тем более что есть возможность маневра. У Atmel'а еще не самый худший вариант, если вспомнить, например, TI C28xx
|
|
|
|
|
Aug 18 2008, 21:57
|

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

|
Цитата(defunct @ Aug 18 2008, 23:36)  Драсти, а чем тогда я пользуюсь? ;> Вы пользуетесь макросами типа #define pNAME *(struct *)0xXXXXXXX Это не указатель и, как уже писал, данное Вами имя в венгерском стиле pointerNAME - ошибочно. Цитата(defunct @ Aug 18 2008, 23:50)  ...не отбрасывать как ересь все подряд и потом с Божьей помощью и с помощью ДШ писать с чистого листа. Зачем с чистого  берется исходный и ересь выжигается каленым железом  . Причем это проделыватся не за раз а по мере необходимости и сопровождается чтением документации и комментированием нюансов, которое, как привило в хидерах практически отсутсттвует. Цитата(aaarrr @ Aug 18 2008, 23:52)  Простая тренировка пальцев  Согласитесь, что при написании драйвера периферийного устройства время набора буковок составляет очень небольшой процент. С набором проблем никаких (и ручками и автодополнеием по тэгам)- проблемы c последующем чтением. Ошибки я предпочитаю искать глазами и головой а не долгими брождениями в отладчике и перечитываю написанное много.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 21:58
|

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

|
Цитата(zltigo @ Aug 19 2008, 00:54)  Вы пользуетесь макросами типа #define NAME *(struct *)0xXXXXXXX Это не указатель. Нет Вы не правы. Макросы вот такие: ((AT91PS_EMAC) 0xFFFDC000) эквивалентно: ((Struct *) 0xFFFDC000) т.е. это честные указатели на группы регистров. Цитата Настоятельно и, по-моему, обоснованно рекомендую. Если Вы про Редькина, то я согласен.
|
|
|
|
|
Aug 18 2008, 22:02
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Aug 19 2008, 01:58)  Если Вы про Редькина, то я согласен. Нет, как не трудно догадаться, не про Редькина. Хотя его книжкам самое место в печке. Цитата(zltigo @ Aug 19 2008, 01:57)  Ошибки я предпочитаю искать глазами и головой а не долгими брождениями в отладчике и перечитываю написанное много. Я тоже. Мозг требуху типа AT91S_ фильтрует достаточно легко.
|
|
|
|
|
Aug 18 2008, 22:16
|

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

|
Цитата(zltigo @ Aug 19 2008, 01:10)  pNAME = x присваивает значение УКАЗАТЕЛЮ а не обьекту  . Посему вычитывайте макросы дальше до прояснения написанного в них. это константный указатель. pBASE_NAME = x - не имеет смысла вообще. #define X (U32 *)(0xFFFF0000) X = x; <- не имеет смысла *X = x; пишем x по адресу 0xFFFF0000. typedef struct tagMYSTRUCT { U32 x, y; } *PMYSTRUCT; #define X ((PMYSTRUCT) 0xFFFF0000) X - структура из элементов x, y по адресу 0xFFFF0000 X = z; - не имеет смысла. X->x = z; пишем z по адресу 0xFFFF0000 X->y = z; пишем z по адресу 0xFFFF0000 + 4
|
|
|
|
|
Aug 18 2008, 22:28
|

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

|
Цитата(defunct @ Aug 19 2008, 00:16)  это константный указатель. Может стоит освежить знания языка? А то, право, как-то странно общаться  . Константный, не константный дело второе. Цитата pBASE_NAME = x - не имеет смысла вообще. Ага, но именно ТАК Вы пишите и работает по той причине, что это на самом деле НЕ указатель (мамнадчатый раз уже пишу) хотя перед ним и у Вас ОШИБОЧНО стоит 'p' а выражение эквивалентное: *pBASE_NAME = x; Цитата(defunct @ Aug 19 2008, 00:16)  это константный указатель. Может стоит освежить знания языка? А то, право, как-то странно общаться  . Константный, не константный дело второе. Цитата pBASE_NAME = x - не имеет смысла вообще. Ага, но именно ТАК Вы пишите и работает по той причине, что это на самом деле НЕ указатель (мамнадчатый раз уже пишу) хотя перед ним у Вас и стоит 'p'. Это, простите, Ваш "стиль" и Ваш код с котрого все началось: Цитата(defunct @ Aug 18 2008, 22:40)  pPITC->PITC_PIMR = x; Так какому из Вас теперь верить  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 22:40
|

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

|
Цитата(aaarrr @ Aug 19 2008, 01:15)  Какой толк в таком "образовании"? Сами же писали, что можно использовать PDC_ReceiveFrame и забить на чтение документации. Забить? я прямо так и сказал? Не может быть. Вот мои слова: Цитата По ней сразу видно как надо работать с DMA даже без вникания в ДШ. Прочитать то ДШ надо, но если не пользовать библиотеку, то его еще надо понять/вникнуть в тонкости, а функция - дает понимание того как должно быть, сразу после поверхностного ознакомления с ДШ. Цитата Я тоже привел обоснованный пример где функция из lib_ содержит 2 ошибки. Честно сказать, я не нашел функций на которые Вы ссылались в моей библиотеке, поэтому не могу ни подтвердить, ни опровергнуть. //* Generated : AT91 SW Application Group 09/12/2005 (15:39:14) Цитата(zltigo @ Aug 19 2008, 01:28)  Может стоит освежить знания языка? А то, право, как-то странно общаться  . ок давайте освежим это что: (int *)(0xFFFF0000) Цитата Ага, но именно ТАК Вы пишите и работает по той причине, что это на самом деле НЕ указатель (мамнадчатый раз уже пишу) хотя перед ним и у Вас ОШИБОЧНО стоит 'p' а выражение эквивалентное: *pBASE_NAME = x; 'p' там правильно стоит. Выражение эквивалентное *pBASE_NAME = x; - запись ПО адресу pBASE_BAME. Цитата Цитата pBASE_NAME = x - не имеет смысла вообще. Ага, но именно ТАК Вы пишите и работает по той причине, что это на самом деле НЕ указатель (мамнадчатый раз уже пишу) хотя перед ним и стоит 'p'. Это, простите, Ваш "стиль" и Ваш код: Код pPITC->PITC_PIMR = x; Как так? pPITC->PITC_PIMR = x; != pPITC = x; pPITC->PITC_PIMR = x; == *((U32 *)pPITC + PIMR_OFFSET) = x;
|
|
|
|
|
Aug 18 2008, 22:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Aug 19 2008, 02:29)  Вот мои слова: А это, интересно, чьи: Цитата Можно ничего не читая про DMA правильно с ним работать! Цитата(defunct @ Aug 19 2008, 02:29)  Честно сказать, я не нашел функций на которые Вы ссылались в моей библиотеке, поэтому не могу ни подтвердить, ни опровергнуть. //* Generated : AT91 SW Application Group 09/12/2005 (15:39:14) Google по этой строчке находит at91sam7x256.h. Неужели в одну секунду lib_ и .h сделали?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|