• Home
  • Tag
  • LocationLog
  • Guestbook
  • Admin
  • Write
블로그 이미지

감사합니다.

안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday
Tistory 로고 이미지 티스토리 가입하기!
태그 : 지역로그
방명록 : 관리자 : 글쓰기
Blog is powered
by Daum /
Designed by Tistory
RSS FEED

달력

« » 2025.6
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

공지사항

태그목록

  • 이유
  • 갤럭시
  • 경제
  • 맛집
  • C
  • GCC
  • 방법
  • 개선
  • 자바스크립트
  • XP
  • 비교
  • 어린이
  • 핸드폰
  • 정부
  • 문제
  • 제천
  • 매실
  • 공무원
  • 윈도우
  • 레고
  • 대통령
  • arm
  • 광고
  • 옥션
  • 문재인
  • 프로그램
  • 개발
  • 안드로이드
  • pcb
  • 에러

최근에 올라온 글

'C'에 해당되는 글 15건

  1. 2017.01.22 C언어 - 안전한 코딩 방법
  2. 2016.12.06 #ifdef _DEBUG 디버그 매크로 사용법
  3. 2016.12.05 ARM Cortex-Bit-banding
  4. 2016.09.22 C언어 - 노드가 먼가요?
  5. 2016.09.20 프로그래밍 - 고정소수점 연산
  6. 2016.09.20 프로그래밍 - 실수연산 오차문제
  7. 2016.09.20 warning C4027: function declared without formal parameter list
  8. 2016.09.19 error C2104: '&' on bit field ignored
  9. 2016.09.09 gcc hex, bin file size 줄이기
  10. 2016.09.01 MFC - WS_VSCROLL, WS_HSCROLL 은 언제 생길까?

C언어 - 안전한 코딩 방법

C언어,ARM / 2017. 1. 22. 23:30

CERT-C : c, c++ , Java, android  등에 대한 권고 사항

MISRA-C : 자동차, 항공, 우주 통신 분야

JSF c++ standard : 전투기, 폭격기 등 미영 항공기 


C언어는 코딩방법에 따라, 컴파일러마다 다른 결과가 나올 수 있다.(코드 작성의 모호성)
이를 사전에 방지하기위한 지침서 이다.

행정자치부

시큐어코딩가이드(C, Java)

작성일 : 2014-05-27 작성자 : 정보기반보호과 / 최은주 / 2100-3969 조회수 : 31571
SW를 개발하실때 참조하실 수 있는 시큐어코딩(SW개발보안) 언어별 가이드입니다.
첨부파일
  • 첨부파일 C_시큐어코딩_가이드.pdf [3.9 MB]
  • 첨부파일 JAVA_시큐어코딩_가이드.pdf [5.4 MB]





MISRA-C:2004 Guidelines for the use of the C language in critical systems

관련 자료는 유료이다.

ISO/IEC 9899:TC2


안전한 C 프로그램을 위한 코딩 표준 


201106 OWASP 시큐어코딩규칙 참고 가이드.pdf



 "MISRA-C"의 초판, "Guidelines for the use of the C language in vehicle based software"은 1998년에 출간되었으며, 공식적으로 MISRA-C:1998 로 알려져 있다.

Misra c - 위키백과, 우리 모두의 백과사전

https://ko.wikipedia.org/wiki/Misra_c
사용자 의견
이 결과에 관한 정보 • 

Misra c - 위키백과, 우리 모두의 백과사전

https://ko.wikipedia.org/wiki/Misra_c
"MISRA-C" 는 MISRA(Motor Industry Software Reliability Association)에서 개발된 C 프로그래밍에 대한 개발 표준이다. "MISRA-C"의 목적은 ISO C 언어로 작성된 ...

MISRA C - Wikipedia

https://en.wikipedia.org/wiki/MISRA_C
이 페이지 번역하기
MISRA C is a set of software development guidelines for the C programming language developed by MISRA Its aims are to facilitate code safety, security, ...

MISRA-C : 안전한 C 프로그래밍의 코딩 표준 - Wisedog's Lifelog

story.wisedog.net/misra-c-안전한-c-프로그래밍의-코딩-표준/
2013. 9. 10. - 안전한 C 프로그래밍의 코딩 표준인 MISRA-C 에 대한 글입니다. 안전하고 신뢰성있는 C프로그램을 개발하기 위한 프로그래밍 규칙을 정의한 코딩 ...

MISRA-C를 이용한 안전한 코드 작성 - TRACE32

trace32.com/wiki/index.php/MISRA-C를_이용한_안전한_코드_작성
2016. 1. 4. - MISRA-C가 제안된 목적은 C 언어의 모호성으로부터 비롯됩니다. C 언어는 표준을 기반으로 컴파일러가 제작됩니다. 그런데, 이 표준에는 모호한 ...

MISRA - The Motor Industry Software Reliability Association

https://www.misra.org.uk/
이 페이지 번역하기
Gives assistance in applying, developing safe, reliable software embedded in vehicle control systems. Home of MISRA C guidelines, to be adopted by whole ...

MISRA C++

https://www.misra.org.uk/?TabId=171
이 페이지 번역하기
In the beginning "C" was considered unsuitable for safety critical and safety related systems, however, it was so used ... In 1998, as a response to this situation, ...

MISRA C:2012

