Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Научите работать с IAR и AT91SAM7S
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
solder
Проблемма в следующем:

если компилить сей код с высокой оптимизацией - то всё работает,
если без оптимизации то нет.

может ещё какая инициализация нужна?
(что такое sturtup и куда его пихать?)

и вообще - как грамотно проект настроить.
загружаю я бинарнрик SAM-Bой с 0х100000

-------------------------------------------------------

#include "ioat91sam7s256.h"
#define __inline inline
#include "..\src\examples\Atmel\SAM7S256\Include\lib_AT91SAM7S256.h"


#define set(a,cool.gif ((a) |= (cool.gif)
#define clr(a,cool.gif ((a) &=~ (cool.gif)
#define bit(a,cool.gif ((a) & (cool.gif)

#define LED_G ((unsigned int)0x1 << 18)
#define LED_Y ((unsigned int)0x1 << 17)
#define BUT_G ((unsigned int)0x1 << 19)
#define BUT_Y ((unsigned int)0x1 << 20)

#define LedOn(a) AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,a)
#define LedOff(a) AT91F_PIO_SetOutput(AT91C_BASE_PIOA,a)
#define Press(a) (!bit(AT91F_PIO_GetInput(AT91C_BASE_PIOA),a))




int main()
{

AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS ;

// Disable watchwog
AT91F_WDTSetMode(AT91C_BASE_WDTC,AT91C_WDTC_WDDIS);// AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;


//Enabling the Main Oscillator:
// Start up time = 8 * 6 slow clock time
AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
//Wait the startup time
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_MOSCS)){}


//Setting PLL and divider:
//18432 / 192 * 625 = 60000(MHz);
//Wait 1 slow clock cycle
AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & 192) | (AT91C_CKGR_PLLCOUNT & (1<<8)) | (AT91C_CKGR_MUL & (624<<16)));


// Wait the startup time
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_LOCK)){}
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_MCKRDY)){}

//Selection of Master Clock and Processor Clock
//select the PLL clock
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK ;
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK ;
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_MCKRDY));


//enable the clock of the MC
AT91F_MC_CfgPMC (); // AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SYS)
//enable the clock of the PIO
AT91F_PIOA_CfgPMC ();// AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA)

//configure ports
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,LED_G | LED_Y);// AT91C_BASE_PIOA->PIO_PER; ->PIO_OER
AT91F_PIO_CfgInput (AT91C_BASE_PIOA,BUT_G | BUT_Y);// AT91C_BASE_PIOA->PIO_ODR; ->PIO_PER




while(1)
{
if(Press(BUT_Y)) LedOn (LED_Y);
else LedOff(LED_Y);
}

}
Edmundo
Цитата(solder @ Oct 5 2006, 14:41) *
#define set(a,cool.gif ((a) |= (cool.gif)
#define clr(a,cool.gif ((a) &=~ (cool.gif)
#define bit(a,cool.gif ((a) & (cool.gif)

Компилятор не воспринимает смайлики, поэтому наверняка будут ошибки. Лучше написать так:

Код
#define set(a,B)    ((a) |=  (B))
#define clr(a,B)    ((a) &=~ (B))
#define bit(a,B)    ((a) &   (B))
KRS
Скорее всего у вас непроинициализирована память и (или стек) и (или) распределение памяти неправильное

Просто при выскоком уровне оптимизации все происходит в регистрах.
solder
Чуть чуть поднял настроение. Спасибо.

Ну а всётаки?

Все IARовские примеры перегружены вот этими файлами

at91SAM7S256_NoRemap.xcl
at91SAM7S256_64KRAM.xcl

SAM7.mac
SAM7_RAM.mac

Cstartup_SAM7.c
Cstartup.s79

вероятно это всё должно работать.

но не очень понимаю как они с main.c завязаны
и каков вообще поцесс сборки этогочуда

может кто просветит???



Цитата(KRS @ Oct 5 2006, 16:21) *
Скорее всего у вас непроинициализирована память и (или стек) и (или) распределение памяти неправильное

Просто при выскоком уровне оптимизации все происходит в регистрах.



Вот я также думаю.

Подскажите пожалуйста, как правильно это сделать.

