2013-04-09 1 views
2

저는 마이크로 컨트롤러 C 프로그래밍의 초보자이며 중첩 루프를 사용할 때 몇 가지 문제가 있습니다. 다음은 내 C 코드에있는 샘플 구성입니다. 그것은 stop_value에 도달 아래로 올렸하면서 또한 특정 레지스터를 읽을 때까지 루프를 아래로 램프 : 문제는 나는 다음을 수행하려고, 기본적으로 이후C에서 중첩 루프를 다시 시작하는 가장 이상적인 방법은 무엇입니까?

// I am trying to ramp down the while loop 
while (i>= stop_value) 
{ 
    step_value = default_value; 
    R32(a particular register, content_register); 
    if (content_register = a_set_value) 
    { 
     if(step_value <= step_max) 
     { 
      step_value = step_value +1; 
      i=start_value; 
      continue; 
     } 
     if(step_value =step_max) 
     { 
      // do something; 
      break; 
     } 
    } 
    WR32(a particular register, content_reset_register); // resetting the register 
    i=i-1; 
} 

을 언급하고 있습니다. 레지스터에 정의 된 값이있는 경우 step_value < = step_max인지 확인하십시오. step_value가 < step_max이면 continue 문을 사용하여 while 루프를 재설정하고 i를 초기 시작 값으로 설정합니다. 이 시점에서 내 step_value는 기본 단계 값이 아니라 최신 값이어야합니다. 나는 step_value를 default_value로 초기화하기 때문에 위의 코드가 step_value에 대해 완전하지 않다는 것을 이해한다. (그래서, 어떻게 초기 step_value = default_value 문을 수정해야 루프가 실행될 때 처음에는 default_value가되고 이후에는 가장 최근의 것이된다. step_value?) 하지만 step_value가 내 step_max와 같으면 무언가를 수행하고 그 다음에 중단하십시오 (이 부분이 작동합니다!). 또한 continue 문을 사용하면 레지스터의 내용을 다시 설정해야합니다.

그래서, step_value가 step_max보다 작 으면 레지스터의 내용을 최신 step_value로 while 루프를 효과적으로 재설정하고 싶습니다. 답장을 보내 주셔서 감사합니다.

+0

@imonc 그 편집으로 참을성있게 잘 해냈습니다. :) –

+0

R32 읽기 레지스터가 '휘발성'으로 선언되어 컴파일러가 읽기를 최적화하지 않도록하십시오. 또한 =/== 아래와 같습니다. –

+0

_how 초기 루프가 실행될 때 initial_value = default_value 문을 수정하여 default_value와 그 이후의 가장 최신 step_value_를 갖습니다. 루프 위의'step_value = default_value'를 움직여서'i'와'continue'를 리셋하면 실행되지 않을 것입니다. – Shahbaz

답변

1

:

if(step_value <= step_max) 
    { 
     step_value = step_value +1; 
     i=start_value; 
     continue; 
    } 
    if(step_value =step_max) 
    { 
     // do something; 
     break; 
    } 

영원히 도달 할 수없는 경우 두 번째.< =을 확인한 다음 계속해서 루프의 맨 아래로 건너 뜁니다. 당신의 위의 논리에서

:

다음 확인 step_value < = step_max 경우. step_value가 < step_max이면 continue 문을 사용하여 while 루프를 재설정하고 i를 초기 시작 값으로 설정합니다.

그 코드는 아마 읽어야

if(step_value < step_max) 
    { 
     step_value = step_value +1; 
     i=start_value; 
     continue; 
    } 
    ... 

그런 다음 두 번째 평가 될 수 있다면. 도달 할 수없는 코드 및 if 문 내에서의 할당에 대해 미친 것처럼 컴파일러 경고를 생성해야합니다. 컴파일러 경고를 켜고 그들에 귀 기울여주십시오!

1

나는 다음과 같은 대안 중 하나 이상이 적용된다는 가정

먼저

, 언어 = C 에서하는 할당 된 값을 반환하고 그 값이 0 같지 않으면 true를 가정합니다의 할당은입니다. 따라서 대신 if 문에 ==을 사용해야합니다 (한 단계에서 if 문에서! = 0을 지정하고 확인하는 동작을 원하지 않는 한 -하지만이 경우에도 2 더 나은 유지 보수에 대한 단계), 즉 대신

if (content_register = a_set_value) 
    { 
      // your code 
    } 

의 나는

content_register = a_set_value; 
if (content_register!=0) 
    { 
      // your code 
    } 

당신이에 대해 확인하고 더 명확 무엇을하게 말할 것입니다. step_value==step_max 경우 (그리고 제대로 2 if에서 ==를 사용하는) 둘째

는 다음 두 IF를 당신이 원하는하지 않은, 실행됩니다. 그래서 당신은 <= 대신에 <을 의미한다고 가정합니다.

제 3의 우리 채팅에서 루프가 외부 스레드에서 오는 레지스터 변경을 기다리고 있다는 정보가 있습니다. 이 경우 루프는 너무 빨리 레지스터를 재설정하는 것입니다. 동기화를 고려하거나 적어도 다른 스레드가 레지스터를 변경할 수 있도록 레지스터를 재설정 한 후에 스레드를 추가하십시오.

변경하고 작동하는지 확인하십시오. 이 코드에서

+0

팁 주셔서 감사합니다. if 문을 조건에 따라 하나의 if 문만 실행하도록 수정했습니다. while 루프는 중지 값에 도달 할 때까지 계속 실행됩니다. 그러나 이것은 우리가 원하는 것이 아닙니다. 나는이 문제를 추측하고있다. 왜냐하면 레지스터의 내용이 모든 루프마다 리셋되고 루프가 stop_value까지 실행되기 때문이다. – theHermes

+0

필자는 이것을 더 잘 이해하기 위해 R32와 WR32의 기능을 설명 할 필요가 있다고 생각합니다. R32는 읽기 용이고 WR32는 쓰기 용이라고 가정합니다. 이 레지스터를 설정하기위한 외부 작업을 기다리고 있습니까? 이 경우에 각 반복마다 동일한 레지스터를 재설정하면 재설정이 너무 빠르기 때문에 외부 작업이이를 업데이트 할 시간이 없습니다. 다른 작업이 값을 업데이트 할 수있게하려면 재설정 후에 절전 모드 명령을 사용해야합니다. 그러나 더 나은 접근 방법은 작업을 동기화하기 위해 세마포 또는 모니터를 사용하는 것입니다. – Matt

+0

예, R32는 읽기 기능이며 WR32는 쓰기 용이며 내용을 읽습니다 (올바른 내용이 기록되었는지 확인). 예,이 레지스터를 설정하는 외부 태스크를 기다리고 있습니다. 실제로 리셋 가능성이 너무 빠르다고 생각했기 때문에 충분한 시간을 허용하기 위해 더미 루프를 만들었습니다. – theHermes

관련 문제