www.misra.org.uk/MC2012
이 페이지 번역하기
2013. 3. 22. - MISRA is very pleased to announce today that the next edition of MISRA C Guidelines for the use of the C language in critical systems, to be ...

MISRA Web site > Publications

https://www.misra.org.uk/Publications/.../Default.asp...
이 페이지 번역하기
MISRA C:2012 Addendum 2(으)로 이동 - MISRA C:2012 - Addendum 2: Coverage of MISRA C:2012 against ISO/IEC TS 17961:2013 "C Secure", ISBN ...

[PDF]MISRA-C:2004 - Guidelines for the use of the C language in critical ...

caxapa.ru/thumbs/468328/misra-c-2004.pdf
이 페이지 번역하기
“MISRA”, “MISRA C” and the triangle logo are registered trademarks of MIRA ... In presenting MISRA-C:2004, we have attempted to refine the document in a ...

[PDF]PRQA, MISRA C 지원 독보적 툴 벤더 - MDS테크놀로지

www.mdstec.com/.../MISRA%20C_PRQA_Frank_Automotive_130710....
MISRA C는 포드와 로버가 협력해. 탄생시켰습니다. 이들은 소프트웨어의 공통 규. 칙을 준수하고 코드를 공유하는 것을 목표로. 코딩 표준을 만들었습니다. MISRA C ...



검색결과

[PDF]ISO/IEC 9899 - Programming languages - C - Open-std.org

www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
WG14/N1124. Committee Draft — May 6, 2005. ISO/IEC 9899:TC2. 6.10.7 Null directive . . . . . . . . . . . . . . . . . . . . 160. 6.10.8 Predefined macro names.

ISO/IEC 9899:1990 - Programming languages -- C

www.iso.org/cate/d17782.html
이 페이지 번역하기
2011. 12. 5. - ISO/IEC 9899:1990.. Subscribe to updates ... Status: Withdrawn, Stage: 95.99 (1999-12-16). TC/SC: ISO/IEC JTC 1/SC 22, Number of Pages: ...

[PDF]ISO/IEC 9899:1999(E) -- Programming Languages -- C

www.dii.uchile.cl/~daespino/files/Iso_C_1999_definition.pdf
ISO/IEC 9899:1990, as amended and corrected by. ISO/IEC 9899/COR1:1994,. ISO/IEC 9899/AMD1:1995, and. ISO/IEC 9899/COR2:1996. Major changes from ...

C99 - 위키백과, 우리 모두의 백과사전

https://ko.wikipedia.org/wiki/C99
C99는 C 언어의 현대 개정판이자, C 언어 표준의 과거판인 ISO/IEC 9899:1999의 비공식 이름이다. 목차. [숨기기]. 1 역사; 2 새로운 기능; 3 C90과의 하위 호환성 ...

The Standard - C

www.iso-9899.info/wiki/The_Standard
이 페이지 번역하기
2016. 8. 30. - The current revision is ISO/IEC 9899:2011 -- also called C11 and until ... (aka C89),ISO/IEC 9899:1990 (aka C90), ISO/IEC 9899:1990/AMD ...

[PDF]C90 (ISO 9899:90) - Coding Guidelines

www.coding-guidelines.com/cbook/c90c++.pdf
A Economic 저술 - ‎2002 - ‎관련 학술자료
2005. 8. 5. - C90 was the first version of the C Standard, known as ISO/IEC 9899:1990(E) (Ritchie[3] gives a history of prestandard development). It has now ...


저작자표시 비영리 변경금지 (새창열림)

'C언어,ARM' 카테고리의 다른 글

warning missing prototypes, missing declarations  (0) 2019.04.27
warning: function declaration isn't a prototype  (0) 2019.04.27
C언어 - 컴파일러 코드 최적화 방법 분석  (0) 2017.01.21
gcc 컴파일러 옵션 -iprefix  (0) 2017.01.14
__INT_LEAST8_TYPE__ __INT_FAST8_TYPE__  (0) 2017.01.14
Posted by 안녕1999
, |

#ifdef _DEBUG 디버그 매크로 사용법

카테고리 없음 / 2016. 12. 6. 23:30

MicroSoft Visual Studio C++에서는 디버그(_DEBUG) 매크로를 지원합니다.
컴파일러에서 기본적으로 지원되지 않더라도, 사용자가 만들어 사용할 수 도 있습니다.

컴파일모드는 디버깅모드와 릴리즈모드가 있습니다.
(구분이 없는 컴파일러도 있을 수 있습니다.)

디버그 매크로에는 프로그램이 완성되어 출시될때, 포함되지 않는 "테스트코드, 개발중인 코드" 등이 들어가게 됩니다.

#ifdef _DEBUG

test_run_xxxx();

#endif 

프로그램 업그레이드, 개발중에 디버그 매크로안에 코드를 넣으면, 출시(릴리즈)할때, 디버깅 코드는 들어가지 않습니다.
이는, 개발/수정중에도, "급한/사소한 수정사항"이 발생했을때도, 테스트코드에 영향이 없는 배포(릴리즈)용 실행파일을 생성할 수 있습니다.

요약 : 테스트코드는 디버그 매크로안에 넣자.

저작자표시 비영리 변경금지 (새창열림)
Posted by 안녕1999
, |

ARM Cortex-Bit-banding

C언어,ARM / 2016. 12. 5. 23:30

