Перейти к содержанию
    

Здравствуйте.

 

Получил плату от Olimex с SAM7X256. Спаял wiggler. Установил IAR 4.41a и Keil. Так как примеры у атмела и Olimex для IAR начал разбираться с ним. Запустил пример олимекса, более менее разобрался, поудалял все, в главном цикле сделал вывод миандра на pb22. Вроде работало, виглер шил через H-JTAG, правда из RAM отладка не работала, работала только через FLASH. Никаких стартапов в пректе я не нашел. Базовый пример от Atmela я прошивать не стал, так как он инициализирует линии, которые на плате от олимекса используются для разных других целей.

 

Так вот, проблемы начались, когда я попытался создать совершенно пустой проект, откомпилировать и запустить в устройство (на С под железо раньше не писал). В связи с этим следующие вопросы:

 

1. Откуда запускается проект, с функции Main или откуда то еще?

2. Что за файлы .xcl (я понял, что это структура памяти для линковщика), как ими пользоваться, откуда брать и т.д.

3. Что за файлы mac для дебагера и можно ли без них (когда отключал, отладка не работала).

4. Если не сложно, то как по шагам сделать минимальный проект для отладки в RAM (как создать, какие файлы подключать, откуда брать, что прописать в настройках).

 

Вот листинг моей программы. Этот код вроде работает в проекте от Olimex, перенести его в свой пустой у меня не получилось.

 

#include "at91sam7xc256.h"


//it's a simple delay
void Delay (unsigned long a) { while (--a!=0); }


