2012-10-22 2 views
1

나는 (0x1228A432) 특정 메모리 주소에 등록 바이트를 기록 할특정 메모리 주소로 등록 할 바이트를 쓰는 방법은 무엇입니까?

그러나,이 레지스터는 다음과 같은 구조를 가지고 :

Bits | Access | Name | Reset | Description | 
[31:8] | Read only | -------- | ------ | Reserved | 
[7:0] | Read-write | REG[7:0] | 0xXX | ----------- | 

방법없이이 레지스터에 바이트를 쓰고, 말해주십시오 예약 비트를 "만지기"?

EDIT1 : 내 타겟은 Cortex A9입니다. (예를 0xFF로)

EDIT2을 256 비트 값을 사용하여 DDR2 메모리 내장에 나는 성공적으로 읽기/쓰기 수 :

// First stage 
static unsigned char *p = 0; 
char * argv1="0x60000000"; 
unsigned long address=strtoul(argv1, 0, 0); 
p = (unsigned char *) argv1; 

// Second stage 
char * argv4="FF"; 
int value=strtol(argv4,0,16); 

// Third stage 
int offset = 9; 
p[offset]=value; 

EDIT3 : 나는 다음과 같은 방법으로 DDR2 메모리와 함께 작동하는 데 사용 내가 발견 다음 정보를 확인하십시오.

모든 레지스터는 32 비트이며 바이트 쓰기를 지원하지 않습니다. 쓰기 작업은 워드 와이드 여야하며 예약 됨으로 표시된 비트는 읽기 - 수정 - 쓰기를 사용하여 으로 보존해야합니다.

+5

이 마이크로 컨트롤러에 대한인가 등, 아마 무시 예약 비트에 쓰기는, 또는 모든 0/1해야 하는가? '((uint8_t *) 0x1228A432) [0] = 42;'충분합니까? –

+1

그것은 선택의 아키텍처에 따라 매우 다릅니다. 바이트 단위 액세스가 허용됩니까? 일부 마이크로 컨트롤러 (예컨대, STM32)는 예를 들어, 선택 비트를 설정/리셋하기위한 추가 수단을 갖는다. PIO 출력 레지스터. 다른 비트는 건드리지 않는다. 우리에게 당신의 목표가 무엇인지 알려주세요 :) –

+0

@ H2CO3 불행히도 이것은 작동하지 않습니다. –

답변

1

편도, 32 비트 폭의 액세스를 가정 값을 판독하는 것을 zero-out 비트 [7 : 0], bitwise 또는 필요한 값으로 다시 입력 한 다음 다시 레지스터에 씁니다. (REDX에서 비트를 훔치는) 같은

뭔가) :

uint8_t your_8_bit_value = 0x42; 
uint32_t volatile * const mem_map_register = (uint32_t volatile *) 0x1228a432; 
*mem_map_register = (*mem_map_register & 0xFFFFFF00) | your_8_bit_value; 

아직 난 당신의 하드웨어에 대한 가능한 많은 정보가 있어야한다고 생각합니다. 예를 들어 여러 데이터 시트를 보았습니다. 1을 모두 예비 비트 (즉, 예약 비트는 나중에 사용하기 위해 예약되어 있고 1은 안전한 기본값 임)를 작성해야합니다. 따라서 예약 된 비트를 그대로두면 올바른 작업을 수행 할 수 있습니다.

당신은 당신의 하드웨어에 대한 자세한 정보를 찾을 수 있어야 - 바이트 전체 쓰기가 지원됩니다

+0

제 EDIT3를 확인하십시오. –

+2

하, 그럼 위의 스 니펫은 트릭을해야합니다! –

+0

마침내 효과가 있습니다! 정말 고맙습니다. –

0
[register value] = ([register value] | [00 00 00 FF]) & [FF FF FF XX] 

여기서 xx는 주어진 주소에서 읽은 다음 24 비트 마스크를 설정합니다. 그리고 위에 표시된 값에 대한 비트 &을 수행 나는이

+2

왜 downvoted ....? 그것은 약간의 실수가 있었지만 단지 편집 만했습니다. – Omkant

+1

나는 downvote에 대한 어떤 이유도 보지 못했다. +1. –

+0

@ H2CO3 : 고맙습니다. – Omkant

1

는 8 비트 쓰기 명령 (있는 경우 확실하지)에 대한 어셈블러 명령 핸드북을 찾아 일을한다고 생각합니다. 그렇다면 해당 메모리 위치 (uint8_t volatile * const reg = (uint8_t volatile * const) 0x1228a432;)에 대한 할당에 uint8_t를 사용하십시오.

기타 Omkant가 말한 것을 수행하십시오. 비트를 같은 번호로 덮어 쓰면 겹쳐 쓰여지기 전에 "제로화"되지 않으므로 원하지 않는 결과가 나오지 않아야합니다. C에서

그의 코드 (이 가독성 용장 버전) 비트 [31 : 8] 보존

uint8_t your_8_bit_value = 0x42; 
uint32_t volatile * const mem_map_register = (uint32_t volatile *) 0x1228a432; 
*mem_map_register = (*mem_map_register & 0xFFFFFF00) | your_8_bit_value; 
+0

테스트를 거쳤으므로 제대로 작동하지 않습니다. 제발, 적어도 한 가지 더 방법을 제공 할 수 있습니까? –

+0

나는 다음과 같은 방법으로 DDR2 메모리를 사용했다 : 1) static unsigned char * p = 0; ---> char * argv1 = "0x00000008"; ---> 부호없는 긴 주소 = strtoul (argv1, 0, 0); ---> 2) p = (부호없는 char *) argv1; ---> int offset = 9; ---> char * argv4 = "FF"; ---> value = strtol (argv4,0,16); ---> 3) p [offset] = value; –

+1

나는 그것이 옳다고 생각하지 않는다. 이 코드 조각의'new_register_value'는'0xFFFFFFFF & v == v'처럼 단순히 0x42가 될 것입니다. '(* mem_map_register & new_register_value)'표현식은 비트 [31 : 8]에 모두 0을 갖기 때문에이 코드는 보존하지 않고 비트를 효과적으로 재설정합니다. –

관련 문제