Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как создать переменную с фиксированным адресом
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
-=Sergei=-
Как создать переменную с фиксированным адресом, т.е. что бы некоторому регистру в области периферии была сопоставлена переменная с адресом этого регистра ?
zhevak
Цитата(-=Sergei=- @ Aug 27 2008, 11:22) *
Как создать переменную с фиксированным адресом, т.е. что бы некоторому регистру в области периферии была сопоставлена переменная с адресом этого регистра ?


В KEIL-е для какого-то конкретного, заранее известного адреса можно сделать так:
Код
unsigned int myVar 0xfff00000;
...
void main(void)
{
...
  myVar = 0x04000000; // Чего-то тут записываем по заданному адресу
}


В IAR-е так (see at p.36-37 of Reference Guide):
Код
__no_init unsigned int myVar @ 0xfff00000;
...
void main(void)
{
...
  myVar = 0x04000000; // Чего-то тут записываем по заданному адресу
}


А вообще среда (IDE) у Вас какая?
-=Sergei=-
Цитата(zhevak @ Aug 27 2008, 09:32) *
Для какого-то конкретного, заранее известного адреса можно сделать так:
Код
unsigned int myVar 0xfff00000;
...
void main(void)
{
...
  myVar = 0x04000000; // Чего-то тут записываем по заданному адресу
}


А вообще среда (IDE) у Вас какая?


Код
unsigned int m 0x20000000;

int main (void)
{
    char mem[256];
    int i = 0;
    for (i=0;i<256;i++)
        mem[i] = i;
    m = mem[255]/mem[1];    
    return m;
}


Error
expected a ";" test4 main.c line 1 1219814916828 183


Среда Eclipse 3.2
aaarrr
Цитата(zhevak @ Aug 27 2008, 09:32) *
Для какого-то конкретного, заранее известного адреса можно сделать так:

07.gif ????


-=Sergei=-: А define чем не устраивает?
Код
#define    REG    (*(volatile unsigned int *)ADDRESS)
sergeeff
Так как, например, это делает Atmel:

typedef volatile unsigned int AT91_REG;// Hardware register definition

typedef volatile struct _AT91S_MC {
AT91_REG MC_RCR; // MC Remap Control Register
AT91_REG MC_ASR; // MC Abort Status Register
AT91_REG MC_AASR; // MC Abort Address Status Register
AT91_REG Reserved0[1]; //
AT91_REG MC_PUIA[16]; // MC Protection Unit Area
AT91_REG MC_PUP; // MC Protection Unit Peripherals
AT91_REG MC_PUER; // MC Protection Unit Enable Register
} AT91S_MC, *AT91PS_MC;

#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address

Таким образом задается базовый адрес структуры, а конкретный регистр : AT91C_BASE_MC->AT91_REG MC_ASR

Но можно и просто:

#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register

Кому как больше нравится
-=Sergei=-
sergeeff и aaarrr

Спасибо. Зработало.
KRS
А вы почитайте DUI0348A_rvct_compiler_ref_guide.pdf
там много интересного на RVCT
например __writeonly и __attribute__((at(address)))
sergeeff
Если стандартные средства языка решают в полной мере задачу, лучше не пользоваться экзотическими модификаторами. Это снижает переносимость программ. Может завтра придется воспользоваться другим компилятором?
-=Sergei=-
И новый вопрос!

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

typedef void (*pMyFun)(void);

pMyFun MyFun = (pMyFun)0xaaaabbbb;

Вызов:
MyFun();
-=Sergei=-
Цитата(sergeeff @ Aug 27 2008, 12:29) *
Например так:

typedef void (*pMyFun)(void);

pMyFun MyFun = (pMyFun)0x08000000;

Вызов:
MyFun();



То что нужно но не сработало sad.gif((

в резултате получися acм
MOV r4,0x08000000
BLX r4

а BLX умеет переходить только +16М, а надо +138М

Т.е. опишу что мне нужно.
Есть ядро КортехМ3, стартует с адреса 0х0000 0000,
в памяти с адреса 0х0000 0000 + 4096 лежит загрузочное ПЗУ , в которой будет лежать программа по перваоначальной инициализации микроконтроллера, после чего управление должно перейти на программу записанную пользователем во флеш, флеш память начинается с 0х0800 0000.

Сейчас мне нужно в загручояном ПЗУ сдеть переход на флеш память.
Вопрос как мне из ПЗУ передать управление во флеш, если между ними ~138М ничего нет.

Цитата(-=Sergei=- @ Aug 27 2008, 12:55) *
То что нужно но не сработало sad.gif((

в резултате получися acм
MOV r4,0x08000000
BLX r4

а BLX умеет переходить только +16М, а надо +138М

Т.е. опишу что мне нужно.
Есть ядро КортехМ3, стартует с адреса 0х0000 0000,
в памяти с адреса 0х0000 0000 + 4096 лежит загрузочное ПЗУ , в которой будет лежать программа по перваоначальной инициализации микроконтроллера, после чего управление должно перейти на программу записанную пользователем во флеш, флеш память начинается с 0х0800 0000.

Сейчас мне нужно в загручояном ПЗУ сдеть переход на флеш память.
Вопрос как мне из ПЗУ передать управление во флеш, если между ними ~138М ничего нет.



Сорри изменение, сработало, может перейти однако, немного надо было еще scatter файл подправить.
Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.