레지스터 설정에 대한 이해
- volatile unsigned long *gpmcon = (volatile unsigned long*)0x7F008820;
-
- *gpmcon = 0x1111;
어떤 때는 좀 흐리멍덩해서 잘 이해하지 못할 때가 있다.
그렇다면 우리는 이렇게 이해한다.
보아하니
- int a;
- a = 1;
이것은 아주 간단하게 a를 정의하여 a를 1로 한다
자, 계속 봅시다.
- int a;
- int *p;
-
- p = &a;
- *p = 1;
여기에 우리는 포인터를 정의하여 a의 주소를 p에게 부여한 다음에 p에 값을 부여했다. 이곳의 효과는 똑같다. 모두 a에 값을 부여했다.
네, 간소화해 주세요.
- int a;
- int *p = &a; // p =
- *p = 1;
여기서 알아야 할 것은,*p는 값을 부여하는 어떤 주소입니다.
예를 들어 현재 우리의 주소는 0x7F008820이다
자, 그럼 우리는 지금 이렇게 쓸 수 있다.
- int *p = 0x7F008820;
- *p = 0x1111;
컴파일러 경고 유형이 일치하지 않도록 하려면 유형 변환을 추가합니다.
- int *p = (int *)0x7F008820;
- *p = 0x1111;
네, 여기까지 이해했습니다. 원래의 것으로 돌아가서 int를 unsigned long으로 수정합니다.
그러면 저희가 얻었습니다.
- unsigned long *gpmcon = (unsigned long*)0x7F008820;
-
- *gpmcon = 0x1111;
이제 우리가 원하는 표현식을 얻었으니, 여기에volatile가 하나 더 없어졌다.
이거 컴파일러 최적화 방지예요.
다음 절차를 보면 알 수 있습니다.
- //
- main()
- {
- int a;
- a = 1;
- printf("hello world");
- }
왜냐하면 프로그램에서 Hello World만 인쇄했을 뿐 변수 a는 사용되지 않았기 때문에 컴파일러가 때때로 그것을 최적화시켰기 때문에 프로그램은 다음과 같이 변했다.
왜 레지스터를 조작할 때, 왜volatile을 넣었는지 알겠지,
프로그램은 때때로 레지스터를 조작하는 것이 프로그램에 영향을 미치지 않는다고 생각하지만, 우리는 설정을 해야 한다. 이럴 때 이volatile를 추가하여 최적화를 방지한다.
- //
- main()
- {
- printf("hello world");
- }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java의 Volatile 키워드에 대한 이해1,volatile,synchronized가 없는 경우 출력 결과: 8, 9, 10이 모두 나타났습니다.많이 운행하고 많이 해 보면 다른 결과를 발견할 수 있다. 우리가 설명하고자 하는 것은 스레드 I의 문장 (1)...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.