주의:본문은 검증되지 않았습니다.


비트-밴딩(Bit-banding)

---------------------------------------------------------

- 메모리를 절약하기위해, BOOL같은 변수는 1비트만 사용할 수 있게 해주는 방식.

- C컴파일러의 bool, BOOL등은 int형등으로 컴파일이 된다.

- 1비트변수를 사용하려면, 아래 주소를 액세스해야한다.

  #define문을 사용하여 변수를 할당해야함을 의미한다.



실질적으로는 아래 그림과 같이 구성된다.

32비트 주소를 액세스하면, 1비트만 해당된다.


데이터쉬트등의 pdf문서에서는 아래와 같이 복잡한 수식(?)을 늘어 놓는다.

bit_word_offset = (byte_offset x 32) + (bit_number x 4) 

bit_word_addr = bit_band_base + bit_word_offset 


Bit-banding 메모리는 1Mbyte나 사용할 수 있으나, 실제로는 얼마되지 않는다.

내가 사용하는 칩은 얼마나 사용할 수 있을까?

STM32F205RCT6TR칩을 예로들어보면, 100k의 RAM을 가지고있다.

사실상 모든 RAM영역을 bit-banding하여 사용할 수 있음을 의미한다.


C언어로 변수할당하여 사용하는 변수와, C언어로 변수할당이 되었는지, 안되었는지 알 수 없는 RAM을 무작적, 직접 액세스할 수는 없다.

그래서, C언어로 bit-banding할 변수를 할당해놓고, 위의 복잡한(?)공식을 통해, RAM을 직접 액세스하면,

1비트단위로 액세스가 가능하다는 이야기이다.


C언어에서도 구조체(struct)로 1비트단위 액세스가 쉽게 된다.(struct bit field)

그러나, 이방식은 8~32비트에서 n비트만을 추출/삽입하는 코드가 들어간다.

그래서 비트필드 변수를 읽고, 쓰는작업은 느리다.

그러나, bit-banding을 사용하면, C언어의 비트필드보다 훨씬 더 빠르다는것이다.

(약 2~4배정도 빠를것으로 예상)


일단 비트밴딩할 변수를 할당하고, 해당 변수의 각 비트를 주소를 정해주어야 한다.

예) 아래는 예시이므로, 직접 확인해보기 바랍니다.

byte a;

#define RAM_START_ADDR    0x20000000

#define BIT_BANDING_START_ADDR    0x22000000

#define RAM_BIT_BANDING_GAP    (BIT_BANDING_START_ADDR-RAM_START_ADDR)

#define a0    (*(RAM_BIT_BANDING_GAP+((&a)-RAM_START_ADDR)*8+0))

#define a1    (*(RAM_BIT_BANDING_GAP+((&a)-RAM_START_ADDR)*8+1))

#define a2    (*(RAM_BIT_BANDING_GAP+((&a)-RAM_START_ADDR)*8+2))

...

#define a7    (*(RAM_BIT_BANDING_GAP+((&a)-RAM_START_ADDR)*8+7))


a=0;

a1=1;

if(a==0x02)

{

printf("OK");

}

else

{

printf("err");

}



문제점

---------------------------

- 크로스컴파일이 안된다?

  가능은 하다. 단, 실제변수 영역보다 8배 더 많은 영역을 비트-밴딩 영역으로 할당해야한다.

  또한, 일반변수 액세스와, 비트밴딩 변수 영역이 다르므로, 2가지 방식으로 액세스가 불가능하다.

  물론, 비트밴딩 함수/매크로를 만들어주면 되긴하다.

  그러나, 그렇게되면, 모든 변수의 대입에 함수를 사용해야하고,

  소스 코드가 너무 커지고, 복잡해지는 문제(?)가 발생한다.


cbi,sbi,gbi등을 이용한다면?

---------------------------------------------------------------------------

- cbi등의 매크로를 개조하여, 해당주소-비트의 bit-banding주소를 얻어서, 액세스하면, 쉽게 사용가능하다.

  또한 실제 동작코드도 작아지고(?), 속도도 매우 빨라지게 된다.

- 레지스터에는 적용할 수 없어, 속도가 떨어지는 문제가 발생한다.

아래는 예문 코드이므로, 동작하지 않습니다.

#define RAM_START_ADDR 0x20000000

#define BIT_BANDING_START_ADDR 0x22000000

#define BIT_BANDING_GAP (BIT_BANDING_START_ADDR-RAM_START_ADDR)

#define BIT_BAND8(a,i) *((byte*)(&(a)-RAM_START_ADDR+BIT_BANDING_START_ADDR)+(i))


#define sbi(a,i) BIT_BAND8(a,i)=1

#define cbi(a,i) BIT_BAND8(a,i)=0

#define gbi(a,i) BIT_BAND8(a,i) 



주변장치 액세스할때 bit-banding은?

------------------------------------------------------------------------------------------

한번에 원하는 비트를 on/off할 수 있어 좋으나,

한번에 여러비트를 설정해야하는 경우도 많다. 이경우에는 더 느릴 수 도 있다.


결론

----------------------

Bit-banding은 매우 훌륭한 기능이나, 

요즘 ARM Cortex칩들의 RAM이 부족하지는 않다.

과거의 8051이나, ATMega칩에 비해, 몇배나 더 많아졌다.

속도 또한 매우 빨라졌다.

