블로그 이미지
안녕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

달력

« » 2024.5
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 31

공지사항

최근에 올라온 글

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

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

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

#ifdef _DEBUG

test_run_xxxx();

#endif 

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

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

Posted by 안녕1999
, |

비트필드로 구성한 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
, |

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

보통 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


Posted by 안녕1999
, |

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

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



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



나중에...

Posted by 안녕1999
, |

장점도 많지만, 단점에 대해서만 나열해봅니다.


C++언어의 단점(Class 사용에 따른 단점)


- C함수에 비해, 속도가 느리다.

- 상속/추상화등으로 인해,

  부모클래스가 감추어져, 속을 알 기 어렵다.(설계를 잘해야한다)

  중복코드(중복 멤버변수, 함수, 비슷한 기능의 class들의 중복 상속. 디버깅이 난해할 수 있다.)

- 코드사이즈 증가


※대체적으로 발생가능한 문제입니다. 반드시 그런것은 아닐 수 있습니다.


기타 의견 있으면, 적어주시기 바랍니다.

Posted by 안녕1999
, |

C++은 객체지향형 언어라고 한다.

보통 "Class"라고 부르는 C++의 자료형 때문이다.

C++에서는 함수와 변수를 묶어서 Class로 표현한다.

덕분에, 특정 동작을 하는 모듈을 상속을 통해, 쉽게 설계할 수 있고,

강력한 추상화를 지원한다.

추상화를 통해, C언어에서는 만들기 어려웠던 것들도, C++에서는 쉽게 구현이 가능해지는것도 있다.

어쨌든 C++은 C언어보다는 진보된 언어이다.

그러나, 장점이 많지만, 단점도 존재한다.

바로, 속도가 느려진것이다.


C언어에서는 클래스포인터등을 사용하지 않고, 주로 전역변수등을 통해, 쉽게 속도향상이 가능했다.

그러나, 전역변수를 많이 사용할 수록, 복잡한 프로그램은 작성이 어려워진다.

유지보수 또한 매우 어려워진다.

C언어에서도 구조체를 통해, 상속을 구현할 수 도 있다.

원리는 C++와 동일하다.

단, C에서는 클래스포인터를 따로 처리해주지 않으므로, 동일한 동작을 하는 코드를 작성했을때는, C++로 작성한 프로그램이 더 빠르다.(컴파일러가 지원해주지 않으니)

장점이 있다면, 단점도 있다.


Class의 멤버함수, 변수를 참조, 호출하기위해서는 this라고 하는 클래스 포인터가 필요하며, this 포인터 참조를 한번은 더 해야한다.

가끔 호출하는 멤버함수나 변수는 성능에 문제가 없으나, 매우 자주 호출되는 기능을 멤버함수나 변수로 만들경우, 엄청나게 느려질 수 도 있다.


컴퓨터가 발전함에따라, 메모리양이 늘어나고, 속도도 빨라져, C++로 작성해도, 큰 불편함은 없었다.

아니, 사실은 잘 못느낄 뿐이었다.

C++로 작성한 프로그램을 사용하다가, C로 작성된 프로그램을 사용하면, 매우 빨리, 매우 부드럽게, 잘 동작하는것을 느낄 수 있다. 물론, 기능은 떨어진다.

하지만 그만큼의 가치가 있는지 묻고 싶다.(대부분 어쩔 수 없다.)


C++언어는 상속이라는 과정을 통해, 어떤 기능을 호출하면, 마치 양파을 까듯이, 하나 하나 호출하는 방식으로 동작한다.

그러니 당연히 느릴 수 밖에 없다.

C언어로도 C++처럼 동일한 방식으로 작성한다면, 동일하거나, 더 느리다.

그러나, C언어는 위에서도 설명했지만, 비교적 간단한 기능을 프로그램하며, 사람이 직접 전역변수등을 통해, 직/간접적으로 최적화를 시킨다.

그러므로, 속도는 매우 빠르다.


C언어의 단점은 위와 같은 방식으로 전역변수를 많이 사용할 경우, 규모가 큰 프로그램은 작성이 어려워진다.

또한 스파게티 코드라고 부르는 디버깅이 난해한 프로그램이 자주 탄생한다.


규모가 큰 프로그램은  C++로 작성하는것이 좋고, 소규모의 간단하고, 속도가 필요한 프로그램은 전역변수를 많이 사용하는 C언어처럼 작성하는것이 좋다.


C++언어로도 C코드를 만들 수 있다. 당연한 소리.

C++언어로 C와 똑같은 방식으로 프로그램이 가능하다.


어쨌든, 최신 컴퓨터를 사용하는 사람은 잘 못느끼지만, 10년전 20년전 컴퓨터를 사용하는 사람도 많다.

오래된 컴퓨터를 사용하는 사람들에게는 C++언어로 작성된 프로그램은 느릴 수 밖에 없다.


윈도우 운영체제도 내부적으로 C함수로 작성되던 것이, 이제는 점점 C++클래스로 바뀌고 있다.

덕분에 윈도우 업그레이드를 할 수록, 전체적으로 무거워진다.

최신 윈도우에 불필요한(?)기능이 많기도 하지만, C++ 언어의 클래스 때문에 느려지는것 한몫한다.


윈도우XP를 사용하던 컴퓨터에 윈도우7을 설치하니, 너무 느려서, 답답하다.

똑같은 프로그램을 실행하는데도 말이다.


대부분의 사용자들은 최신 컴퓨터에, 최신 기술을 선호한다.

그러나, 최신 기술들은 대부분, 속도면에서 더 느려진다.

동일한 작업을 하는데 있어, 필요이상의 고급 하드웨어와 많은 프로그램 코드를 사용하고 있지는 않은지?


그래도, 최신 컴퓨터와, 최신 운영체제와, 최신 프로그램을 선호하는 사람이 더 많은것은, 어쩔 수 없는 인간의 특성인듯 싶다.


"짜증나면, 컴퓨터를 바꿔라"....???



어쨌든, 이런 특성을 지닌 인간이 설계한 기계는, 가격을 낮추거나, 규모를 축소하는데, 많은 어려움이 있다.

대부분의 개발자들은 컴퓨터의 운영체제가 지원해주는 편리한 기능들을 마구(?) 가져다 사용한다.

그리고나서, 최소 사양을 결정지을때는, 동작하기도 어려운 버벅임을 해결하는데, 고생도 한다.

때로는 아예 실행이 안되는 경우도 있다.


인터넷 뱅킹을 하는데, 여러가지 설치프로그램들이 덕지덕지 설치해야한다.

윈도우XP라면, 서비스펙2이상을 설치해야하고, .Net프레임워크, XML 등도 설치해야한다.

설치가 안되면, 아예 동작이 안된다.


물론 윈도우7에서는 기본적으로 설치가 되어 있다.


사람들은 현재의 편리함을 위해, 약간의 성능 희생하고, 점점 느려지는 컴퓨터를 원망하기도 한다.


물론, 컴퓨터가 느려지는것이, C에서 C++로 바뀌었기때문만은 아니다.

그러나, 상당 부분 영향이 있는것은 사실이다.

하드웨어는 점점 빨라졌지만, 소프트웨어는 오히려 점점 느려졌다.


요약 : 컴퓨터가 점점 느려지는 원인중에 하나는 C++ Class의 영향도 무시할 수 없다.

Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함