|
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
|
|
|
|
|
 |
Ответов
(60 - 74)
|
Aug 18 2008, 22:50
|

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

|
Цитата(aaarrr @ Aug 19 2008, 01:40)  А это, интересно, чьи: Цитата Можно ничего не читая про DMA правильно с ним работать! Фраза, выдранная из контекста меняет смысл полностью. Я не давал рекомендаций забивать на документацию нигде. В оригинале было: Цитата Там алгоритм загрузки указателей DMA. Можно ничего не читая про DMA правильно с ним работать! В этом и прелесть. Упор был на то, что достаточно сложный модуль можно использовать без елозиния по ДШ часами. Цитата Google по этой строчке находит at91sam7x256.h. Неужели в одну секунду lib_ и .h сделали? Я так понимаю это дата всего пакета. //* File Name : lib_AT91SAM7X256.h //* Object : AT91SAM7X256 inlined functions //* Generated : AT91 SW Application Group 09/12/2005 (15:39:14)
|
|
|
|
|
Aug 18 2008, 23:03
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Aug 19 2008, 02:50)  Фраза выдранная из контекста менят смысл полностью. Я не давал рекомендаций забивать на документацию нигде. В оригинале было: Цитата Там алгоритм загрузки указателей DMA. Можно ничего не читая про DMA правильно с ним работать! В этом и прелесть.
Контекст здесь только уточняет, что можно пользоваться алгоритмом не читая документацию. Смысл не меняется. Цитата(defunct @ Aug 19 2008, 02:50)  Упор был на то, что достаточно сложный модуль можно использовать без елозиния по ДШ часами. PDC сам по себе простой, как грабли - полное описание занимает 2 страницы. Цитата(defunct @ Aug 19 2008, 02:50)  Я так понимаю это дата всего пакета. ОК. И что, в ней нет функции AT91F_PITInit? У меня: Код //* File Name : lib_AT91SAM7X256.h //* Object : AT91SAM7X256 inlined functions //* Generated : AT91 SW Application Group 08/18/2006 (15:29:55) ... //* CVS Reference : /lib_pitc_6079A.h/1.2/Thu Nov 4 14:01:11 2004//
|
|
|
|
|
Aug 18 2008, 23:19
|

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

|
Цитата(aaarrr @ Aug 19 2008, 02:03)  ОК. И что, в ней нет функции AT91F_PITInit? нет  Цитата Контекст здесь только уточняет, что можно пользоваться алгоритмом не читая документацию. Смысл не меняется. Да, алгоритмом пользоваться можно. Смысл меняется кардинально. Документация создается для описания устройства и алгоритмов работы с ним, а в ReceiveFrame мы имеем описание алгоритма 10-ю строчками. Чем в таком случае lib_ не удовлетворяет понятию документация? Цитата PDC сам по себе простой, как грабли - полное описание занимает 2 страницы. Простой, но тем не менее многие делают типичную ошибку - загружают только 1 указатель.
|
|
|
|
|
Aug 18 2008, 23:32
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Aug 19 2008, 03:19)  нет  Странно, в более ранней есть. Код //* Generated : AT91 SW Application Group 05/20/2005 (16:22:29) Цитата(defunct @ Aug 19 2008, 03:19)  Да, алгоритмом пользоваться можно. Смысл меняется кардинально. Документация создается для описания устройства и алгоритмов работы с ним, а в ReceiveFrame мы имеем описание алгоритма 10-ю строчками. Чем в таком случае lib_ не удовлетворяет понятию документация? В ReceiveFrame мы не имеем никакого описания, даже brief скопипасчен и не исправлен: Код //*---------------------------------------------------------------------------- //* \fn AT91F_PDC_ReceiveFrame //* \brief Close PDC: disable TX and RX reset transfer descriptors //*---------------------------------------------------------------------------- Цитата(defunct @ Aug 19 2008, 03:19)  Простой, но тем не менее многие делаю типичную ошибку - загружают только 1 указатель. Это не ошибка. Если я, например, хочу передать 1 пакет через UART, то второй указатель мне и не нужен. А в блаженные времена AT91M40800 второго и не было.
|
|
|
|
|
Aug 18 2008, 23:57
|

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

|
Цитата(aaarrr @ Aug 19 2008, 02:32)  Странно, в более ранней есть. //* Generated : AT91 SW Application Group 05/20/2005 (16:22:29) Перепроверю завтра. Цитата В ReceiveFrame мы не имеем никакого описания, даже brief скопипасчен и не исправлен: Там самодокументируемый код описание прямо в нем (см. имена функций и переменных): Код if (AT91F_PDC_IsRxEmpty(pPDC)) { //* Buffer and next buffer can be initialized AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); return 2; } else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { //* Only one buffer can be initialized AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); return 1; } else { //* All buffer are in use... return 0; } Цитата Это не ошибка. Если я, например, хочу передать 1 пакет через UART, то второй указатель мне и не нужен.
А в блаженные времена AT91M40800 второго и не было. Дык, мы ж о ReceiveFrame говорим  Приход данных от нас не зависит. Времена поменялись, народ забывает использовать NextBuf даже при непрерывном чтении.
|
|
|
|
|
Aug 19 2008, 06:40
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Цитата(sergeeff @ Aug 19 2008, 12:52)  Полезно ли embedded разработчику наличие lib_xxx или вы считаете, чтобы лучше ее и не было? Сами Atmel'цы от нее, похоже, отказались. В последних AT91 Software Package и at91xxx_getting_started нет lib_xxx, но есть at91lib, на которую от наших Гуру, насколько можно представить, будет/есть не меньше нареканий  А что поделаешь?! Индийским студентам тоже надо кушать
|
|
|
|
|
Aug 19 2008, 08:36
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(asket @ Aug 19 2008, 11:53)  Работаю в Crossworks, хотелось бы поработать с lib_1t91sam7xxx.h И работали бы спокойно дальше. Мне интересно, что для Вас изменится с использованием этой "библиотеки"? Какие плюсы Вы видите? Цитата(asket @ Aug 19 2008, 11:53)  при объявлении сия заголовочного файла в нескольких исходниках на си компилер ругается, ссылаясь на Multiple definition of, как этим бороться? Пробывал объявить extern, та же фигня..( Заранее благодарен! Хидер защищен, проблем с multiple definition быть не должно. Куда Вы пытались прикрутить extern???
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|