굳이 bit-banding을 사용할 이유가 없다.

1) 메모리(RAM)가 정말 부족하고, 속도가 매우 중요한 경우

2) 속도가 매우 중요한 경우(주변장치 액세스)





가.정의 - 혼자 연구하는 C/C++ by WinApi

soen.kr/lecture/ccpp/cpp1/13-4-1.htm
비트 구조체는 비트들을 멤버로 가지는 구조체이며 비트 필드(bit field)라고도 부른다. 잘 알다시피 비트는 기억의 최소 단위이며 0 또는 1중 하나를 기억한다.

CLIEL LAB :: [C, C++] 비트필드(Bit Field)

lab.cliel.com › Programming › C C++
2010. 4. 27. - struct bitfield{ unsigned char a : 1; unsigned char b : 1; unsigned char c : 1; unsigned char d : 1; unsigned char e : 1; unsigned char f : 1;

C++ 비트 필드 - MSDN - Microsoft

https://msdn.microsoft.com/ko-kr/library/ewwyfdbe.aspx
Visual Studio 2017 RC에 대한 최신 설명서는 Visual Studio 2017 RC 설명서를 참조하세요. 클래스와구조체는 정수 형식보다 작은 저장 공간을 차지하는 멤버를 ...

C 비트 필드 - MSDN - Microsoft

https://msdn.microsoft.com/ko-kr/library/yszfawxh.aspx
구조체 또는 공용 구조체의 멤버에 대한 선언자 이외에, 구조체 선언자는 "비트 필드"라는 지정한 비트 수가 될 수 있습니다. 길이는 필드 이름의 선언자에서 콜론으로 ...

Bit Fields in C

https://www.tutorialspoint.com/.../c_bit_fields.htm
이 페이지 번역하기
Suppose your C program contains a number of TRUE/FALSE variables grouped in a structurecalled status, as follows − struct { unsigned int widthValidated; ...

비트필드 (Bit-field) - 프로그래밍 언어 - 골드피처

goldpitcher.co.kr/pages/viewpage.action?pageId=3715
2007. 11. 6. - 일반적인 구조체에서 구조체 구성요소는 C가 지원하는 데이터 형태로만 나누어지는데 비해 비트필드는 비트 단위로 구성요소를 나눌 수 있기 ...


저작자표시 비영리 변경금지 (새창열림)

'C언어,ARM' 카테고리의 다른 글

__INT_LEAST8_TYPE__ __INT_FAST8_TYPE__  (0) 2017.01.14
C언어 - 배열 값 대입 코드 비교  (0) 2016.12.16
임베디드 - AVR(ATMega) 개발환경 vs ARM cortex 개발환경 비교  (0) 2016.11.17
임베디드 디버깅, 개발을 위한 크로스컴파일 환경 구축  (0) 2016.11.02
gcc 링커스크립트 - 부트로더 주소지정 방법  (0) 2016.10.07
Posted by 안녕1999
, |

C언어 - 노드가 먼가요?

C언어,ARM / 2016. 9. 22. 23:30

C언어에서 노드는 그냥 포인터(주소)입니다.
간단한 그림으로 그리면, 아래에서 화살표를 "노드"라고 합니다.

(1번데이터)--->(2번데이터)---->(5번데이터)

포인터말고, 인덱스(순번)으로 프로그램하셔도 됩니다.

(C언어 이외의 프로그래밍언어가 주로 사용)


어떤 구조체(struct) 데이터가
"pre(이전)", "next(다음)" 포인터(노드)를 가지면, 2중 링크드 리스트가됩니다.

양방향으로 검색할 수 있습니다.


"next" 포인터(노드)만 가지면, 단일 링크드 리스트가 됩니다.

단방향으로만 검색이 가능합니다.

저작자표시 비영리 변경금지 (새창열림)

'C언어,ARM' 카테고리의 다른 글

ARM Coretex STM3 - UART 인터럽트 송신 버그(?)  (0) 2016.09.28
C언어를 잘하면, ATMega 프로그램도 잘 할 수 있나요?  (0) 2016.09.22
VC++ 6.0 크로스컴파일 디버깅  (0) 2016.09.22
warning: iteration 15u invokes undefined behavior [-Waggressive-loop-optimizations]  (0) 2016.09.22
프로그래밍 - 실수연산 오차문제  (0) 2016.09.20
Posted by 안녕1999
, |

프로그래밍 - 고정소수점 연산

카테고리 없음 / 2016. 9. 20. 23:30

고정소수점 연산은 소수점이 특정위치에 있다고 가정하고, 정수연산을 한 후, 특정위치에 소수점을 찍는 방식이다.


또는 모든 소수점에 특정값을 곱해서, 정수로 만든 후, 연산을 하고, 다시 원래대로 특정값으로 나누는 방식이다.(이 경우에는 오차가 커질 수도 있고, 불필요한 연산이 발생한다)


고정소수점은 q31, q15등의로 표시하는 경우가 많다.

q31은 32비트중 31비트가 소수점이라는 이야기 이다.

이는 최대값을 1.0으로 하여 계산하는 방식이다.

이 방식의 장점은 연산이 쉽다는 것이다.


고정소수점연산의 범위 정하는 방법

1) 부동소수점으로 계산하고, 각 단계별로, 각 변수의 최대, 최소값을 측정한다.

2) 각 단계별로, 해단 변수가 최대, 최소값을 넘어서지 않도록, 소수점 위치를 조정한다.


