2014-11-09 4 views
0

간단한 함수를 만드는 방법은 암 플랫폼에서 문자열을 반환합니까?Ada + Fixed Stringss + Stm32 Arm

procedure Main is function tst_func return String is begin return "string"; end tst_func; str : String := tst_func; -- <-- Doesnt work, runtime error. -- Adacore gpl compiller, crossdev, arm elf hosted of win os. -- Hardware is smt32f407 discovery board. begin ...

+0

Say WHAT ??????? –

+0

고정 길이 문자열을 반환하는 함수로 시도하십시오 (예 : 'string (1 .. 6)'을 사용합니다. 작동한다면 RTS가 보조 스택을 지원하지 않을 수 있습니다. 보조 스택은 제한되지 않은 배열을 반환하는 데 사용됩니다. –

+0

@Brian Drummond, 예, 그 작품. 하드웨어 또는 소프트웨어 문제입니까? 내가 그걸로 뭔가 할 수 있을까? – Jamshoot

답변

2

문제는 런타임 시스템의 버그입니다. 프로그램에 작업이 포함되어 있지 않으면 환경 작업의 보조 스택이 제대로 설정되지 않아 함수가 문자열을 반환하려고 시도 할 때 보조 스택을 생각할 때 소진되어 Storage_Error가 발생합니다.

나는 AdaCore이를보고 : 자신의 추천 메인 프로그램에서

delay until Ada.Real_Time.Clock; 

을 포함하는 것이었다.

버그는 다음 GNAT GPL 릴리스에서 해결 될 것입니다.

+0

아마도 이것은 RTS가 올바르게 설정하기위한 노력의 결과 일뿐입니다. –

+0

브라이언, 예. 지금 RTS에 대한 간단한 수정을 제안하면서 AdaCore에보고했습니다. –

+0

AdaCore도이 작업장을 제안합니다.이 코드는 이미 수정되었으며 다음 GNAT GPL 릴리스에서 우리에게 공개 될 것입니다. 나는 그것이 FSF GCC 5.0에서 끝날지 모른다 (아직 없다!). –

2
문제는 여기의 STM32 (ARM 코어 텍스) 또는 종종 타협을 포함 액텔 AVR 또는 TI MSP430 같은 작은 임베디드 CPU에서 에이다를 사용하여 플랫폼에서 실행 할 수 않을 수 있기 때문에 것 같다

태스킹 같은 것들을 포함하는 완전한 Ada RTS (Runtime System).

대신 최소한의 RTS가 pragma에 의해 지정되거나 작업을 지원하지 않는 경우 또는이 경우 보조 스택이 필요한 기능과 함께 제공 될 수 있습니다. Funnily만큼, AVR에 대한 RTS는 을 구현하는 s-secsta.ads,.adb 파일을 포함하므로 더 강력한 STm32가이를 가능하게해야합니다. Adacore GPL 패키지와 함께 제공된 RTS 소스를보고 이러한 파일이 있는지 여부를 확인할 수 있습니다.

옵션이 있습니다.

1) 고정 길이 문자열 또는 문자열 상수 테이블을 사용하거나 힙에 할당 된 문자열에 access String (즉 포인터)을 반환하여 작업하십시오. 임베디드 프로그래밍에는 일반적으로 권장되지 않습니다.

2) 더 나은 RTS를 찾으십시오. 컴파일러에 -RTS=... 인수를 제공하여 다른 RTS에 대해 컴파일하고 링크 할 수 있습니다. Here is a thread이 CPU에 대한 대체 RTS 전략을 논의합니다.

+1

AdaCore GPL ARM 컴파일러와 함께 제공된 RTS는 Ravenscar 프로필 ([ARM D.13] (http://www.ada-auth.org/standards/12rm/html/RM-D-13.html)) 만 지원합니다. 'No_Implicit_Heap_Allocations' - 즉, GNAT에는 2 차 스택이 없습니다. –

+0

감사합니다. Simon, 저는 아직 컴파일러를 시도하지 않았기 때문에 손에 넣을 정보가 없었습니다. –

+1

실제로 Brian, RTS는 2 차 스택을 가지고 있으며 'No_Implicit_Heap_Allocations'을 위반하지 않습니다 (아마도 "스택"이라는 단어와 관련이 있습니다). 하지만 Jamshoot이 말한 것처럼 프로그램이 충돌합니다. –