내에서 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
}
을 내 응용 프로그램에서 가능하지 않은 기능 foo
에 a
을 통과하지 않고 C에서이 일을 어떤 방법이 있나요 (마이크로 컨트롤러의 인터럽트 핸들러).
내에서 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
}
을 내 응용 프로그램에서 가능하지 않은 기능 foo
에 a
을 통과하지 않고 C에서이 일을 어떤 방법이 있나요 (마이크로 컨트롤러의 인터럽트 핸들러).
글로벌 배열 a
가 인터럽트 제어 루틴에서 변경되는 경우로 정의한다 :
volatile int a[5];
volatile
프로그램의 실행 중에 배열 요소 예 인해위한 비동기 변경할 수있는 컴파일러에 지시 인터럽트 서비스 루틴에 의해 또는 메모리 위치가 일부 외부 이벤트에 따라 값이 변경 될 수있는 하드웨어 레지스터이기 때문에 수정 될 수 있습니다. 이러한 변수에 대한 액세스는 컴파일러가 마지막으로 작성된 이후 수정되지 않은 경우 컴파일러가 종종 값에 대해 유효한 가정을 할 수있는 일반 변수와 달리 코드에 지정된 변수를 읽거나 쓰는 코드를 항상 생성해야합니다.
또한 전역 변수에 짧은 의미없는 이름을 사용하지 않는 것이 좋습니다.
또한 foo
및 main
의 프로토 타입이 잘못되었습니다. 그들은 다음과 같이 정의되어야합니다 :
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
}
당신은 그에게 chqrlie를 말합니다. 일류 프로그래머들. –
'volatile'은 원자 적 액세스를 보장하지 않습니다. 추가 조치가 없으면 여전히 유효하지 않은 결과가 발생할 수 있습니다. 최악의 경우 : 내부 타이밍에 따라 잠시 동안 만 발생할 수 있습니다. 'stdatomic'을 사용하거나 읽기와 쓰기가 올바르게 이루어 졌는지 확인하십시오. – Olaf
@Olaf :'stdatomic.h '에 대한 전체 장은 C 표준에서 가장 모호한 부분 중 하나인데,'restrict' 또는 * effective type *에 대한 토론보다 훨씬 어려울 것 같습니다. * 나는 스킬 레벨을 의심합니다. 이 시점에서 OP의 '휘발성'이상이 호환됩니다. 바라건대 마이크로 컨트롤러는'int'에 원자 적으로 접근 할 수 있기를 바랍니다. 그렇지 않으면'char' 배열을 만들어 문제를 해결해야합니다. 우리는 순서가 맞지 않은 메모리 액세스로 여러 코어에서 실행되는 다중 트레드가 아니라 마이크로 컨트롤러상의 ISR에 대해 이야기하고 있습니다. – chqrlie
@chux 감사합니다. 그것은 오타였습니다. 그래도 문제는 여전히 남아 있습니다. – SamuelMacleod
뭐하는거야? 전역 변수는 게임의 이름입니다. – KevinDTimm
코드는 모두 준비가되어 있습니다 - _unresolved_ 문제는 무엇입니까? – chux