2017-04-07 1 views
-1

저는 약 2 개월 동안 8051을 프로그래밍했고 C 언어에 대해서는 다소 초보자입니다. 나는 현재 플래시 메모리를 읽고, 쓰고, 지우고, 분석하기 위해 노력하고있다. 현재 작성 단계에서 작업 중이고 필요한 작업 중 하나는 주소 위치를 지정하고 그 위치를 데이터로 채운 다음 다음 위치로 증가시켜 보완적인 데이터로 채우는 것입니다. 끝까지 도달 할 때까지 계속 켜져 있습니다.C - C에서 18 비트 증가 8051

내 딜레마는 내가 놀고 자하는 18 개의 주소 비트가 있고 현재이 18 비트에 3 바이트가 할당되어 있습니다. 어쨌든 그 18 비트를 int 또는 unsigned int으로 조합하여 증가시킬 수 있습니까? 또는 첫 번째 바이트를 증가시키는 유일한 옵션입니다. 그 다음 바이트가 0x00까지 증가하면 다음 바이트가 증가하고 다음 바이트가 넘어갈 때 다음 바이트가 증가합니다.

내가 현재 가지고 :

void inc_address(void) 
{ 
    P6=address_byte1; 
    P7=address_byte2; 
    P2=address_byte3; 
    P5=data_byte; 

    while(1) 
    { 
     P6++; 
     if(P6==0x00){P7++;} 
     else if(P7==0x00){P2++;} 
     else if(P2 < 0x94){break;} //hex 9 is for values dealing with flash chip 
     P5=~data_byte; 
    } 
} 
+0

비트 필드를 사용할 수 있습니까? 좋아요, 그래서 8051은 CT 경계에서 거의 지워졌고 편평한 금붕어보다 RAM이 적었습니다. 그러나 bitfield int var에 대해 24 비트 중 18 비트를 사용할 수 있다면 ... – ThingyWotsit

+0

증가량에 결함이있는 것 같습니다. 예를 들어, P6와 P7이 255에서 시작하면 둘 다 0으로 유지되어야 P7과 P7 = 1이됩니다. 루프는 필요하지 않습니다. "carry 테스트"는 중첩되어야합니다. – Clifford

+0

주소 변수를 증가시키고 주소 변수를 포트에 할당하고 포트 값을 증가시키는 대신 포트에 할당하는 것이 훨씬 더 좋습니다. – Clifford

답변

0

내가 그런 int로 또는 부호 INT 및 증가에 그 18 개 비트를 결합 할 수 어쨌든 있나요?

확실히. intunsigned int 시스템에 최소한 너비가 18 비트라는 것을 가정하면, 당신은이 작업을 수행 할 수 있습니다

unsigned int next_address = (hi_byte << 16) + (mid_byte << 8) + low_byte + 1; 
hi_byte = next_address >> 16; 
mid_byte = (next_address >> 8) & 0xff; 
low_byte = next_address & 0xff; 

<<>>은 비트 시프트 연산자, 그리고 바이너리 &는 비트 "와"연산자입니다.

그러나 유형의 크기에 대한 가정을하지 않는 것이 더 안전하고 휴대하기 쉽습니다. ,이를 방지 stdint.h을 포함, 입력 uint_least32_t 대신 unsigned int 사용하려면 addressuint32_t입니다

uint_least32_t next_address = ((uint_least32_t) hi_byte << 16) 
     + ((uint_least32_t) mid_byte << 8) 
     + (uint_least32_t) low_byte 
     + 1; 

// ... 
+0

그래서 새로운 변수를 생성하고 비트 단위 연산을 수행하여 증가시키기 위해 필요한 18 비트 변수를 생성한다고 말합니다. 첫 번째 줄의 끝 부분에 +1을 넣는 이유를 설명해 주시겠습니까? 나는 그 초기화가 뒤따라야한다고 생각한다. 다음 세 줄은 원래 변수를 다시 정의하는 것이지만 왜 비트 연산자 "and"를 사용합니까? –

+0

조립 된 주소를 저장하는 장소가 필요합니다. 관심있는 세 바이트를 꺼내려면 여러 번 액세스해야하기 때문입니다.그것은 변수가 필요합니다. 대부분 초기화를 위해 간단하게하기 위해 +1을 수행했으며, 초기화와 일관성있는 방식으로 변수의 이름을 지정했습니다. +1은 이후에 수행되었을 수 있습니다. 그것은 단지 문체적인 선택 일뿐입니다. 업데이트 된 바이트를 읽을 때 비트 '&'는 원하지 않는 비트를 마스크합니다. 개별 바이트 변수에 부호없는 8 비트 유형이 있으면 이러한 마스킹은 불필요하지만 무해합니다. –

+0

이제 알겠습니다. 도와 주셔서 정말 감사합니다. –

1

: 함수가 inc_address라고하는 이유는 명확하지 않다 그러나

void inc_address(void) 
{ 
    // Increment address 
    address = (address + 1) & 0x0003ffff ; 

    // Assert address A0 to A15 
    P6 = (address & 0xff) 
    P7 = (address >> 8) & 0xff 

    // Set least significant two bits of P2 to A16,A17 
    // without modifying other bits in P2 
    P2 &= 0xFC ;     // xxxxxx00 
    P2 |= (address >> 16) & 0x03 ; // xxxxxxAA 

    // Set data 
    P5 = ~data_byte ; 
} 

을뿐만 아니라 함께 P5를 할당 ~data_byte, 이는 아마도 데이터 버스를 어설 션합니까? 그것은 주소를 증가시키는 것 이상으로 뭔가를하고 있습니다. 따라서 너무 가볍게 혼란스럽게 이름이 붙여집니다. 나는이 함수가 주소와 데이터를 매개 변수로 취해야한다고 제안한다. global data.