|
|
  |
Помогите разобраться с RVMDK |
|
|
|
Apr 5 2006, 08:59
|
Тутэйшы
   
Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263

|
Благодарю! Я почитал. Переварю. Пробовал и примеры из кейла разбирать. В общем понятно, но вопрос открыт. Я прописал для LPC2214 основную память и внешнюю срам: Код LR_IROM1 0x00000000 0x00040000 {; load region ER_IROM1 0x00000000 { ; load address = execution address *.o (RESET, +First) * (+RO) } RW_IRAM1 0x40000000 0x00004000 {; RW data * (+RW +ZI) } RW_RAM1 0x80000000 UNINIT 0x00004000 { 2.o (+RW) } } В файле 2.с создавал различные переменные, которые пользовал в майне. В опшионс для 2.с прописал кроме дефаулт внешнюю память. Мне не понравилось, что линкер упорно не захотел разместить массив данных, расположенный в 2.с во внешней памяти. Массив он пихает в набортную память. Код как положено, а переменные в файле 2. как раз во внешней памяти. Я вообще представлял, что создаешь любые переменные, прописываешь в опциях модуля память и линкер автоматом их размещает. А тут он как-то избирательно подходит. Если массив - в инициализируемой памяти, если переменная, то во внешней. Таким образом не могу придумать главное - как мне помещать и считывать данные из внешней SRAM. Вообще реалвью показался мне недружественным. С указателями требует крайней точности. unsigned char *blabla = 0x80000 не пройдет. Обязательно надо поставить unsigned char *blabla = (unsigned long*)0x80000. В функцию передаю аргумент, внутри функции он каким-то макаром передает левое значение. Я и volatile писал - не помогает. Короче не пойму - чего его народ хвалит?
|
|
|
|
|
Apr 5 2006, 09:57
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(vesago @ Apr 5 2006, 12:59)  Я вообще представлял, что создаешь любые переменные, прописываешь в опциях модуля память и линкер автоматом их размещает. А тут он как-то избирательно подходит. Если массив - в инициализируемой памяти, если переменная, то во внешней. Таким образом не могу придумать главное - как мне помещать и считывать данные из внешней SRAM. Как Вы просили, так он и сделал - если нужно разместить массив во внешней памяти, то линкеру нкжно было писать: Код LR_IROM1 0x00000000 0x00040000 {; load region ER_IROM1 0x00000000 { ; load address = execution address *.o (RESET, +First) * (+RO) } RW_IRAM1 0x40000000 0x00004000 {; RW data * (+RW +ZI) } RW_RAM1 0x80000000 UNINIT 0x00004000 { 2.o (+ZI) } } Цитата(vesago @ Apr 5 2006, 12:59)  Вообще реалвью показался мне недружественным. С указателями требует крайней точности. unsigned char *blabla = 0x80000 не пройдет. Обязательно надо поставить unsigned char *blabla = (unsigned long*)0x80000. В функцию передаю аргумент, внутри функции он каким-то макаром передает левое значение. Я и volatile писал - не помогает. Короче не пойму - чего его народ хвалит? И правильно, что ругается - прямое присвоение указателю числового значения недопустимо. А ставить надо не unsigned char *blabla = (unsigned long*)0x80000, а unsigned char *blabla = (unsigned char*)0x80000. Просто с типами надо работать аккуратнее.
|
|
|
|
|
Apr 5 2006, 11:13
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата в талмуде написано, что ZI - инициализировать память нулями. Получается, что ZI противоречит UNINIT, который говорит не трогать память. К ZI у него относятся все "неинициализируемые" переменные, которые, на самом деле, забиваются нулями. UNINIT, по идее, должен указать скаттеру на отсутствие необходимости в этом заполнении. Цитата И еще - как сделать, чтоб линкер не пихал в эту область данные. Есть слово EMPTY, но оно не работает. Не понял вопрос. Сделайте пустую секцию - он ничего туда не положит. Цитата Большой недостаток, что нельзя взять массив и указать, что он располагается по конкретному адресу. Вроде unsigned char tt[100]__at 0x80000000. Можно, только конкретный адрес дается не переменной, а секции, в которой эта переменная расположена. Переменная к секции привязывается при помощи #pragma arm section, кажется.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|