2012-10-25 4 views
7

임베디드 시스템 (Cortex M3)을 개발하고 있습니다. 일부 데이터를 장치에서 직렬 포트로 보내려면 (PC 화면에 표시하기 위해) putchar() 메서드를 사용하여 자체 함수를 사용합니다. C에서 sprintf() 대신 모든 함수가 사용됩니까? 컴파일 후 코드 크기가 너무 크다

내가 정수 또는 플로트를 보낼

, 나는 문자의 문자열로 변환하기 위해 sprintf와()를 사용하여 직렬 포트로 전송.

이제 Keil uVision IDE를 사용하고 있으며 최대 32KB의 제한된 버전입니다. 다른 함수에서 sprintf()를 호출 할 때마다 컴파일 후의 코드 크기가 너무 커진 이유를 알 수 없습니다. 저는 지금 32KB를 넘어 섰고, 제 기능을 일부 변경하고 sprintf 대신 다른 것을 사용해야 만합니다!

단서가 있습니까?

+7

런타임 라이브러리 구성 요소가 대부분의 경우 상당히 크고 느리기 때문에 'float'을 피하십시오. – glglgl

+1

printf 패밀리는 부동 소수점을 구현하는 데 필요한 많은 양의 코드로 인해 매우 비쌉니다. 정수 printf는 작은 양이지만 여전히 값 비싸다. 임베디드 마이크로 컨트롤러 코드에서 printf()가 필요하다고 생각하십니까? 자신 만의 훨씬 저렴한 솔루션을 구현할 수 있습니다. –

+0

또한 사용 가능한 컴파일러 공급 업체를 살펴보십시오. 종종 기능이 축소 된 C 라이브러리의 여러 가지 맛이 있습니다. 예를 들어 int를 처리하고 과학 표기법을 사용하지 않는 sprintf입니다. –

답변

0

itoa() 또는 ftoa()을 시도해보고 요구 사항을 구현할 수 있습니다. 즉, 정의 자체 안에있는 문자로 바로 변환하기 때문에 putchar()을 사용하여 직접 인쇄 할 수 있습니다.

이것이 효과가 있다고 생각합니다.

+3

C 언어에는 itoa 또는 ftoa라는 함수가 없습니다. – Lundin

+0

@ Lundin : 요구 사항을 작성할 수 있습니다 ... 또는이 파일을 포함 할 수 있습니다 ... itoa 및 ftoa는이 헤더 파일에 있습니다. 또는 Omkant

+0

itoa() 및 ftoi()가 C에 없습니다 (나도 몰라요. – Django

6

효율적이기를 원하면 가장 좋은 방법은 직접 코드를 작성하거나 이미 인터넷에 코드를 작성하는 것입니다. Int를 문자열로 변환하는 것은 매우 간단하지만 모든 프로그래머는 30 분 이내에 작성할 수 있습니다. 부동 소수점을 문자열로 변환하는 것은 좀 더 복잡하며 사용 된 부동 소수점 형식에 따라 다릅니다. 편의를 위해

, 여기에 마이크로 컨트롤러 응용 프로그램에서 사용할 수있는 간단한 INT를 문자열로 알고리즘 : 나 자신을 사용한 어느 것도

void get_dec_str (uint8_t* str, size_t len, uint32_t val) 
{ 
    uint8_t i; 
    for(i=1; i<=len; i++) 
    { 
    str[len-i] = (uint8_t) ((val % 10UL) + '0'); 
    val/=10; 
    } 

    str[i-1] = '\0'; 
} 
+2

마이크로가 하드웨어 디바이더 ... (또는 모듈러스)를 가지고 있지 않다면 그렇게 빠르고 강력합니다. 내 머리 꼭대기에서 더 좋은 옵션은 없지만! –

+3

@MartinThompson 많은 사람들이 할 수있는 일은 잘 모르겠다. 십진법은 10 가지이지만, 컴퓨터는 2/4/8/16/32 기반을 선호한다. 게다가 나는 컴파일러에 최적화를 남기고 싶다. – Lundin

+1

공정한 코멘트 : 컴파일러에 최적화를 맡기기 –

9

두 잠재적 인 제품 (- 내 컴파일러 공급 업체는 일반적으로 공급 다운 제거 임베디드 사용)에 대한 printf :

http://eprintf.sourceforge.net/은 - [년 9 월 2017 : 불행히도, 멀리 갈 것 같다,하지만 여전히 여기에 소스 코드 : https://sourceforge.net/projects/eprintf/files/]

http://www.sparetimelabs.com/tinyprintf/index.html - 2 파일, 약 1.4KB 코드. 'longs'를 활성화하는 옵션 (더 많은 코드 크기를 의미). 선행 제로 및 필드 너비를 지원합니다. 부동 소수점 지원이 없습니다.

+1

'eprintf' 웹 페이지에는 실제 코드에 대한 링크가 없으므로 다음은 sourceforge eprintf 프로젝트에 대한 링크입니다 : http://sourceforge.net/projects/eprintf/ –

+0

링크가 질문에 대답 할 수 있습니다. 여기에 답변의 핵심 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. - [리뷰에서] (리뷰/저품절 포스트/17459102) – StoryTeller

+0

@StoryTeller - 일반적으로 동의 하겠지만 링크가 사라지면 콘텐츠 요약이 도움이되는지 확신 할 수 없습니다 (그 (것)들은있다 :(- 나는 다만 진실한 "응답"보다는 오히려 소스 코드에 연결을 다만 제안하고있다. –