고정소수점 연산은 대부분 q31과 같이 획일적으로 계산한다.

이 경우, 작은 숫자와, 큰 숫자를 계산할 경우, 오차가 커지는 문제가 있다.

이럴 경우에는 각 단계별로 소수점위치를 조정하여, 더 정밀한 연산을 할 수 도 있다.

물론, 프로그래밍하는데, 더 많은 시간이 들어간다.


또한, 고정소수점의 곱셈이나 나눗셈에서, 두 숫자의 소수점자리를 고려해서, 양쪽의 소수점의 위치를 이동해서 계산하는 트릭도 유효하다.


고정소수점 라이브러리를 잘 작성해 놓으면,

#define 매크로 하나로, 부동소수점으로 바꿀 수 도 있고, 고정소수점연산으로 바꿀 수 도 있다.

이 경우, 모든 연산은 매크로 함수로 표현이 된다.


저작자표시 비영리 변경금지 (새창열림)
Posted by 안녕1999
, |

프로그래밍 - 실수연산 오차문제

C언어,ARM / 2016. 9. 20. 23:30

보통 C언어를 사용하여, float, doube등의 실수연산을 할 경우,

오차가 발생한다.


계산기로 간단히 계산하면,

2/3=0.666667

처럼 066666....인 숫자가 666667이 된다.

이값으로 다른 계산에 넣으면, 또 오차가 더 커진다.


대부분, 이작은 오차는 문제가 되지 않으나, 특정 연산에서는 중요한 문제가 된다.


원인은 컴퓨터가 다루는 실수는 이진수를 바탕으로하며, 소수점이하의 이진수는 나타낼 수 없는 값이 존재하기때문이다.


이를 해결하는 방법은 

1) 고정소수점연산을 사용

2) 연산순서를 재배치

    곱셈,덧셈,뺄셈부터 계산후, 마지막에 나눗셈


하는 방법이 있다.

물론, 위 2가지를 같이 사용하면, 더 정확해진다.


부동소수점은 실수표현범위가 넓으나, 정밀도는 떨어진다.

고정소수점은 실수 표현범위가 부동소수점에 비해 매우 좁으나, 정밀도는 부동소수점보다 정확하다.


부동소수점이나 고정소수점이나 모두 오차가 존재한다.

고정소수점이 오차가 비교적 적다.


고정소수점연산에서는 소수점을 몇자리로 할것인지를 결정해야한다.

표현하는 범위를 넘어서는 경우가 발생하면, 전혀 엉뚱한 결과가 나올 수 도 있다.

(부동 소수점은 범위에 상관없이 대부분, 오차는 있어도, 예상되는 결과가 나온다.)


고정소수점연산은 소수점자리를 정하는것이 가장 큰 일이다.


고정소수점연산은 컴퓨터에서 정수연산으로 처리가된다.

마이컴 같은 임베디드 CPU에서는 실수연산 회로가 없어, float, double연산을 하게되면,

에뮬레이션되어, 매우 느려진다.

PC에서는 부동소수점처리장치가 정수연산속도와 비슷하여, 대부분의 경우에는부동소수점으로 계산하는것이 좋다.


마이컴 같은 임베디드 CPU에서는 정수연산만을 사용하는 고정소수점형식으로 연산을 하면, 매우빠른 속도로 실수연산이 가능하다.


저작자표시 비영리 변경금지 (새창열림)

'C언어,ARM' 카테고리의 다른 글

VC++ 6.0 크로스컴파일 디버깅  (0) 2016.09.22
warning: iteration 15u invokes undefined behavior [-Waggressive-loop-optimizations]  (0) 2016.09.22
warning C4027: function declared without formal parameter list  (0) 2016.09.20
VC++ 6.0 으로 gcc 크로스 컴파일 환경 구축 방법  (0) 2016.09.09
STMicroelectronics HEX파일 gcc HEX파일 비교  (0) 2016.09.09
Posted by 안녕1999
, |

warning C4027: function declared without formal parameter list

C언어,ARM / 2016. 9. 20. 23:30

warning C4027: function declared without formal parameter list


C언어에서 동일한 함수명이나, 인자(파라메터)가 다른 함수가 존재할때 발생

(c++에서는 문제가 없다. 다른 함수로 구분됨.)

예)

void func1(int v);

void func1();

저작자표시 비영리 변경금지 (새창열림)

'C언어,ARM' 카테고리의 다른 글

warning: iteration 15u invokes undefined behavior [-Waggressive-loop-optimizations]  (0) 2016.09.22
프로그래밍 - 실수연산 오차문제  (0) 2016.09.20
VC++ 6.0 으로 gcc 크로스 컴파일 환경 구축 방법  (0) 2016.09.09
STMicroelectronics HEX파일 gcc HEX파일 비교  (0) 2016.09.09
gcc hex, bin file size 줄이기  (0) 2016.09.09
Posted by 안녕1999
, |

error C2104: '&' on bit field ignored

카테고리 없음 / 2016. 9. 19. 23:30

비트필드로 구성한 struct에서, 어느 1비트 데이터 변수의 주소를 얻으려고하니, 아래와 같은 에러가 발생하였다.


error C2104: '&' on bit field ignored



