2013-11-14 3 views
0

Что случилось со следующим кодом:Как получить доступ к ячейке памяти непосредственно с помощью указателя?

unsigned int *ptr;  
ptr=(unsigned int*)0x1234; 
*ptr=10; 
/*do someting*/ 
*ptr=100; 

Imp точка, я прочитал карту памяти микроконтроллера, и это место может быть очень использоваться программистом, поэтому случай не owning- память исключена. Все, что я хочу узнать, могу ли я использовать вышеуказанный метод для прямого доступа к ячейке памяти?

Заранее спасибо.

+2

Да, вы можете это сделать. – RedX

+2

Возможно, вам нужно будет добавить 'volatile'. – Vlad

ответ

2

Да, это нормально, если только, как вы сказали, вы находитесь в пределах доступного диапазона памяти.

Также я хотел бы добавить, поскольку вы упомянули микроконтроллер, если это адрес SFR или GPR, тогда его псевдоним (с использованием #define) уже должен быть определен в заголовке контроллера, поэтому лучше использовать это псевдоним для улучшения удобочитаемости/понятности и переносимости.

EDIT: (Как Влад отметил в комментарии)
Использования volatile сделает вашу программу более безопасным & надежной, так как компилятор не будет оптимизировать немедленную запись в памяти, и вы можете быть уверены в том, что значение вы пишете немедленно записывается в нужное место.

+0

Thanx @ 0xF1 !! Это помогло! – user1901196

1

Да, вы можете использовать его, но имейте в виду проблемы выравнивания. В зависимости от вашего микроконтроллера может произойти следующее:

uint16_t * p1 = (uint16_t *)0x8; 
uint16_t * p2 = (uint16_t *)0x9; 
*p1 = 1; // Ok 
*p2 = 1; // Unaligned access -> Crash or something else 

ARM, например, требует, чтобы 16-разрядные переменных выравниваются по четным адресам (делится на 2).

Смежные вопросы