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

|
Цитата(sergeeff @ Aug 18 2008, 16:13)  Нормальный компилятор не должен ругаться на число параметров > 4 (ISO/IEC 9899 : 5.2.4.1 Translation limits -> 127 parameters in one function definition). Это Вы к чему? Здесь описано только ограничение на количество параметров. 6.5.2.2: Цитата If the expression that denotes the called function has a type that includes a prototype, the number of arguments shall agree with the number of parameters. Each argument shall have a type such that its value may be assigned to an object with the unqualified version of the type of its corresponding parameter. 6.10.3: Цитата If the identifier-list in the macro definition does not end with an ellipsis, the number of arguments (including those arguments consisting of no preprocessing tokens) in an invocation of a function-like macro shall equal the number of parameters in the macro definition. Otherwise, there shall be more arguments in the invocation than there are parameters in the macro definition (excluding the ...). There shall exist a ) preprocessing token that terminates the invocation. Цитата(sergeeff @ Aug 18 2008, 16:13)  Ни в одной из имеющихся в моем архиве lib_xxx не обнаружил AT91C_BASE_AIC->AIC_IMR = 1 << AT91C_ID_PIOA; Это не из lib_. Цитата(sergeeff @ Aug 18 2008, 16:13)  Очевидно, что в lib_xxx полно ошибок. А кто мешает их исправить и пользоваться дальше? Это, как бы так помягче выразиться, мартышкин труд, Вы не находите? Опять таки, выясняется, что есть разные версии этих библиотек. Тихий ужас. Цитата(SergeiCh @ Aug 18 2008, 16:19)  По мне структуры хороши хотя бы тем, что при отладке в Eclipse/Insight позволяют очень удобно смотреть содержимое регистров. Лучшего способа, чем добавить такую "сущность"  в watch, я просто не знаю. Против структур я ничего не имею, если забыть про дурацкие названия с префиксом "AT91S_".
|
|
|
|
|
Aug 18 2008, 12:36
|

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