해결방법: 비트필드용 struct를 정의하고, 해당 비트필드 struct의 주소를 얻어서 사용한다.

예)

typedef struct

{

byte buse:1;

byte bPad:1;

byte bPlay:1;

}sBIT_FIELD_A;


typedef struct

{

sBIT_FIELD_A b;

...

}sXXXX;

 

단점 : 비트필드의 크기가 큰 경우 1바이트 이상의 데이터를 처리해야한다.


저작자표시 비영리 변경금지 (새창열림)
Posted by 안녕1999
, |

gcc hex, bin file size 줄이기

C언어,ARM / 2016. 9. 9. 23:30

임베디드용 프로그램은 컴파일된 코드사이즈가 작을 수 록 좋다.

보통 printf등의 함수를 사용하면, 수십kb 이상 파일크기가 증가한다.

약 68kbyte인 상태

=================
Generate binary file
Generate hex file
main.o  :
section               size         addr
.isr_vector            388    134217728
.text                67288    134218116
.eh_frame                4    134285404
.ARM                     8    134285408
.ARM.attributes         41            0
.init_array              8    134285416
.fini_array              4    134285424
.data                 1204    536870912
.jcr                     4    536872116
.fsmc_sram_data          0   1677721600
.fsmc_sram_bss           0   1677721600
.fsmc_sram_perma         0   1677721600
.bss                  2128    536872120
._user_heap_stack     1536    536874248
.factory_values          0    135264256
.debug_info         117485            0
.debug_abbrev         3591            0
.debug_loc          114940            0
.debug_aranges         176            0
.debug_ranges        21624            0
.debug_line          29503            0
.debug_str           20683            0
.comment               112            0
.debug_frame         14992            0
Total               395719
   text    data     bss     dec     hex filename
  67688    1220    3664   72572   11b7c main.o
 D 드라이브의 볼륨: D
 볼륨 일련 번호: 1473-2495
 D:\ARM\DP3000\DP3000 디렉터리
2016-09-09  오후 04:57            68,908 main.bin

printf함수대신, puts등을 여러번 사용하여 구현하기도 한다.

또는 %d, %s등만 구현이 되는 간단한 printf함수를 만들어 사용하기도 한다.


또한, printf, puts등에 사용된 문자열도 코드사이즈 증가에 한몫한다.

가는하면, 디버깅이 끝나면, 주석문으로 처리하는것이 좋다.



컴파일된 함수의 기계어 코드사이즈를 확인할 수 있는 방법

Usage: arm-none-eabi-objdump  
 Display information from object .
 At least one of the following switches must be given:
  -a, --archive-headers    Display archive header information
  -f, --file-headers       Display the contents of the overall file header
  -p, --private-headers    Display object format specific file header contents
  -P, --private=OPT,OPT... Display object format specific contents
  -h, --[section-]headers  Display the contents of the section headers
  -x, --all-headers        Display the contents of all headers
  -d, --disassemble        Display assembler contents of executable sections
  -D, --disassemble-all    Display assembler contents of all sections
  -S, --source             Intermix source code with disassembly
  -s, --full-contents      Display the full contents of all sections requested
  -g, --debugging          Display debug information in object file
  -e, --debugging-tags     Display debug information using ctags style
  -G, --stabs              Display (in raw form) any STABS info in the file
  -W[lLiaprmfFsoRt] or
  --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,
          =frames-interp,=str,=loc,=Ranges,=pubtypes,
          =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,
          =addr,=cu_index]
                           Display DWARF info in the file
  -t, --syms               Display the contents of the symbol table(s)
  -T, --dynamic-syms       Display the contents of the dynamic symbol table
  -r, --reloc              Display the relocation entries in the file
  -R, --dynamic-reloc      Display the dynamic relocation entries in the file
  @                  Read options from 
  -v, --version            Display this program's version number
  -i, --info               List object formats and architectures supported
  -H, --help               Display this information


arm-none-eabi-objdump -S -h -d main.o > ..\main.lst
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .isr_vector   00000184  08000000  08000000  00008000  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .text         000106d8  08000184  08000184  00008184  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .eh_frame     00000004  0801085c  0801085c  0001885c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .ARM          00000008  08010860  08010860  00018860  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .ARM.attributes 00000029  00000000  00000000  000204b8  2**0
                  CONTENTS, READONLY
  5 .init_array   00000008  08010868  08010868  00018868  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  6 .fini_array   00000004  08010870  08010870  00018870  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  7 .data         000004b4  20000000  08010874  00020000  2**3
                  CONTENTS, ALLOC, LOAD, DATA
  8 .jcr          00000004  200004b4  08010d28  000204b4  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  9 .fsmc_sram_data 00000000  64000000  64000000  000204e1  2**0
                  CONTENTS
 10 .fsmc_sram_bss 00000000  64000000  64000000  000204e1  2**0
                  CONTENTS
 11 .fsmc_sram_perma 00000000  64000000  64000000  000204e1  2**0
                  CONTENTS
 12 .bss          00000850  200004b8  200004b4  000204b8  2**2
                  ALLOC
 13 ._user_heap_stack 00000600  20000d08  2001fa00  00020d08  2**0
                  ALLOC
 14 .factory_values 00000000  080ff800  080ff800  000204e1  2**0
                  CONTENTS
 15 .debug_info   0001caed  00000000  00000000  000204e1  2**0
                  CONTENTS, READONLY, DEBUGGING
 16 .debug_abbrev 00000e07  00000000  00000000  0003cfce  2**0
                  CONTENTS, READONLY, DEBUGGING
 17 .debug_loc    0001c0fc  00000000  00000000  0003ddd5  2**0
                  CONTENTS, READONLY, DEBUGGING
 18 .debug_aranges 000000b0  00000000  00000000  00059ed8  2**3
                  CONTENTS, READONLY, DEBUGGING
 19 .debug_ranges 00005478  00000000  00000000  00059f88  2**3
                  CONTENTS, READONLY, DEBUGGING
 20 .debug_line   0000733f  00000000  00000000  0005f400  2**0
                  CONTENTS, READONLY, DEBUGGING
 21 .debug_str    000050cb  00000000  00000000  0006673f  2**0
                  CONTENTS, READONLY, DEBUGGING
 22 .comment      00000070  00000000  00000000  0006b80a  2**0
                  CONTENTS, READONLY
 23 .debug_frame  00003a90  00000000  00000000  0006b87c  2**2
                  CONTENTS, READONLY, DEBUGGING