int main()
{
   //Enable RESET
  AT91C_BASE_RSTC->RSTC_RCR = 0xA5000008;
  AT91C_BASE_RSTC->RSTC_RMR = 0xA5000001;
  Delay(1000);
  
  
  // Set Flash Waite sate - Flash Memory Controler
  // if MCK = 47923200 I have 50 Cycle for 1 usecond
  AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(48 <<16)) | AT91C_MC_FWS_1FWS;

  // Watchdog Disable
  AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;

  // Set MCK at 47 923 200
  // 1 Enabling the Main Oscillator:
  // SCK = 1/32768 = 30.51 uSecond
  // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
  AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));

  // Wait the startup time
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

  // 2 Checking the Main Oscillator Frequency (Optional)
  // 3 Setting PLL and divider:
  // - div by 5 Fin = 3,6864 =(18,432 / 5)
  // - Mul 25+1: Fout =    95,8464 =(3,6864 *26)
  // for 96 MHz the erroe is 0.16%
  // Field out NOT USED = 0
  // PLLCOUNT pll startup time estimate at : 0.844 ms
  // PLLCOUNT 28 = 0.000844 /(1/32768)
  AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));

  // Wait the startup time
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

  // 4. Selection of Master Clock and Processor Clock
  // select the PLL clock divided by 2
  AT91C_BASE_PMC->PMC_MCKR =  AT91C_PMC_PRES_CLK_2;
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

  AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ;
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
  
  
  
  //enable the clock of the PIO
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
  //enable the clock of the PIO
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;


  // GPIO init
  AT91C_BASE_PIOA->PIO_ODR    = 0xffffffff;   // All as input
  AT91C_BASE_PIOB->PIO_ODR    = 0xffffffff;   // All as input
  AT91C_BASE_SYS->PIOA_PPUDR  = 0xffffffff;   // Disable Pull-up resistor
  AT91C_BASE_SYS->PIOB_PPUDR  = 0xffffffff;   // Disable Pull-up resistor

  AT91C_BASE_PIOB->PIO_OER    = 1 << 22;
  
  
  for (;;)
    {      
      unsigned int waiting_time;
      
      AT91C_BASE_PIOB->PIO_SODR    = 1 << 22;  
      for(waiting_time = 0; waiting_time < 2000; waiting_time++);
     
      AT91C_BASE_PIOB->PIO_CODR    = 1 << 22;   
      for(waiting_time = 0; waiting_time < 2000; waiting_time++);
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Старт начинается как правило с адреса 00, сегмент INTVEC в IAR. Поведение после старта описано в файле cstartup.s90. После инициализации стеков и, если надо, периферии переход на Вашу main.

2. В xcl описаны сегменты памяти, которые понимает IAR и, если необходимо, Ваши собственные. Там самое главное указать правильно адреса для размещения программы и данных. Два больших ключевых слова CODE и DATA - сегменты размещения программы и данных. В документации от IAR все очень хорошо расписано. Возьмите любой xcl из примеров, там комментариями все пояснено что куда.

3. Как я понял mac файлы нужны для первоначальной инициализации периферии перед запуском дебагера. Например у меня контроллер с внешей памятью SDRAM. И я хочу отлаживаться в ней. В mac файле прописываю значения нужных регистров, для инициализации PLL, SDRAM и пр. Далее контроллер перед заливкой программы начинает видеть SDRAM в своем адресном пространстве.

4. Для отладки в RAM надо учесть две вещи. Первое, чтобы Ваш код вместе с данными помещался в RAM. И второе - в xcl указать диапазон адресов, для всех сегментов расположенных в области программ, совпадающим с размещением Вашей RAM. Тут важно понимать, что у ARM адресное пространство единое и ему все равно откуда выполнять программу, главное указать компилятору где код, а где нет.

 

Добавлю, что работая с IAR более четырех лет, не было ни одного вопроса, котрорый я не нашел бы в документации. Читайте внимательнее.

Изменено пользователем skn

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Старт начинается как правило с адреса 00, сегмент INTVEC в IAR. Поведение после старта описано в файле cstartup.s90. После инициализации стеков и, если надо, периферии переход на Вашу main.

А если файла cstartup.s90 нет в проекте, откуда стартует программа (в проекте олимекса такого файла нет)?

 

2. В xcl описаны сегменты памяти, которые понимает IAR и, если необходимо, Ваши собственные. Там самое главное указать правильно адреса для размещения программы и данных. Два больших ключевых слова CODE и DATA - сегменты размещения программы и данных. В документации от IAR все очень хорошо расписано. Возьмите любой xcl из примеров, там комментариями все пояснено что куда.

3. Как я понял mac файлы нужны для первоначальной инициализации периферии перед запуском дебагера. Например у меня контроллер с внешей памятью SDRAM. И я хочу отлаживаться в ней. В mac файле прописываю значения нужных регистров, для инициализации PLL, SDRAM и пр. Далее контроллер перед заливкой программы начинает видеть SDRAM в своем адресном пространстве.

4. Для отладки в RAM надо учесть две вещи. Первое, чтобы Ваш код вместе с данными помещался в RAM. И второе - в xcl указать диапазон адресов, для всех сегментов расположенных в области программ, совпадающим с размещением Вашей RAM. Тут важно понимать, что у ARM адресное пространство единое и ему все равно откуда выполнять программу, главное указать компилятору где код, а где нет.

 

Я это более менее понимаю, но так как я совершенно не в теме, то сразу въехать в структуру программы не получилось. Более того, у IAR подсветка синтаксиса на столько убогая, что в иных местах коментарии от кода не отличишь. Поэтому и хочется минимально возможный рабочий пример.

 

Добавлю, что работая с IAR более четырех лет, не было ни одного вопроса, котрорый я не нашел бы в документации. Читайте внимательнее.

 

Документация у IAR представлена в виде десятка ядреных PDF, т.е. отсутствуют вразумительный поиск, ссылки и т.д. Буду читать дальше.

 

Спасибо за ответ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если в проекте не указан cstartup.s90, то линкер включает в проект стандартный код инициализации, уберите в свойствах дебугера галку run to main и посмотрите на этот код..

 

PS. примеры у иара должны быть рабочие

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если в проекте не указан cstartup.s90, то линкер включает в проект стандартный код инициализации, уберите в свойствах дебугера галку run to main и посмотрите на этот код..

 

Это я уже понял научным тыком (удаляя все файлы из проекта от олимекс), а также понял, что требуется ему файл lib\dl4tpainl8n.r79, вопрос - почему именно этот?

 

PS. примеры у иара должны быть рабочие

 

Они рабочие, но расчитаны на боард от атмела, а там инициализируется много линий ввода/вывода, которые на плате олимекса подключены хрен знает куда, поэтому не хотел запускать в плату пример от IAR, но похоже пора эти заняться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. lib\dl4tpainl8n.r79 и т.д. требуется при использовании c runtime library, это можно менять в library config в свойствах проекта, но тогда не будут доступны всякие memcpy, printf и т.д...

2. имхо проще код в си файле поменять, чем с самого начала ковыряться с настройками проекта =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. lib\dl4tpainl8n.r79 и т.д. требуется при использовании c runtime library, это можно менять в library config в свойствах проекта, но тогда не будут доступны всякие memcpy, printf и т.д...

2. имхо проще код в си файле поменять, чем с самого начала ковыряться с настройками проекта =)

 

Как раз если я пытаюсь отключить библиотеки в настройках, ничего не работает. Т.е. нужно подключить к проекту те файлы, которые перекомпиленные в библиотеке? Наверное, это стартапы и лоулевел иниты? А какие, интересно, конкретно взять? От примера для атмеловского борда?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

от примеров пойдут, потом перепишете и допишете что надо.. для работы библиотек достаточно указать конфигурацию нормал и подключить *.h файлы типа stdio, stdlib.. посмотрите как сделано в примерах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