|
Причем о качестве написания библиотек тоже можно поговорить. Специально не искал, но вот прям сейчас попался на глаза кусок написанный для совсем дугого контроллера (LPC), но тоже с "библиотекой" от NXP/Keil Это инициализация контроллера прерываний: Код /****************************************************************************** ** Function name: install_irq ** ** Descriptions: Install interrupt handler ** parameters: Interrupt number, interrupt handler address, ** interrupt priority ** Returned value: true or false, return false if IntNum is out of range ** ******************************************************************************/ DWORD install_irq( DWORD IntNumber, void *HandlerAddr, DWORD Priority ) { DWORD *vect_addr; DWORD *vect_prio; VICIntEnClr = 1 << IntNumber; /* Disable Interrupt */ if ( IntNumber >= VIC_SIZE ) { return ( FALSE ); } else { /* find first un-assigned VIC address for the handler */ vect_addr = (DWORD *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + IntNumber*4); vect_prio = (DWORD *)(VIC_BASE_ADDR + VECT_PRIO_INDEX + IntNumber*4); *vect_addr = (DWORD)HandlerAddr; /* set interrupt vector */ *vect_prio = Priority; VICIntEnable = 1 << IntNumber; /* Enable Interrupt */ return( TRUE ); } } Муть голубая, промежуточные переменные, пару совершенно лишних сущностей ввиде констант VIC_BASE_ADDR, VECT_ADDR_INDEX, *4, неверный комментарий "find..", отсутствие явного назначения IRQ. Ну и чего можно постичь читая такой совместный труд двух нехилых фирм NXP и Keil (на самом деле какой-то "индийский" студент писал)? По функционалу тоже вопросы - а разрешение прерываний (последняя строчка)сразу это всегда и всем надо? А прерывания по фронту никому не нужны? Что-то похожее на образец и отражающее суть железа: Код int install_irq( int IntNumber, void *HandlerAddr, int Priority ) { VICIntEnClr = 1 << IntNumber; /* Disable Interrupt */ if ( IntNumber >= VIC_SIZE ) { return ( FALSE ); } else { VICIntSelect &= (~(1<<IntNumber)); // Добавлено - Classifies as IRQ *(ulong *)(&VICVectAddr0 + IntNumber) = (ulong)HandlerAddr; /* set interrupt vector */ *(ulong *)(&VICVectPriority0 + IntNumber) = Priority; VICIntEnable = 1 << IntNumber; /* Enable Interrupt */ return( TRUE ); } } Хотя какого черта эта функция нужна в таком виде не понятно, ибо все сводится при начальнй инициализации к двум/трем простым и совершенно понятным (в отличии от выше приведенной ) после беглого взгляда на datasheet строчкам: Код VICVectAddrX = (ulong)HandlerAddr; VICVectPriorityX = Priority; P.S. Я совершенно не являюсь безусловным противником подобного подхода, например у меня есть подобная функция - она для меня скрывает нюансы реализации контроллеров прерываний LPC21xx и LPC23xx.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 12:44
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(zltigo @ Aug 18 2008, 18:36)  Что-то похожее на образец и отражающее суть железа: Код int install_irq( int IntNumber, void *HandlerAddr, int Priority ) { VICIntEnClr = 1 << IntNumber; /* Disable Interrupt */ if ( IntNumber >= VIC_SIZE ) { return ( FALSE ); } else ... Я бы ещё строчку Код VICIntEnClr = 1 << IntNumber; /* Disable Interrupt */ перенёс после else
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 18 2008, 12:48
|

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

|
Цитата(SergeiCh @ Aug 18 2008, 14:19)  По мне структуры хороши хотя бы тем, что при отладке в Eclipse/Insight позволяют очень удобно смотреть содержимое регистров. А смотрю на текст много, много, много больше нежели на окошки "watch", а на регистры вообще не смотрю, ибо некоторые из них вооще-то не расчитаны на "посмотреть" без побочных последствий. Цитата(AHTOXA @ Aug 18 2008, 14:44)  Я бы ещё строчку Код VICIntEnClr = 1 << IntNumber; /* Disable Interrupt */ перенёс после elseДа, пропустил  - тоже прикол - сначала лупим по регистру, а потом смотрим а параметр допустим был? В догонку - а приоритет на допустимость контролировать не будем  , хотя номер будем. В общем славная такая "библиотека" для запудривания мозгов.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 13:57
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Цитата(zltigo @ Aug 18 2008, 19:48)  А смотрю на текст много, много, много больше нежели на окошки "watch Аналогично  Но мне структуры в этом не помеха, и даже наоборот. По правде говоря, регистры активно смотрел только когда осваивал новый микроконтроллер. Было наглядно, почти как в AVR Studio. Не вижу принципиальных причин, за исключением особых случаев, чтобы не посмотреть значения регистров, если периферия ведет себя как-то не так. Иногда это позволяет найти ошибку посмотрев текст уже не так много, много раз
|
|
|
|
|
Aug 18 2008, 14:25
|

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

|
Цитата(aaarrr @ Aug 18 2008, 16:21)  после простой доработки хидера напильником, и "PITC_PIMR = x". Вот доработанные до нормального состояния и пользую. Тоже  для LPC/IAR "дорабатываю" алиасы битов... Цитата Использовать аббревиатуры было не лучшей идеей Атмела, но тут уже ничего не исправить. Почему? Отредактировали-же  . А идея проста - выдрессировать и привить дурную (вроде курения) привычку пользоваться их ARM продукцией
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 20:40
|

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

|
Цитата(aaarrr @ Aug 18 2008, 17:21)  Ну, не обязательно писать "AT91C_BASE_PITC->PITC_PIMR = x", можно и "*AT91C_PITC_PIMR = x", а можно, после простой доработки хидера напильником, и "PITC_PIMR = x". Не обязательно. Это дело вкуса. Мне удобней так: hal.h: #define pPITC AT91C_BASE_PITC #define pPIOA AT91C_BASE_PIOA #define pEMAC AT91C_BASE_EMAC #define pTimer1 AT91C_BASE_TC1 .... #include "hal.h" pPITC->any_reg = x А в записях вида: Цитата PITC_PIMR = x". преднамерено делается разгруппировка уже сгруппированных по смысловой нагрузке (по периферийным блокам) регистров. Смысла - 0, разве только понизить гибкость модификации кода, за счет мифической наглядности. "Мифической" потому что вы так и не сказали чем отличается наглядность между PITC_PIMR = x и pPITC->PITC_PIMR = x Цитата Использовать аббревиатуры было не лучшей идеей Атмела, но тут уже ничего не исправить. Зато сгруппировать блоки в структуры - очень правильная идея. Цитата Зато в тексте явная помеха рассматривать дикие длиннющие названия пытаясь вычленить из них не очень-то и сами посебе благочитаемые аббревиатуры - в глазах рябит. А от коротких регистров не рябит? EKLMN = x; EPRST = y; Как по мне - пусть название будет длинным, но в нем будет сказано все для понимания этой строчки через год, два, десять лет. Цитата(zltigo @ Aug 18 2008, 15:48)  А смотрю на текст много, много, много больше нежели на окошки "watch", а на регистры вообще не смотрю, ибо некоторые из них вооще-то не расчитаны на "посмотреть" без побочных последствий. Речь даже не о watch. Любой нормальный редактор умеет открывать структуры - и показывает их нутро в параллельном окошке типа object explorer etc. Так имея указатель на структуру регистров того же VIC'a, вы автоматом (смотря текст, а не watch) увидите какие еще регистры относятся VIC'у, без лазиния по ДШ и без, лишний раз, заглядывания в хидеры. Ниже наглядный пример того о чем я говорю (скриншот ~200kb)
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 18 2008, 20:55
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Aug 19 2008, 00:27)  Не обязательно. Это дело вкуса. Мне удобней так: hal.h: #define pPITC AT91C_BASE_PITC .... #include "hal.h" pPITC->any_reg = x А в записях вида: Цитата PITC_PIMR = x". преднамерено делается разгруппировка уже сгруппированных по смысловой нагрузке (по периферийным блокам) регистров. Смысла - 0, разве только понизить гибкость модификации кода, за счет мифической наглядности. Смысла фразы про группировку не понял абсолютно - какая разница, обращаюсь я к переменной напрямую, или в составе структуры через указатель? Чем плох первый вариант, поясните. Замена одной строки на другую дефайном никак гибкости модификации не добавляет. Тогда уж лучше пишите, как в lib_AT91: Код int init_pitc(AT91PS_PITC pitc, ...) { pitc->PIMR = x; } Это будет гибким решением, достаточно будет поменять аргумент при вызове. Цитата(defunct @ Aug 19 2008, 00:27)  "Мифической" потому что вы так и не сказали чем отличается наглядность между PITC_PIMR = x и pPITC->PITC_PIMR = x А где это я говорил про наглядность? Хотя влияет, конечно. Сравните PITC_PIMR = x и AT91->SAM7X->BASE_PITC->PITC_PIMR = x Кстати, я сам пишу "AT91C_BASE_PITC->PITC_PIMR = x". И меня это уже давно не утомляет. Цитата(defunct @ Aug 19 2008, 00:27)  Как по мне - пусть название будет длинным, но в нем будет сказано все для понимания этой строчки через год, два, десять лет. Длиннее не значит понятнее: 50% людей не знают точно, как расшифровывается PIO_PDR - Peripheral Disable Register или PIO Disable Register. Очень распространенная ошибка. Цитата(defunct @ Aug 19 2008, 00:40)  Так имея указатель на структуру регистров того же VIC'a, вы автоматом (смотря текст, а не watch) увидите какие еще регистры относятся VIC'у, без лазиния по ДШ и без, лишний раз, заглядывания в хидеры. Если Вы не помните, какие еще регистры относятся к VIC (что предполагает, что Вы добавляете какую-то функциональность), то прямой это повод обратиться к ДШ.
|
|
|
|
|
Aug 18 2008, 21:05
|

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

|
Цитата(defunct @ Aug 18 2008, 22:40)  Не обязательно. Это дело вкуса. Мне удобней так: Вы находитесь на правильном пути, раз AT91C_BASE_PITC Вам не удобны  Цитата преднамерено делается разгруппировка уже сгруппированных по смысловой нагрузке Смысловая группировка совершенно абстрактна и ничего дополнительного не несет совершенно, ну к чему повторения в Вашем варианте "pPITC->PITC_PIMR" аббревиатуры PITC дважды? Чем это масло-маслянное облегчит "понимания этой строчки через год, два, десять лет"? К чему бессмысленное и ошибочное (ибо это не указатель и любой нормальный человек увидев указатель напишет *pPITC->PITC_PIMR = x) в "венгерском" стиле добавление 'p'? Цитата "Мифической" потому что вы так и не сказали чем отличается наглядность между PITC_PIMR = x и pPITC->PITC_PIMR = x Однако, я про наглядность не говорил, я говорил и говорю про неудобочитаемость. Цитата Зато сгруппировать блоки в структуры - очень правильная идея. Вы как-то это повторяете и повторяете...,как мантру. Себя пытаетесь убедить? Цитата А от коротких регистров не рябит? Меньше. Цитата Любой нормальный редактор умеет открывать структуры - и показывает их нутро в параллельном окошке типа object explorer etc. Любой нормальный редактор покажет и нормально написанный хидер по тэгу - никаких проблем. Цитата(aaarrr @ Aug 18 2008, 22:55)  Кстати, я сам пишу "AT91C_BASE_PITC->PITC_PIMR = x". И меня это уже давно не утомляет. Человек ко всему привыкает, но я себя любимого люблю больше, посему так не пишу
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 21:07
|

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

|
zltigo и aaarrrЯ там выше прикрепил рисунок. Собсно о чем я говорю. Когда я навожусь на имя регстра после "->" мне открывается стркуктура (в данном случае emac), где все регистры с коментариями как на ладони. Цитата Смысловая группировка совершенно абстрактна и ничего дополнительного не несет совершенно, ну к чему повторения в Вашем варианте "pPITC->PITC_PIMR" аббревиатуры PITC дважды? Чем это масло-маслянное облегчит "понимания этой строчки через год, два, десять лет"? По крайней мере я сразу смогу окинуть взглядом все регистры этого PITC. Более наглядный пример - канал DMA (которых больше десятка и все они имеют одинаковые регистры), здесь так и просится работа с указателем на DMA канал. Тоже самое с таймерами которых 3, с уартами и т.д. Цитата Вы как-то это повторяете и повторяете...,как мантру. Себя пытаетесь убедить? Ну раз уж со стороны уже так кажется, то пора завязывать. Цитата Однако, я про наглядность не говорил, я говорил и говорю про неудобочитаемость. в этой теме все крутится вокруг lib_AT91 - которую некоторые рекомендуют выбросить и забыть как книжку Редькина и вокруг "->" (тут уже imho безосновательно). Я уже наверное 10 раз повторился, что это дело вкуса применять их или не применять и нет единственно правильного стиля. Atmel'цов тоже понять можно. Не могут они обозвать свои типы PTIMER / PPDC/ PEMAC и т.п., т.к. вполне резонно предположить, что разработчик использующий ихнее добро сам захочет использовать такие имена в своем проекте. Вот и накрутили они эти AT91C / S / PS.
|
|
|
|
|
Aug 18 2008, 21:30
|

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

|
Цитата zltigo и aaarrr Я там выше прикрепил рисунок. Да понял я, понял. Это не секрет . Рисунков прикреплять не буду, но при запросе по имени тэга под курсором я получаю все нужное и естественно тоже с комментариями, поскольку в хидере у меня все тоже сгруппировано и откомментированно. Причем это механизм универсальный и работает при описании собственных битов для, например, чего либо подобного GPIO и с алиасами. P.S. Извините, я случайтно удалил из Вашего поста несколько уточняющих строк  Цитата(defunct @ Aug 18 2008, 23:07)  Более наглядный пример - канал DMA (которых больше десятка и все они имеют одинаковые регистры), здесь так и просится работа с указателем на DMA канал. Просится не просится, но Вы, простите, пользуетесь НЕ указателями  . Посему никакого удобства не имеется. Если мне потребуется я спокойно получу и передам указатель, то-же самое придется сделать и Вам с Вашей записью  На предложение ради этого всегда писать в стиле *pAT91C_BASE_PITC->PITC_PIMR = x я даже отвечать не буду.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2008, 21:36
|

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

|
Цитата(zltigo @ Aug 19 2008, 00:30)  Просится не просится, но Вы, простите, пользуетесь НЕ указателями  . Посему никакого удобства не имеется. Если мне потребуется я спокойно получу и передам указатель, то-же самое придется сделать и Вам с Вашей записью  Драсти, а чем тогда я пользуюсь? ;> То чем я пользуюсь (то чем нас Atmel порадовал) AT91C_BASE_XXX - константные указатели на структры регистров периферийных модулей XXX. Цитата *pAT91C_BASE_PITC->PITC_PIMR это уже через чур, и согласен, даже не подлежит обсуждению, из-за неэффективного использования памяти.
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|