2009-07-08 2 views
6

ARM7에서 C로 프로그래밍 된 임베디드 애플리케이션 (이식성 요구 사항 포함)은 현재 상용 우선 순위 기반의 선점 형 RTOS를 사용하므로 고객 위임 사항 당 RTOS 및 모든 RTOS 종속성을 제거해야합니다. 우리는 많은 HW 인터페이스, 절전 모드, I2C 통신을 사용하는 8 가지 작업을 가지고 있습니다. RTOS없이 타이밍 요구 사항을 관리 할 수 ​​있지만 SW는 코드 단순화를 위해 RTOS 기능을 잘 사용합니다.RTOS 제거에서 명시 적 스택의 대안은 무엇입니까?

여러 곳에서 호출되는 루틴을 비롯한 여러 함수는 현재 I2C 드라이버 함수, 절전 명령문 등을 호출하는 일련의 차단을 구현합니다. I2C 호출/절전에서 폴링이 허용되지 않는다는 전제에 기반합니다 고객은 이러한 호출을 차단하지 않고 반환해야합니다. 문제는 I2C가 완료되거나 수면 시간이 경과했을 때 최상위 수준의 작업 항목에서 4 번 호출 될 수있는 "진술"에 "돌아 오는"것입니다.

나는 위에 간단한 스케줄러와 함께 각 작업에 대한 계층 적 상태 머신 디자인으로 수렴하고 있습니다. 그러나 여러 개의 루틴을 처리하는 데 사용되는 여러 개의 루틴은 각 호출마다 여러 개의 함수 호출 깊이에서 호출 될 수있는 상태 시스템이되며 각 태스크에 대해 명시 적 스택 기능이 필요합니다. 하위 상태 머신을 시작할 때마다 해당 프로세스의 상태를 할당하고 해당 상태의 "상태 스택"에 밀어 넣을 수 있습니다. 그러면 해당 작업에 대한 다음 스케줄러 호출이 모든 상태를 종료 할 수 있습니다. 계층 적 상태는 "중단 된"위치에서 계속 처리합니다.

문제에 적용 할 수있는 다른 디자인 아키텍처, 비 선점 패러다임으로 코드를 빠르게 이식 할 때 고려해야 할 사항 또는 생각이 풍부한 리소스와 "RTOS 제거"기술 및 디자인에 대한 토론을 볼 수 있습니까?


세 가지 대답은 모두 함께 다시 발명 바퀴를 방지하기 위해 상태 머신 기반의 개발 관련성과 관련 도구의 좋은 그림을 그릴. 우리 고객은 GPL을 포함한 어떤 종류의 라이센스도받지 않습니다. 답변을 통해 RTOS없이 계층 적 상태 머신을 사용하고 폴링 호출을 금지하려는 경우 캐싱 상태를 둘러 볼 방법이없는 것으로 보입니다. 계층 적 SM은 구조를 보존하여 기존 코드를 이식하는 데 도움이되므로 (루틴에 대한 함수 호출은 하위 상태 시스템 호출), 필자는 제공된 도구를 좋은 예제로 사용하여 이러한 방식으로 진행할 것입니다. - 감사.

답변

4

IARvisualState과 같은 도구를 사용하면 별도의 스택없이 계층 적 상태 시스템에 대한 코드를 생성 할 수 있습니다. 좀 덜 효율적이고 기능이 적으며 예쁜 UML StateChart 그림을 지원하지 않는 공짜 물건 SMC이 있습니다.

스위치 상태 및 정적 변수를 사용하여 코드 상태 머신을 함수로 전달하여 상태를 유지할 수도 있습니다.

C 매크로를 사용하여 가벼운 상태 기반의 가상 스레딩 라이브러리가 있습니다. 체크 아웃 protothreads

3

Miro Samek의 Quantum programming framework을 살펴볼 것을 적극 권장합니다. 그는 ARM7과 같은 많은 플랫폼에서 실행되는 가장 효율적인 HSM 중 하나를 가지고 있습니다. 그는 또한 여러분의 필요에 맞는 다양한 수준의 프레임 워크를 가지고 있습니다. Practical StateCharts in C/C++이라는 그의 책을 집어 넣을 것을 권합니다. 그는 C와 C++ 모두에 계층 적 상태 시스템을 가지고 있습니다. 이 프레임 워크의 장점은 UML 또는 상태 다이어그램에서 어느 정도 효율성을 가진 실제 코드로 이동하는 것이 어렵지 않다는 것입니다. 이 프레임 워크는 자체 스케줄러로 실행되거나 RTOS와 함께 사용됩니다.

저는 실제로 제 회사의 집에서 성장한 RTOS를 사용하여 C++로 자체 HSM을 구현했습니다. 나는 많은 Samek의 디자인 원칙을 사용했지만 GPL (무료 버전)과 상용 라이센스 가격 (비 GPL) 때문에 코드를 사용하지 않았습니다.

5

Adam Dunkels' Protothreads을 확인하셨습니까? 그는 "경량, C에서 스택리스 스레드"

보다는 호출을 다시 발명 바퀴를, 내가 직접 protothreads 사이트에서 조금 인용하겠습니다 인라인 (in-line) 여기 :

Protothreads 매우 가볍고 스택리스 스레드입니다 소형 임베디드 시스템 또는 무선 센서 네트워크 노드와 같이 심하게 메모리가 제한된 시스템 용으로 설계되었습니다. Protothreads는 C로 구현 된 이벤트 중심 시스템을위한 선형 코드 실행을 제공합니다. Protothreads는 블로킹 이벤트 핸들러를 제공하기 위해 기본 운영 체제의 유무에 관계없이 사용할 수 있습니다. Protothread는 복잡한 상태 머신이나 완전한 멀티 스레딩없이 순차적 인 제어 흐름을 제공합니다.

나는 Protothreads & Samek의 QP HSM을 사용했습니다. 이것은 중첩 도메인 문제에 대한 좋은 해결책입니다. 이것을 위해 나는 아마도 protothreads에 기대다.

상업용 RTOS를 삭제한다고 언급했습니다. 코드 공간, 비용, 엔지니어 학습 곡선, 성능 때문인지 궁금합니다. RTOS를 (많은) 자유 소프트웨어 중 하나로 대체 할 수 있습니까? 나는 생각하지 않지만 물어 보지 않는다.

P. Dunkels에는 또한 임베디드 개발자를위한 useful resources & software이 많이있는 멋진 웹 사이트가 있습니다. (Contiki, 프로토콜 스택 등)

1

나는 양자 프로그래밍 프레임 워크를 준비 중입니다!

관련 문제