4. Если не сложно, то как по шагам сделать минимальный проект для отладки в RAM (как создать, какие файлы подключать, откуда брать, что прописать в настройках).

1) Запускаем IAR, создаем новый workspace или используем текущий.

 

2) Project->Create new project, выбираем C -> main или C++ -> main по вкусу, жмем ОК, указываем имя проекта.

 

3) Идем Project -> Options -> General Options

3.1)вкладка Target

--- Ставим крыжик на Device, выбираем в списке тип процессора. Это заставит IAR правильно указывать компилятору/ассемблеру архитектуру (ARM7TDMI, ARM9E и т.д.), правильно выбрать библиотеку, указать симулятору подходящий файл описания sfr (.ddf).

--- Выбираем Processor Mode Arm Или Thumb

 

4) Project -> Options -> С/С++ Compiler

4.1)вкладка Language

--- В разделе Language галочка уже стоит где надо в зависимости от того, что мы выбрали в п.2. Можно переставиь ее на Automatic(extension based).

4.2)вкладка Optimization

--- Для начала оставляем Size Low или Size none, позволит легко отлаживаться. По мере возрастания опыта можно будет увеличить до максимума.

4.3)вкладка List

--- ставим галочку Output list file

--- Ставим галочку Assembler mnemonics

 

5) Project -> Options -> Assembler

5.1) Вкладка List

--- ставим галочку Output list file

 

6) Project -> Options -> Linker

6.1) Вкладка Output

--- Если делаем проект для RAM оставляем все как есть, если для Flash - ставим галочку Allow C-SPY-specific output file и на вкладке Extra output ставим галочки Generate Extra output file и выбираем Output Format -> simple-code

6.2) Вкладка List

--- ставим галочку Generate linker listing

6.3) Вкладка Config

Копируем из папки примеров компилятора в папку проекта подходящий .xcl

--- Link command file ставим галочку Override default, указываем $PROJ_DIR$\файл.xcl

7) Project -> Options -> Debugger

7.1) Вкладка Setup

--- Выбираем Driver (Simulator/J-Link/Macraigor и т.д.)

Копируем из папки примеров .mac в папку проекта

--- Ставим галочку Use Macro File, указываем $PROJ_DIR$\файл.mac

7.2) Если отлаживаемся в Flash: Вкладка Download

--- Если отлаживаемся в Flash, ставим галочки Verify download, Use flash loader(s)

--- Жмем Edit, в появившейся форме New..., в появившемся окне настроек ничего не трогая жмем OK., Жмем ОК в форме выбора загрузчиков.

8) Если используем Wiggler, Project -> Options -> Macraigor

--- Выбираем Wiggler в списке OCD interface device.

 

Остальное можно не трогать.

 

9) File->Save all.

 

Собственно все. Проект создан. На всякий случай прикладываю .xcl и .mac для AT91SAM7. В .xcl надо правильно указать макс. адреса ОЗУ и флеши для конкретного кристалла - сейчас там указан минимум который есть в любом SAM7.

xcl_mac.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Спасибо, более-менее все работает, даже получилось создать проект без использования runtime библиотек, т.е. добавил весь необходимый минимальный код в проект. Буду теперь разбираться по шагам.

 

Всем большое спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей Борщ, спасибо за описание, я хоть и пишу софт для АРМ, но пока пользовался шаблонами от IAR - брал простейший проект, и модифицировал его под свою задачу, но файлы CStartup оставлял.

 

Можно еще неск вопросов:

 

1. Как работать с прерываниями? Достаточно описать ф-цию __irq __arm void f(void) , при выходе из которой надо сбросить регистр EIOCR, или необходимо делать еще какое-то описание по адресу 0х18?, ну и соотв настроить AIC.

(В случае со стартапом - я объявляю функцию прерывания просто void, без __irq __arm, так как в стартапе есть асм код, который делает все сам)

 

2. В вашем описании нет выбора библиотеки, но при создании нового проекта во вкладке

Project -> Options -> General Options -> Library configuration по умолчанию стоит Normal. Это можно оставить , или нужно поменять?

 

3. Как описывать обработчики исключений - data abort, и др?

 

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Как работать с прерываниями? Достаточно описать ф-цию __irq __arm void f(void) , при выходе из которой надо сбросить регистр EIOCR, или необходимо делать еще какое-то описание по адресу 0х18?, ну и соотв настроить AIC.

(В случае со стартапом - я объявляю функцию прерывания просто void, без __irq __arm, так как в стартапе есть асм код, который делает все сам)

тут есть два подхода (точнее, считая и Ваш с Cstartupом, три):

