|
Пару вопросов по AT91SAM7S и IAR от начинающего, делаю лог анализатор, появились вопросы |
|
|
|
Jul 9 2007, 23:40
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
Решил вот перейти с AVR на ARM7 выбрал плату Olimex на AT91SAM7S256, писать решил под IAR так как под него есть примеры. Сейчас надо написать лог анализатор простейший, чтоб был и, заодно, чтоб научиться, появилось пару вопросов. Алгоритм анализатора простой, ждем изменения на входе, когда что-то происходит записуем значение входа и время по таймеру в память, потом передаём все по USB на компьютер. 1.Раньше я писал на ассемблере и алгоритм был такой ищу что мне надо в pdf, там же нахожу нужную мне команду и хороший пример, под С я так понимаю все по другому сначала думаешь, что тебе надо потом ищешь в библиотеке нужную функцию, я прав? вот например надо мне прочитать порты, нашел в библиотеке /*---------------------------------------------------------------------------- //* \fn AT91F_PIO_GetInput //* \brief Return PIO input value //*---------------------------------------------------------------------------- __inline unsigned int AT91F_PIO_GetInput( // \return PIO input AT91PS_PIO pPio) // \arg pointer to a PIO controller { return pPio->PIO_PDSR; } как я понял надо примерно так unsigned int a; a_in= AT91F_PIO_GetInput(AT91C_BASE_PIOA); Вопрос, теперь а_in будет значением порта, 32-битным числом? До этого я так понял надо порты включить и назначить на выход unsigned int b=0x00000000; // First, enable the clock of the PIOB AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ; //* to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only. AT91F_PIO_CfgInput( AT91C_BASE_PIOA, b ) ; 2. Тут все говорят про пример BasicUsb, как это ни странно но я нашел только AT91SAM7S-BasicUSART_USB, под IAR есть вроде только это(а там нет записи, только чтение), или я не прав? есть ещё пример под gcc at91sam7s64_basicusb_20060901_public там вроде с USB побольше, могу я из него брать куски кода или IAR не поймет? 3. Я не нашел в библиотеке функций отвечающих за таймер TC, мне надо установить частоту и читать значение самого таймера, и ещё есть ли у него функция обнуления, чтоб не боятся переполнения и каждый раз его самому обнулять. 4. Как вообще писать в память и читать из неё, под асм все понятно адреса и до конца(до последнего адреса), а как на С забить все память, какая мне нужна функция? Ещё после 8 бит на AVR тут, когда вроде можно и 8 и 16 и 32, не совсем все понятно, могу я прочитать только первые 16 бит порта и объединить их с 16-битным таймером в одно двойное слово 32-битное и записать так в память, или как это вообще происходит. 5.В примере для USB передаётся массив char data[MSG_SIZE]; а у меня вот в памяти будут значения портов и таймера, как мне их подсовывать в pCDC.Write(&pCDC, data, length); (взято из примера под gcc, я так понимаю сюда надо вставлять данные которые хочешь передать на компьютер.) 6.Я понял, что когда МК с соответствующей прогой подключается к компьютеру, ему(компьютеру) надо дать атмеловский драйвер, а какой прогой получаться сами данные и где взять эту программу? и в каком виду данные появятся на компьютере? Я понимаю, что мои вопросы дилетантские но все же очень хочется разобраться. Всем ответившим заранее СПАСИБО.
|
|
|
|
|
Jul 10 2007, 08:11
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Handler @ Jul 10 2007, 02:40)  под С я так понимаю все по другому сначала думаешь, что тебе надо потом ищешь в библиотеке нужную функцию, я прав? Конечно нет. Сначала читаете книгу Кернигана и Ритчи "Язык программирования С". Ее полно в интернете. В процессе чтения понимате, что язык состоит примерно из 30 ключевых слов. И все "Библиотечные функции" написаны с использованием именно этих слов. Использование приведенных вами функций - лишь один из возможных приемов, но не стоит себя ограничивать только этими функциями (я, например, их вообще не использую), ибо часто написание "в лоб" будет эффективнее. Цитата(Handler @ Jul 10 2007, 02:40)  как я понял надо примерно так Вопрос, теперь а_in будет значением порта, 32-битным числом? До этого я так понял надо порты включить и назначить на выход Да, да, да. Цитата(Handler @ Jul 10 2007, 02:40)  2. Тут все говорят про пример BasicUsb не знаю, не работал  Цитата(Handler @ Jul 10 2007, 02:40)  там вроде с USB побольше, могу я из него брать куски кода или IAR не поймет? Можете, поймет, но не все. Потребуется доработка напильником. Чаще всего очень небольшая. Или сравнительно большая, но в небольшом количестве мест. Цитата(Handler @ Jul 10 2007, 02:40)  3. Я не нашел в библиотеке функций отвечающих за таймер TC, мне надо установить частоту и читать значение самого таймера, и ещё есть ли у него функция обнуления, чтоб не боятся переполнения и каждый раз его самому обнулять. Вот один из минусов использования библиотеки: как только нет готовой функции - сразу же ступор. Функции этой библиотеки просто пишут и читают регистры, оформляя это в удобно проименованные "обертки". Напишите такие функции сами или работайте сразу с регистрами. Про переполнение - а чего его бояться? В процессе переполнения таймер обнулится и выдаст прерывание - можете считать количество переполнений. Существует режим таймера, когда период обнуления задается в одном из его регистров. Причем и переполение и аппаратное обнуление происходит всегда в строго определенные моменты времени. Сбрасывая таймер программно вы никогда не получите такой же точности. Цитата(Handler @ Jul 10 2007, 02:40)  4. Как вообще писать в память и читать из неё, под асм все понятно адреса и до конца(до последнего адреса), а как на С забить все память, какая мне нужна функция? На С в большинстве случаев вам вообще не нужно вспоминать, что существует такое понятие как "адрес". В С существуют переменные и указатели на эти переменныеЦитата(Handler @ Jul 10 2007, 02:40)  Ещё после 8 бит на AVR тут, когда вроде можно и 8 и 16 и 32, не совсем все понятно, могу я прочитать только первые 16 бит порта и объединить их с 16-битным таймером в одно двойное слово 32-битное и записать так в память, или как это вообще происходит. нет-да. Т.е. если порт представляет из себя 32(16, 8) разрядный регистр, то и читать обязательно нужно сразу все 32 (16, 8) бит. Компилятор сам знает (точнее, ему в заголовочном файле указано) какой регистр имеет какой размер и подставляет нужные значения. Дальше вы маскируете ненужные биты операциями "И" или сдвигом. А в памяти точно также может храниться 8, 16, 32, 64 - битное число, поэтому не совсем понятно зачем вам их объединять. но если хотите - маски и сдвиги к вашим услугам. На всякий случай несколько примеров: Код #include <stdint.h> #include <ioAT91SAM7X256.h> uint32_t a; struct { uint16_t Inputs; uint16_t Timer; } b;
void test() { a =(uint16_t)(AT91C_BASE_TCB->TCB_TC0.TC_CV << 16) | (AT91C_BASE_PIOA->PDSR & 0xFFFF); b.Timer = AT91C_BASE_TCB->TCB_TC0.TC_CV; b.Inputs = AT91C_BASE_PIOA->PDSR; } Цитата(Handler @ Jul 10 2007, 02:40)  а у меня вот в памяти будут значения портов и таймера, как мне их подсовывать в pCDC.Write(&pCDC, data, length); Керниган и Ритчи. Читать про структуры, массивы, указатели, приведение типов, указатель void *. Цитата(Handler @ Jul 10 2007, 02:40)  6.Я понял, что когда МК с соответствующей прогой подключается к компьютеру, ему(компьютеру) надо дать атмеловский драйвер, а какой прогой получаться сами данные и где взять эту программу? и в каком виду данные появятся на компьютере? Искать по форуму. Этот вопрос тут обсуждался много раз.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 10 2007, 18:40
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
Спасибо за ответ. Цитата На С в большинстве случаев вам вообще не нужно вспоминать, что существует такое понятие как "адрес". В С существуют переменные и указатели на эти переменные да это я понимаю, и Керниган Ричи читал правда года 4 назад, проблема в том что мне надо забить именно всю память, в асм я мог ограничить адрес а что сделать здесь? и ещё a =(uint16_t)(AT91C_BASE_TCB->TCB_TC0.TC_CV << 16) | (AT91C_BASE_PIOA->PDSR & 0xFFFF); вот это строчка, мы получаем значение таймера сдвигаем на 16, значение портов берем только первые 16, потом или, не совсем понятно зачем здесь (uint16_t), и как я понял выполнятся это строка будет весьма долго, тактов 20, это мне для лог анализатора неподходит. так что мне надо наверное что-то вроде массива указанных вами структур
Сообщение отредактировал Handler - Jul 10 2007, 18:43
|
|
|
|
|
Jul 11 2007, 13:46
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Handler @ Jul 10 2007, 21:40)  да это я понимаю, и Керниган Ричи читал правда года 4 назад Повторить никогда не помешает. Даже если бы вы ее прочитали только вчера, сегодня прочтя снова найдете много нового. Я книги читаю раза по 3-4. В первый пропускаю все непонятное, после третьего при необходимости легко нахожу нужную информацию. Цитата(Handler @ Jul 10 2007, 21:40)  проблема в том что мне надо забить именно всю память, Всю память не забъете - как минимум в ней еще должны разместиться стеки. Объявите "ну очень большой" массив и пишите в него. Если вам ну никак не обойтись без абсолютных адресов - воспользуйтесь моим советом из предыдущего сообщения, перечитайте Кернигана и Ритчи, хотя бы раздел про указатели. Но это тупиковый путь чреватый труднонаходимыми ошибками. Цитата(Handler @ Jul 10 2007, 21:40)  a =(uint16_t)(AT91C_BASE_TCB->TCB_TC0.TC_CV << 16) | (AT91C_BASE_PIOA->PDSR & 0xFFFF);вот это строчка, мы получаем значение таймера сдвигаем на 16, значение портов берем только первые 16, потом или, не совсем понятно зачем здесь (uint16_t), и как я понял выполнятся это строка будет весьма долго, тактов 20, это мне для лог анализатора неподходит. Здесь я ошибся, правильно будет a =(AT91C_BASE_TCB->TCB_TC0.TC_CV << 16) | (AT91C_BASE_PIOA->PDSR & 0xFFFF); и выполняться она будет быстро - в отличие от AVR ARM имеет аппаратный сдвигатель и сдвиг на 16 делает за такт. Попробуйте написать и так и эдак, посмотрите во что оно ассемблируется. Подумайте о том, что в варианте такой строчки мы имеем одну операцию записи в память, а в случае структуры - две. Но если оптимизатор компилятора достаточно умный - вы получите одинаковый код с одной операцией записи в обоих случаях. А с точки зрения наглядности программы (а значит и потенциальных ошибок) вариант со структурами предпочтительнее.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 11 2007, 19:43
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
uint32_t A[8000]; странно но мой компилятор(IAR) uint32_t не понимает Error[Pe020]: identifier "uint32_t" is undefined unsigned int - вот это в этом случаи будет тем же?
|
|
|
|
|
Jul 11 2007, 23:27
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
а пример BasicUSB все таки существует под IAR, если да киньте плиз ссылку
|
|
|
|
|
Jul 12 2007, 03:39
|
Участник

Группа: Свой
Сообщений: 45
Регистрация: 19-04-07
Пользователь №: 27 172

|
Цитата(Handler @ Jul 12 2007, 05:27)  а пример BasicUSB все таки существует под IAR, если да киньте плиз ссылку Он на DVD распространялся, основное вот здесь
src.zip ( 8.82 килобайт )
Кол-во скачиваний: 199
PC.zip ( 39.5 килобайт )
Кол-во скачиваний: 173
|
|
|
|
|
Jul 12 2007, 06:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Handler @ Jul 11 2007, 22:43)  странно но мой компилятор(IAR) uint32_t не понимает Error[Pe020]: identifier "uint32_t" is undefined А ведь я не зря в самом начале примера написал #include <stdint.h>.... Цитата(Handler @ Jul 11 2007, 22:43)  unsigned int - вот это в этом случаи будет тем же? Help->C/C++ Compiler->Compiler reference->Basic data types
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 12 2007, 12:48
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
Цитата(Calculator @ Jul 12 2007, 07:39)  Он на DVD распространялся, основное вот здесь
src.zip ( 8.82 килобайт )
Кол-во скачиваний: 199
PC.zip ( 39.5 килобайт )
Кол-во скачиваний: 173а где бы полный проект найти, я просто на его основе все сделать хочу. Всем огромное спасибо за ответы, наконец-то появляется какая-то ясность.
|
|
|
|
|
Jul 12 2007, 23:10
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
По умолчанию в регистрах те значения что стоят а в pdf по АТ91 первыми, как мне например узнать частоту таймера и ядра по умолчанию.
|
|
|
|
|
Jul 13 2007, 19:10
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
Цитата(Сергей Борщ @ Jul 13 2007, 10:30)  Вот эти значения и показывают, что по умолчанию таймер стоит, а ядро тактируется от SLCLK. SLCLK равна 32768 Гц плюс-минус лапоть, точнее лапоть можно уточнить в даташите. Извеняюсь это был вопрос, надо так: По умолчанию в регистрах те значения, что стоят а в pdf по АТ91 первыми? И все таки где взять полные проект BasicUSB, госпада у кого есть скиньте на мыло (olyfan(бобик)mail.ru) или выложите куда-нить, буду очень благодарен.
|
|
|
|
|
Jul 13 2007, 21:16
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
Странно но у меня пропадает возможность править предыдущие посты, это нормально? Пример я таки нашел, на ftp://efo.ru теперь вопрос какие файлы надо поменять в проекте, при переходе с S64 на S256,как это прощё сделать имея AT91SAM7S256-BasicTools-IAR4_30A-1_21 AT91SAM7S64-BasicUSB-IAR4_30A-1_2 надо понятно USB под S256
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|