2016-08-16 1 views
-2

내에서 C 배열 편집 :내가이 일을하려고하고 함수

int a[5]; 
foo(){ 
    a[1]=7; 
} 
void main(){ 
    foo(); 
    //At this point, I want the value in a[1] to be equal to 7 
} 

을 내 응용 프로그램에서 가능하지 않은 기능 fooa을 통과하지 않고 C에서이 일을 어떤 방법이 있나요 (마이크로 컨트롤러의 인터럽트 핸들러).

+0

@chux 감사합니다. 그것은 오타였습니다. 그래도 문제는 여전히 남아 있습니다. – SamuelMacleod

+1

뭐하는거야? 전역 변수는 게임의 이름입니다. – KevinDTimm

+3

코드는 모두 준비가되어 있습니다 - _unresolved_ 문제는 무엇입니까? – chux

답변

3

글로벌 배열 a가 인터럽트 제어 루틴에서 변경되는 경우로 정의한다 :

volatile int a[5]; 

volatile 프로그램의 실행 중에 배열 요소 예 인해위한 비동기 변경할 수있는 컴파일러에 지시 인터럽트 서비스 루틴에 의해 또는 메모리 위치가 일부 외부 이벤트에 따라 값이 변경 될 수있는 하드웨어 레지스터이기 때문에 수정 될 수 있습니다. 이러한 변수에 대한 액세스는 컴파일러가 마지막으로 작성된 이후 수정되지 않은 경우 컴파일러가 종종 값에 대해 유효한 가정을 할 수있는 일반 변수와 달리 코드에 지정된 변수를 읽거나 쓰는 코드를 항상 생성해야합니다.

또한 전역 변수에 짧은 의미없는 이름을 사용하지 않는 것이 좋습니다.

또한 foomain의 프로토 타입이 잘못되었습니다. 그들은 다음과 같이 정의되어야합니다 :

void foo(void) { 
    a[1] = 7; 
} 
int main(void) { 
    foo(); 
    // At this point, I want the value in a[1] to be equal to 7 
    // ...more code 
} 
+1

당신은 그에게 chqrlie를 말합니다. 일류 프로그래머들. –

+0

'volatile'은 원자 적 액세스를 보장하지 않습니다. 추가 조치가 없으면 여전히 유효하지 않은 결과가 발생할 수 있습니다. 최악의 경우 : 내부 타이밍에 따라 잠시 동안 만 발생할 수 있습니다. 'stdatomic'을 사용하거나 읽기와 쓰기가 올바르게 이루어 졌는지 확인하십시오. – Olaf

+0

@Olaf :'stdatomic.h '에 대한 전체 장은 C 표준에서 가장 모호한 부분 중 하나인데,'restrict' 또는 * effective type *에 대한 토론보다 훨씬 어려울 것 같습니다. * 나는 스킬 레벨을 의심합니다. 이 시점에서 OP의 '휘발성'이상이 호환됩니다. 바라건대 마이크로 컨트롤러는'int'에 원자 적으로 접근 할 수 있기를 바랍니다. 그렇지 않으면'char' 배열을 만들어 문제를 해결해야합니다. 우리는 순서가 맞지 않은 메모리 액세스로 여러 코어에서 실행되는 다중 트레드가 아니라 마이크로 컨트롤러상의 ISR에 대해 이야기하고 있습니다. – chqrlie

관련 문제