Disassembly of section .text:

08000184 <__do_global_dtors_aux>:
 8000184:	b510      	push	{r4, lr}
 8000186:	4c05      	ldr	r4, [pc, #20]	; (800019c <__do_global_dtors_aux+0x18>)
 8000188:	7823      	ldrb	r3, [r4, #0]
 800018a:	b933      	cbnz	r3, 800019a <__do_global_dtors_aux+0x16>
 800018c:	4b04      	ldr	r3, [pc, #16]	; (80001a0 <__do_global_dtors_aux+0x1c>)
 800018e:	b113      	cbz	r3, 8000196 <__do_global_dtors_aux+0x12>
 8000190:	4804      	ldr	r0, [pc, #16]	; (80001a4 <__do_global_dtors_aux+0x20>)
 8000192:	f3af 8000 	nop.w
 8000196:	2301      	movs	r3, #1
 8000198:	7023      	strb	r3, [r4, #0]
 800019a:	bd10      	pop	{r4, pc}
 800019c:	200004b8 	.word	0x200004b8
 80001a0:	00000000 	.word	0x00000000
 80001a4:	0801085c 	.word	0x0801085c

080001a8 <frame_dummy>:
 80001a8:	4b08      	ldr	r3, [pc, #32]	; (80001cc <frame_dummy+0x24>)
 80001aa:	b510      	push	{r4, lr}
 80001ac:	b11b      	cbz	r3, 80001b6 <frame_dummy+0xe>
 80001ae:	4808      	ldr	r0, [pc, #32]	; (80001d0 <frame_dummy+0x28>)
 80001b0:	4908      	ldr	r1, [pc, #32]	; (80001d4 <frame_dummy+0x2c>)
 80001b2:	f3af 8000 	nop.w
 80001b6:	4808      	ldr	r0, [pc, #32]	; (80001d8 <frame_dummy+0x30>)
 80001b8:	6803      	ldr	r3, [r0, #0]
 80001ba:	b903      	cbnz	r3, 80001be <frame_dummy+0x16>
 80001bc:	bd10      	pop	{r4, pc}
 80001be:	4b07      	ldr	r3, [pc, #28]	; (80001dc <frame_dummy+0x34>)
 80001c0:	2b00      	cmp	r3, #0
 80001c2:	d0fb      	beq.n	80001bc <frame_dummy+0x14>
 80001c4:	e8bd 4010 	ldmia.w	sp!, {r4, lr}
 80001c8:	4718      	bx	r3
 80001ca:	bf00      	nop
 80001cc:	00000000 	.word	0x00000000
 80001d0:	0801085c 	.word	0x0801085c
 80001d4:	200004bc 	.word	0x200004bc
 80001d8:	200004b4 	.word	0x200004b4
 80001dc:	00000000 	.word	0x00000000

080001e0 <_mainCRTStartup>:
 80001e0:	4b15      	ldr	r3, [pc, #84]	; (8000238 <_mainCRTStartup+0x58>)
 80001e2:	2b00      	cmp	r3, #0
 80001e4:	bf08      	it	eq
 80001e6:	4b13      	ldreq	r3, [pc, #76]	; (8000234 <_mainCRTStartup+0x54>)
 80001e8:	469d      	mov	sp, r3
 80001ea:	f5a3 3a80 	sub.w	sl, r3, #65536	; 0x10000
 80001ee:	2100      	movs	r1, #0
 80001f0:	468b      	mov	fp, r1
 80001f2:	460f      	mov	r7, r1
 80001f4:	4813      	ldr	r0, [pc, #76]	; (8000244 <_mainCRTStartup+0x64>)
 80001f6:	4a14      	ldr	r2, [pc, #80]	; (8000248 <_mainCRTStartup+0x68>)
 80001f8:	1a12      	subs	r2, r2, r0
 80001fa:	f010 f819 	bl	8010230 <memset>
 80001fe:	4b0f      	ldr	r3, [pc, #60]	; (800023c <_mainCRTStartup+0x5c>)
 8000200:	2b00      	cmp	r3, #0
 8000202:	d000      	beq.n	8000206 <_mainCRTStartup+0x26>
 8000204:	4798      	blx	r3
 8000206:	4b0e      	ldr	r3, [pc, #56]	; (8000240 <_mainCRTStartup+0x60>)
 8000208:	2b00      	cmp	r3, #0
 800020a:	d000      	beq.n	800020e <_mainCRTStartup+0x2e>
 800020c:	4798      	blx	r3
 800020e:	2000      	movs	r0, #0
 8000210:	2100      	movs	r1, #0
 8000212:	0004      	movs	r4, r0
 8000214:	000d      	movs	r5, r1
 8000216:	480d      	ldr	r0, [pc, #52]	; (800024c <_mainCRTStartup+0x6c>)
 8000218:	2800      	cmp	r0, #0
 800021a:	d002      	beq.n	8000222 <_mainCRTStartup+0x42>
 800021c:	480c      	ldr	r0, [pc, #48]	; (8000250 <_mainCRTStartup+0x70>)
 800021e:	f010 f8f7 	bl	8010410 <atexit>
 8000222:	f00f ffdd 	bl	80101e0 <__libc_init_array>
 8000226:	0020      	movs	r0, r4
 8000228:	0029      	movs	r1, r5
 800022a:	f00f ff5d 	bl	80100e8 <main>
 800022e:	f00f ffc7 	bl	80101c0 <exit>
 8000232:	bf00      	nop
 8000234:	00080000 	.word	0x00080000
	...
 8000244:	200004b8 	.word	0x200004b8
 8000248:	20000d08 	.word	0x20000d08
 800024c:	08010411 	.word	0x08010411
 8000250:	0801041d 	.word	0x0801041d


symbol table에서 각 함수의 크기를 확인할 수 있다.

크기가 큰 함수나, 불필요한 함수는 제거하자.

arm-none-eabi-objdump -S -h -d -t main.o > ..\main.lst
SYMBOL TABLE:
08000000 l    d  .isr_vector	00000000 .isr_vector
08000184 l    d  .text	00000000 .text
0801085c l    d  .eh_frame	00000000 .eh_frame
08010860 l    d  .ARM	00000000 .ARM
00000000 l    d  .ARM.attributes	00000000 .ARM.attributes
08010868 l    d  .init_array	00000000 .init_array
08010870 l    d  .fini_array	00000000 .fini_array
20000000 l    d  .data	00000000 .data
200004b4 l    d  .jcr	00000000 .jcr
64000000 l    d  .fsmc_sram_data	00000000 .fsmc_sram_data
64000000 l    d  .fsmc_sram_bss	00000000 .fsmc_sram_bss
64000000 l    d  .fsmc_sram_perma	00000000 .fsmc_sram_perma
200004b8 l    d  .bss	00000000 .bss
20000d08 l    d  ._user_heap_stack	00000000 ._user_heap_stack
080ff800 l    d  .factory_values	00000000 .factory_values
00000000 l    d  .debug_info	00000000 .debug_info
00000000 l    d  .debug_abbrev	00000000 .debug_abbrev
00000000 l    d  .debug_loc	00000000 .debug_loc
00000000 l    d  .debug_aranges	00000000 .debug_aranges
00000000 l    d  .debug_ranges	00000000 .debug_ranges
00000000 l    d  .debug_line	00000000 .debug_line
00000000 l    d  .debug_str	00000000 .debug_str
00000000 l    d  .comment	00000000 .comment
00000000 l    d  .debug_frame	00000000 .debug_frame
00000000 l    df *ABS*	00000000 C:\DOCUME~1\a\LOCALS~1\Temp\ccG34aLa.o
08010184 l       .text	00000000 LoopCopyDataInit
0801017c l       .text	00000000 CopyDataInit
08010198 l       .text	00000000 LoopFillZerobss
08010192 l       .text	00000000 FillZerobss
080101bc l       .text	00000000 Infinite_Loop
00000000 l    df *ABS*	00000000 d:/arm/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7-m/crti.o
00000000 l    df *ABS*	00000000 crtstuff.c
0801085c l     O .eh_frame	00000000 __EH_FRAME_BEGIN__
200004b4 l     O .jcr	00000000 __JCR_LIST__
08000184 l     F .text	00000000 __do_global_dtors_aux
200004b8 l       .bss	00000000 completed.8108


저작자표시 비영리 변경금지 (새창열림)

'C언어,ARM' 카테고리의 다른 글

VC++ 6.0 으로 gcc 크로스 컴파일 환경 구축 방법  (0) 2016.09.09
STMicroelectronics HEX파일 gcc HEX파일 비교  (0) 2016.09.09
LinkerScript - stm32_flash.ld  (0) 2016.09.09
uint64_t gcc err  (0) 2016.09.09
gcc - error: two or more data types in declaration specifiers  (0) 2016.09.09
Posted by 안녕1999
, |

MFC - WS_VSCROLL, WS_HSCROLL 은 언제 생길까?

카테고리 없음 / 2016. 9. 1. 23:00

터치스크린 스크롤바 문제로, 가짜 스크롤바를 만들고 있다.

MFC윈도우에서, 스크롤바는 언제 생길까?



BOOL CView::PreTranslateMessage(MSG* pMsg)에서는 WM_SIZE메세지가 전달되지 않는다.



나중에...

저작자표시 비영리 변경금지 (새창열림)
Posted by 안녕1999
, |
«이전 1 2 다음»

최근에 달린 댓글

글 보관함

링크

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.