Не так чтоб сэмпл взять да своего кода туда налить,
а так чтоб самому разобраться откуда ноги ростут.
solder
Отвечу сам себе.

В опциях линкера подключен LinkerCommandFile - это xxx.xcl
там разметка памяти и областей данных на этой памяти.
В принципе всё понятно.


Там же стоит галочка Overwrite Defaul Program Entry

Тоесть надо полагать, что прога не запустится с main(), а с какой-то функции
мжет быть в ассемблерном файле, который и потащит за собой AT91F_LowLevelInit() из Стартапа,
а потом и main().

Кто подробности знает?????
Подскажите?
KRS
Цитата(solder @ Oct 5 2006, 16:41) *
Тоесть надо полагать, что прога не запустится с main(), а с какой-то функции
мжет быть в ассемблерном файле, который и потащит за собой AT91F_LowLevelInit() из Стартапа,
а потом и main().


Прога с main никогда не запускается, по умолчанию она запускается с
__program_start

исходники стнадартного стартапа лежат в
$EW_DIR$\arm\src\lib\

файл cstartup.s79 и содержит метку __program_start
и он входит в библиотеку, полные исходники библиотек есть только в полной версии, но исходники инициализации есть во всех.

если вы хотите изменить стандартный стратап
подключите свой файл и сделайте Overwrite Defaul Program Entry

в простейшем случае можно просто
1. проинитить стек
2. заполнить сегмент DATA_Z нулями
3. скопировать DATA_ID в DATA_I (или если отладка в памяти через JTAG сделать что бы эти сегменты находились по одному адресу)
4. перейти на main
solder
Похоже на правду.

только есть ещё два вопроса.

1. Почему же компилятор не добавляет в проект стартап по умолчанию, если проект состоит просто из сишного файла с main() на борту?

2. Как свой стартап конектится к проекту? Добавляется ассемблерный файл и всё, готово?
Edmundo
Цитата(solder @ Oct 6 2006, 10:03) *
Похоже на правду.

только есть ещё два вопроса.

1. Почему же компилятор не добавляет в проект стартап по умолчанию, если проект состоит просто из сишного файла с main() на борту?

2. Как свой стартап конектится к проекту? Добавляется ассемблерный файл и всё, готово?

Вообще любой процессор имеет некоторый стартовый адрес, с которого он начинает свое выполнение после RESET'а. Как правило это 0-вой адрес. Бывает еще так, что в этой области (начиная с нулевого адреса) размещается таблица прерываний. Следовательно надо в этом нулевом адресе пославить прыжок на начало вашей программы. Этим и занимается стартап-файл. Чтобы код стартап-файла записался именно в нулевые адреса, а не туда, куда придется, нужно отлинковать его в нужную секцию. Для этого (и не только для этого) существует xcl-файл, дающий указания линкеру.

Ну а если вы хотите программировать на Си, а не на ассемблере, вам необходимо проинициализировать Сишное окружение (run-time initialization переменных, и т.п. -- что конкретно для АРМ, не знаю, но по аналогии наверное что-то похожее). Поэтому перед выполнением main надо выполнить эту инициализирующую функцию. Отсюда:

1. Он не добавляет, оставляя вам свободу делать так, как вы хотите. А вдруг вы будете писать на АСМе, а он добавит Сишный стартап.
2. Добавляется файл (можно и Сишный, но на Си трудновато все точно разместить, ведь в таблице прерываний каждый вектор должен занимать строго определенное место) и главное, чтобы секции кода этого файла лежали там, где надо (при помощи линкера).
Kail
Когда начал изучать ARM, то первым делом выбирал среду программирования. IAR всем нравился - прежде всего безглючной работай wrigler черех H-JTAG, но убивало отсуствие в списке сырцов startup кода, тем более, что я всегда придерживался мысли, что изучать все нужно с основ, поэтому учил ассемблер и писал свой стартовый код. В этом отношении более прозрачен Keil, но с жтагом глючит. Откуда тянет стартовый код IAR я так и не разобрался, было бы интересно узнать, может тогда стоит и перелезть на него.
solder
Всем спасибо за советы.

На выходных попробую осилить smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.