Форум программистов, компьютерный форум CyberForum.ru

Как сделать массив в памяти по фиксированному адресу? - C++

Восстановить пароль Регистрация
 
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
03.07.2013, 21:40     Как сделать массив в памяти по фиксированному адресу? #1
Есть микропроцессор, и в нем по жестко зафиксированному адресу находится массив ячеек. Допустим типа int. Как в Си мне организовать к нему доступ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,016
Записей в блоге: 10
Завершенные тесты: 1
03.07.2013, 21:52     Как сделать массив в памяти по фиксированному адресу? #2
C++
1
2
3
4
int * p_array = (int *)0xabcd;
array[0] = 123;
int a = array[1];
...
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
03.07.2013, 22:30  [ТС]     Как сделать массив в памяти по фиксированному адресу? #3
Хорошо. А array надо заменить на p_array, я правильно понял?
Но тут я вижу надо заводить дополнительную переменную типа указатель. А без этой переменной нельзя? В микроконтроллере памяти не так много чтоб впустую заводить дополнительную переменную
Как так делать с простым типом int я уже разобрался сам: *(int*)0xabcd=123; Как бы похожую конструкцию применит к типу массив?
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,016
Записей в блоге: 10
Завершенные тесты: 1
03.07.2013, 22:37     Как сделать массив в памяти по фиксированному адресу? #4
Цитата Сообщение от paskal Посмотреть сообщение
Как бы похожую конструкцию применит к типу массив?
Не совсем понял что тебе нужно..., ты не об этом?
C++
1
2
((int *)0xabcd)[0] = 123;
((int *)0xabcd)[1] = 456;
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
03.07.2013, 22:50  [ТС]     Как сделать массив в памяти по фиксированному адресу? #5
Цитата Сообщение от lazybiz Посмотреть сообщение
Не совсем понял что тебе нужно..., ты не об этом?
C++
1
2
((int *)0xabcd)[0] = 123;
((int *)0xabcd)[1] = 456;
Да, об этом. Но такую конструкцию нельзя применить, подставлять тип массив там где должен стоять int компилятор не позволит.
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,016
Записей в блоге: 10
Завершенные тесты: 1
03.07.2013, 23:00     Как сделать массив в памяти по фиксированному адресу? #6
Цитата Сообщение от paskal Посмотреть сообщение
подставлять тип массив там где должен стоять int компилятор не позволит.
Все прекрасно компилируется, если ты об этом. Такая конструкция вполне позволительна.
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
03.07.2013, 23:19  [ТС]     Как сделать массив в памяти по фиксированному адресу? #7
У меня компилятор на это дает ошибку. А без спецификатора массива - все ок.
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,016
Записей в блоге: 10
Завершенные тесты: 1
03.07.2013, 23:29     Как сделать массив в памяти по фиксированному адресу? #8
Все было бы намного проще, если бы ты еще в 5-м сообщении сказал что за ошибка и какой у тебя компилятор.
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
03.07.2013, 23:53  [ТС]     Как сделать массив в памяти по фиксированному адресу? #9
Компилятор keil microvision для ARM.
Сообщение об ошибке - expression must have pointer to object type
Но я уверен что и другие компиляторы это делать не дадут, си все же стандартизован.
И потом, как так можно: просто подставить к целому типу скобки массива? Си все же язык со строгой типизацией.
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,016
Записей в блоге: 10
Завершенные тесты: 1
04.07.2013, 00:06     Как сделать массив в памяти по фиксированному адресу? #10
Цитата Сообщение от paskal Посмотреть сообщение
как так можно: просто подставить к целому типу скобки массива?
Где ты увидел что я просто подставил к целому типу скобки массива?
C++
1
((int *)0x1234)[0] = 123;
(int *)0x1234 - преобразуем значение 0x1234 в указатель int *.
(ptr)[0] - адресуем указатель как массив.
Еще раз: любой стандарт языка Си это позволяет!
Если у тебя такое не прокатывает, значит проблема в твоем keil microvision.
Покажи как ты это делаешь.
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
04.07.2013, 06:56  [ТС]     Как сделать массив в памяти по фиксированному адресу? #11
А и правда работает, это я накосячил.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 12:49     Как сделать массив в памяти по фиксированному адресу?
Еще ссылки по теме:

Выделение памяти по известному адресу C++
Доступ к произвольному адресу памяти C++
C++ Вызов функции-члена класса по адресу в памяти

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
04.07.2013, 12:49     Как сделать массив в памяти по фиксированному адресу? #12
paskal, используй VirtualAllocEx
Reserves or commits a region of memory within the virtual address space of a specified process. The function initializes the memory it allocates to zero, unless MEM_RESET is used.
C++
1
2
3
4
5
6
7
LPVOID WINAPI VirtualAllocEx(
  _In_      HANDLE hProcess,
  _In_opt_  LPVOID lpAddress,
  _In_      SIZE_T dwSize,
  _In_      DWORD flAllocationType,
  _In_      DWORD flProtect
);
lpAddress [in, optional]
The pointer that specifies a desired starting address for the region of pages that you want to allocate.
If you are reserving memory, the function rounds this address down to the nearest multiple of the allocation granularity.
If you are committing memory that is already reserved, the function rounds this address down to the nearest page boundary. To determine the size of a page and the allocation granularity on the host computer, use the GetSystemInfo function.
If lpAddress is NULL, the function determines where to allocate the region.
Yandex
Объявления
04.07.2013, 12:49     Как сделать массив в памяти по фиксированному адресу?
Ответ Создать тему
Опции темы

Текущее время: 01:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru