реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как создать переменную с фиксированным адресом, Cortex-M3 проект в RVDS 3.1
-=Sergei=-
сообщение Aug 27 2008, 05:22
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



Как создать переменную с фиксированным адресом, т.е. что бы некоторому регистру в области периферии была сопоставлена переменная с адресом этого регистра ?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 27 2008, 05:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(-=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) у Вас какая?

Сообщение отредактировал zhevak - Aug 27 2008, 05:43


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
-=Sergei=-
сообщение Aug 27 2008, 05:39
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



Цитата(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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 27 2008, 05:43
Сообщение #4


Гуру
******

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



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

07.gif ????


-=Sergei=-: А define чем не устраивает?
Код
#define    REG    (*(volatile unsigned int *)ADDRESS)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 27 2008, 05:49
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Так как, например, это делает 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

Кому как больше нравится
Go to the top of the page
 
+Quote Post
-=Sergei=-
сообщение Aug 27 2008, 05:54
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



sergeeff и aaarrr

Спасибо. Зработало.
Go to the top of the page
 
+Quote Post
KRS
сообщение Aug 27 2008, 07:00
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А вы почитайте DUI0348A_rvct_compiler_ref_guide.pdf
там много интересного на RVCT
например __writeonly и __attribute__((at(address)))
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 27 2008, 08:08
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Если стандартные средства языка решают в полной мере задачу, лучше не пользоваться экзотическими модификаторами. Это снижает переносимость программ. Может завтра придется воспользоваться другим компилятором?
Go to the top of the page
 
+Quote Post
-=Sergei=-
сообщение Aug 27 2008, 08:26
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



И новый вопрос!

А как создать функцию, с заданным адресом входа ?
Т.е. что бы я точно был уверен, что при вызове этой функции PC примет заданный адрес ?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 27 2008, 08:29
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Например так:

typedef void (*pMyFun)(void);

pMyFun MyFun = (pMyFun)0xaaaabbbb;

Вызов:
MyFun();
Go to the top of the page
 
+Quote Post
-=Sergei=-
сообщение Aug 27 2008, 09:03
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



Цитата(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 файл подправить.
Спасибо.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 08:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01465 секунд с 7
ELECTRONIX ©2004-2016