1) на место вектора исключения при помощи асм-файла ставится команда безусловного перехода по адресу AIC_IVR:

        CODE32
        COMMON  INTVEC:CODE:ROOT
        org     0x00000018
        LDR     PC, AT91C_AIC_IVR
        END

в С вы объявляете каждый обработчик с атрибутами __arm __irq. Это заставляет компилятор генерить отдельный пролог/эпилог для каждого обработчика, что конечно требует дополнительной памяти кода, но позволяет компилятору сгенерить пролог/эпилог максимально эффективно под конкретный обработчик (сохранять только нужные регистры), а вам индивидуально разрешать в отдельных обработчиках вложенные прерывания:

__irq __arm void IRQ_Handler1() {

    .............

    AT91C_BASE_AIC->AIC_EOICR = 0;
}

__irq __arm __nested void IRQ_Handler2() {

    .............

    AT91C_BASE_AIC->AIC_EOICR = 0;
}

2) Делается одна функция-обработчик в которой делается сохранение/восстановление регистров и из этой функции вызываются обработчики, которые представляют из себя обычные функции. Функция-обработчик "подвешивается" на вектор исключения стандартными средствами компилятора:

#pragma vector = 0x0000018
__irq __arm void IRQ_Switch() {
    (void (*)(void))(AT91C_BASE_AIC->AT91C_AIC_IVR)();
    AT91C_BASE_AIC->AIC_EOICR = 0;
}


void Handler1() {
    ...........
}
void Handler2() {
    ...........
}

3) Ваш третий метод по сути тот же второй только на асме. Он получается чуть эффективнее чем вариант 2 на С, но мне больше всего нравится первый вариант.

2. В вашем описании нет выбора библиотеки, но при создании нового проекта во вкладке

Project -> Options -> General Options -> Library configuration по умолчанию стоит Normal. Это можно оставить , или нужно поменять?

Все, что не описано можно оставить как есть. Менять нужно лишь в том случае, если вы четко понимаете что вы меняете и что вам это действительно нужно менять.

3. Как описывать обработчики исключений - data abort, и др?
Учитывая, что спец. ключевых слов в описании компилятора (во всяком случае в версии 4.30) нет, то судя по всему только на асме. Ну в крайнем случае пролог/эпилог на асме и вызов основного обработчика, который уже на С. Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах.

 

 

Спасибо, более-менее все работает, даже получилось создать проект без использования runtime библиотек, т.е. добавил весь необходимый минимальный код в проект. Буду теперь разбираться по шагам.

 

Всем большое спасибо.

Библиотеку все же желательно подключить. Из нее берется CStartup(если нет своего в проекте), из нее же берутся некоторые функции которые вы явно не вызываете (например у AVR конструкция switch при определенных условиях использует библиотечные функции, сдвиги на несколько битов). Что используется в ARM навскидку не скажу, но можно при помощи xlib распечатать список модулей библиотеки и поразмышлять над их названием. Нет смысла не подключать библиотеку. У IAR замечательный линкер, и ни одного лишнего (неиспользуемого) байта из библиотеки в проект не попадет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах.

Увы :(, это "паркетный" вариант, когда объект лежит на столе, к нему подключен JTAG и у него заблокирован Watchdog....

Для работы в реальных условиях для того, что-бы фиксировать факт вылета c последующей локализацией причины нужно писать реальный обработчик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Библиотеку все же желательно подключить. Из нее берется CStartup(если нет своего в проекте), из нее же берутся некоторые функции которые вы явно не вызываете (например у AVR конструкция switch при определенных условиях использует библиотечные функции, сдвиги на несколько битов). Что используется в ARM навскидку не скажу, но можно при помощи xlib распечатать список модулей библиотеки и поразмышлять над их названием. Нет смысла не подключать библиотеку. У IAR замечательный линкер, и ни одного лишнего (неиспользуемого) байта из библиотеки в проект не попадет.

 

Библиотеки я стремился отключить исключительно для детального изучения процессора и среды. Т.е. с подключенными библиотеками, если какой-то модуль объявлен, но не описан, линкер приспокойно берет его из библиотеки. Естественно, в реальных программах библиотеки надо использовать, во всяком случае, они один из основных плюсов программирования на С под МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах.

Увы :(, это "паркетный" вариант, когда объект лежит на столе, к нему подключен JTAG и у него заблокирован Watchdog....

Для работы в реальных условиях для того, что-бы фиксировать факт вылета c последующей локализацией причины нужно писать реальный обработчик.

 

Вот бы еще научиться писать реальные обработчики.. и можно эту тему перенести в FAQ.!!

Может выложите пример как их правильно описать?

 

Пока я нашел , что можно функцию описать как __swi void f(void) но опять вопрос - компилер сам поставит переход по нужному адресу этого прерывания, или нужно руками все описывать?

спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...