레지스터 설정에 대한 이해

4309 단어 volatile이해하다.
코드를 보려면 다음과 같이 하십시오.

  
  
  
  
  1. volatile unsigned  long *gpmcon = (volatile unsigned long*)0x7F008820;  
  2.  
  3. *gpmcon = 0x1111;  

어떤 때는 좀 흐리멍덩해서 잘 이해하지 못할 때가 있다.
그렇다면 우리는 이렇게 이해한다.
보아하니

  
  
  
  
  1. int a;  
  2. a = 1; 

이것은 아주 간단하게 a를 정의하여 a를 1로 한다
자, 계속 봅시다.

  
  
  
  
  1. int a;  
  2. int *p;  
  3.  
  4. p = &a;  
  5. *p = 1; 

여기에 우리는 포인터를 정의하여 a의 주소를 p에게 부여한 다음에 p에 값을 부여했다. 이곳의 효과는 똑같다. 모두 a에 값을 부여했다.
네, 간소화해 주세요.

  
  
  
  
  1. int a;  
  2. int *p = &a;  //  p =   
  3. *p = 1; 

여기서 알아야 할 것은,*p는 값을 부여하는 어떤 주소입니다.
예를 들어 현재 우리의 주소는 0x7F008820이다
자, 그럼 우리는 지금 이렇게 쓸 수 있다.

  
  
  
  
  1. int *p = 0x7F008820;  
  2. *p = 0x1111; 

컴파일러 경고 유형이 일치하지 않도록 하려면 유형 변환을 추가합니다.

  
  
  
  
  1. int *p = (int *)0x7F008820;    
  2. *p = 0x1111;  

네, 여기까지 이해했습니다. 원래의 것으로 돌아가서 int를 unsigned long으로 수정합니다.
그러면 저희가 얻었습니다.

  
  
  
  
  1.  unsigned  long *gpmcon = (unsigned long*)0x7F008820;  
  2.  
  3. *gpmcon = 0x1111;  

 
이제 우리가 원하는 표현식을 얻었으니, 여기에volatile가 하나 더 없어졌다.
이거 컴파일러 최적화 방지예요.
다음 절차를 보면 알 수 있습니다.

  
  
  
  
  1. //  
  2. main()  
  3. {  
  4.    int a;  
  5.     a = 1;  
  6.     printf("hello world");  

왜냐하면 프로그램에서 Hello World만 인쇄했을 뿐 변수 a는 사용되지 않았기 때문에 컴파일러가 때때로 그것을 최적화시켰기 때문에 프로그램은 다음과 같이 변했다.
 
왜 레지스터를 조작할 때, 왜volatile을 넣었는지 알겠지,
프로그램은 때때로 레지스터를 조작하는 것이 프로그램에 영향을 미치지 않는다고 생각하지만, 우리는 설정을 해야 한다. 이럴 때 이volatile를 추가하여 최적화를 방지한다.
 
 
 
 

  
  
  
  
  1. //  
  2. main()  
  3. {   
  4.     printf("hello world");  

좋은 웹페이지 즐겨찾기