안녕하세요.

 

저도 최근에 영어를 공부하면서 깨닫게 된 재미있는 정보가 있어서 공유해드립니다.

위 제목처럼

영어와 한국어 차이점을 컴퓨터 언어로 표현하자면,

이렇게 비유하고 싶습니다.

한국어 - Intel

영어 - Arm

더 정확히 비유한다면 아래와 같습니다.

한국어 - CISC

영어 - RISC

이유를 설명하자면

기본적으로 단어의 개수가 영어에 비해서 한국어가 월등히 많습니다.

한국어 약 115만개 / 영어 약 71만개

비슷한 것 같지만 실제 사용하는 단어 위주로 하면 아마 한국어 단어수가 훨씬 많을 겁니다.

(그렇다고 RISC 과 CISC 명령어 개수의 비율로 따지지 마시고 의미론적으로 그렇다 라는 의미입니다)

한국어는 어떤 상황을 한 단어로 표현이 가능하고, 영어는 단어를 만들어내면서 표현이 가능합니다.

미국 컨추리 노래 중 Dierks Bentley - Riser 가 있는데

(전형적인 미국 백인 남성의 사고 방식을 알 수 있는 노래입니다)

코러스 가사가 멋집니다.

I'm a riser

I'm a get up off the ground, don't run and hider

Pushing comes to shove

Hey, I'm a fighter

When darkness comes to town, I'm a lighter

A get out aliver of the fire

Survivor

-er 로 각운을 잡은 건데.

lighter 단어는 담배 불 붙이는 라이터가 아니라 T.T

빛을 내는 자 란 뜻입니다.

riser -> rise + er 일어서는 자

hider -> hide + er 숨는 자

aliver -> alive + er 살아난 자

lighter -> light + er 어둠을 밝히는 자

라이터 l i g h t e r 이라고 단어를 백날 외우고 엉뚱한 해석을 하는 거지요.

나는 라이터다! 뭐 그렇게 해석해도 의미는 통합니다 .불을 붙이는 거니깐요.

aliver 라는 단어는 없는데 .. 라고 하시면 안됩니다. 만들어 쓰는 겁니다.

(get-out-aliver) -> 이게 명사로 보입니다. 가사 쓰면서 만들어진 단어.

A get out aliver of the fire 가사 멋지지 않나요! 시련을 벗어나서 살아남은 자

만약, 미국 남부 지방에 출장가서, 될까 말까 까리한 프로젝트가 있을때

기회가 생겨서 그 사람들 앞에서 이 곡을 부른다면 프로젝트 딸 확률이 매우 높아 질껍니다.

예를 든다면,

미얀마에서 엔지니어가 출장와서 노래방에 한국 사람들하고 같이 왔는데

갑자기 강산에 의

흐르는 강물을 거꾸로 거슬러 오르는 연어들~~~

하며 반짝이는 눈으로 노래 부른다고 생각해보세요. 저 같으면 무조건 채용 또는 프로젝트 계약합니다. ㅎㅎ

아 이 사람은 한국의 정서를 알고 있구나! 한국 사람이네!

반대로

어 동양인인데 우리 아버지 정서를 아네! 미국놈이구먼!

예전에 타일러라는 외국인이 [한국어는 단어의 무게가 무겁다] 라는 글을 본적이 있습니다.

그말의 의미가 단어가 지니는 의미가 다양하다 라는 것이 아니라, 단어가 주는 의미가 더 명확하고 상세하다라고 생각됩니다.

어떤 상황을 두언어로 묘사하면 한국어는 한단어로 표현이 되는데 ,

영어에는 없는 표현이어서 단어들을 조합해야 되는 경우가 많지요.

한국어의 음식은 음식 그 자체이나 , 영어의 food 는 영혼의 양식도 가능한 의미가 있습니다.

[영혼의 음식]이라고 한국어에서는 말하지 않지요.

따라서, 한국어 단어는 포함하는 의미론적의 크기가 작은 편이고, (더 명확합니다)

비슷한 영어 단어는 한국어 단어의 의미크기를 공유하면서 덩어리가 더 크다 라고 생각됩니다.

갑자기 이 비유가 생각나서 까먹을 것 같아서 적어봅니다.

그래도 나름 프로그래머라 언어도 분석적으로 공부하게 되네요 T.T

학문적으로 저도 접근하지 실제 영어는 잘 못합니다. ㅎㅎㅎ

즐거운 하루 되세요~~

안녕하세요.

예전에 마이컴으로 HDLC 10Mbps 처리하는 프로젝트에 대해서 거의 성공했다고 말씀드린적이 있습니다.

나름 뿌듯해하고 있었는데, 다시 난관을 만났었습니다. 항상 지뢰밭이 연속

문제를 만났을 때 해결 방법에 대한 글로 읽어도 좋으므로 , 이쪽 관련 기술이 아니더라도

문제 해결 및 디버깅에 도움이 되실 거 같습니다.

신호 레벨은 RS-485 라 짧은 거리에서는 문제없이 잘 동작합니다.

그런데 테스트 조건이 10Mbps 로 무려 쉴드케이블 200M 24시간 동작 조건입니다.

저는 당연히 이 문제는 하드웨어에서만 해결하면 되겠지하고 테스트 했는데 웬걸

100ms 당 20-30번 이상 CRC 에러나 길이 에러가 발생하네요.

순간 무얼 수정해야 할지 멍해지면서 역시 FPGA 를 사용했었어햐 하는 생각이 막 들더군요.

그런데 돌아가기에는 너무 먼길을 왔지요.

저의 디버깅 순서는

1. HW 문제 일까 SW 문제일까?

- 확인 방법 : FPGA 로 동작하는 다른 회사 제품의 RS-485로직에서 점퍼를 띄워서 , 개발품에 입력시키면

485 HW 로직인지 SW 문제인지 판별이 될꺼야.

-결론 : HW 문제로 내심 기대했지만 동일한 에러가 발생하므로 SW 문제였습니다.

2. SW 문제라면 왜 놓치는 걸까?

- 확인 방법 : 놓치는 순간의 신호가 무언까 찌그러 질꺼야. 타이밍이 안 맞겠지

로직 아날라이저로 깨진 신호만 패턴 시간을 하나하나 읽어서 따라가봄.

역시 100ns 단위의 칼 같았던 신호가 , 80ns 90ns 뭉개져 있었음. 될때도 있고 안될때고 있고.

- 결론 : 데이터 파싱시 edge 떨어지마 마자 인식하도록 해놓았는데 노이즈로 데이터가 뭉게질때 놓치는 것 같음.

3. 위 가정을 설립하고 해결 방법 도출

- 고민 : 만약 펄스 중앙에서 읽는데 이런 현상은 DMA 타이밍이 흔들리는 것 밖에 없음.

아니면 펄스 중앙에서 읽지 않는 다는 것. 둘 중 하나임.

- 확인 방법 : DMA 읽어가는 속도가 흔들리는 거는 가능성이 낮고 , 2번째 가설이 확율이 높음.

그러나 언제 정확하게 DMA 가 읽어가는지 눈으로 타이밍 확인이 불가능 함.

정말 edge 근처인지 읽는건지 알수가 없음. 현재 정보로는 대략 edge 이후 60ns 근처로

거의 중앙에서 읽는 것으로 추정만 됨. -> 그렇다면 해당 문제는 없어야 함.

- 실행 : 읽는 타이밍을 카운터를 적당히 중간값으로 변경후 확인해보았으나 동일.

여기서 좌절. 해당 가설이 맞지가 않나..

이제 미궁속으로 빠짐. 어떻게 해야할지 머리가 하얗게 변함.

4. 해결 시도

- 23년의 해결 노하우 총동원 (별거 아닙니다. 불안한 마음을 잠재우고 심리 상태를 편하게 만들어

최대한 집중도를 높이는 방법이지요)

1) 편안한 배경음악 틀기

- 몇년마다 발생하는 이런 현상에 대비하기 위한 나만의 음악 플레이 리스트 재생

- 해당 플레이 리스트는 효과를 극대화 하기 위하여 평소에는 절대 재생하지 않으며

위와 같은 절체 절명의 순간에서만 재생. 23년간 한 6-7번만 사용함.

2) 혼잣말하며 주변 산책

3) 다시 처음부터 내 생각에 오류가 없는지 차근차근 되집어봄.

4) 아무나 붙잡고 내 생각의 설명함 (러버덕코딩 기법)

- > 최근 그 아무나에 대한 부작용이 심각( 그 사람은 매우 피곤해 하기 때문에) 하여 사용을 자제하고 있었음.

5. 해결

1) 2시간의 집중 처방 이후 아이디어 떠오름

2) 타이밍 카운터를 임의로 중간값만 해보았는데 , 그냥 한칸식 밀면서 하나씩 해보자. 250번만 해보면 되겠네.

3) 1씩 증가시켜가며 컴파일 테스트 반복.

4) 어라 특정 값 범위부터 동작함. 유레카!

5) 자 그럼 안되는 값 범위를 찾아. 다시 1씩 증가시켜가며 컴파일 테스트 반복.

6) 동작잘하는 범위 확보. 따라서 최종 값은 최소값과 최대값의 중간 값.

7) 나머지 속도도 마찬가지로 테스트.

-> 숫자 1 바꾸고 컴파일하고 해당 값 범위 찾고 수시간 소요.

8) 모든 속도에서 정확하다고 생각되는 지연값 검출.

6. 결론.

1) 노이즈에 따른 신호 타이밍 흔들림이 맞으며 소프트웨어로 중간에서 읽어가도록 변경하여 해결.

2) 24시간 동안 한번의 데이터 누락없이 파싱 성공.

7. 어려운 프로젝트의 보상 - 지식 부스러기들

1) 2.5Mbps 에서 부터 종단 저항없이는 200m 라인 사용이 어려움.

6-700kbps 아래는 종단 저항없이 쉴드케이블 200m 정도는 가뿐히 동작.

UART 신호라면 over sampling 되는 uart 나 아예 gpio로 만들면 해결될 것으로 보임.

2) DMA 타이머 동작은 믿을만 하다. 항상 그렇지만 내가 문제.

3) 역시 내 음악 플레이 리스트의 효과가 좋구나.

4) 예전에는 이런 문제는 한달이상 소요되었는데 하루안에 되는 걸 보면 나도 이제 고인물?

5) 최적화를 거급하다보니 10Mpbs 에서 읽어내기가 초기에는 매우 빠듯했는데 , 이제는 RX TX 사이에

딜레이를 걸고 동작시킴. 너무 최적화했나..여유가 있으니 중간에 로직 처리를 더 넣더라도 마음이 편안함.

6) 현재 MCU 에서 20Mbps 읽기도 가능할거 같으나 스펙이 아니므로 그냥 할수 있을거 같다 정도..

7) 현재 MCU 가 최소의 사양으로 생각되었으나, 더더욱 노력하면 더 저가의 MCU 및 클럭으로도 가능할 것 같은

생각이 드나, 나는 용역이므로 여기서 마무리. 근데 자꾸 원가를 절감하지 않으면 무언가 마음 한켠이

불편함. 예전에는 남이 안하는 거 오버해서 제공했으나 프로는 돈보다 10-20%만 더해주면 됨.

더 해주면 내 손해, 고객 이익이 아니라 . 나도 손해, 장기적으로 고객도 손해. 이 시장의 다른 분들에게도 손해.

8) MCU 풀로 동작키시니 10Mbps 에서는 꽤 열이 발생. 항온조 테스트시 염려할 정도는 아니나

차가운 FPGA 에 비하면 없어보이는 정도. 이거는 MCU 의 한계. 전류 소모가 많음.

처리 속도를 낮추면 기가막히게 온도가 내려감. 100ns가 나름 MCU 입장에서는 빡신가 봄.

이제 해당 제품은 공식 인증절차에 들어가게 되는데 남은 지뢰가 얼마나 될지..걱정이지만 잘 될거라 봅니다.

예전에 제가 마이컴으로 10MBps 신호를 잡아서

CRC 처리하고 다 파싱해서 4us 안에

응답패킷(CRC 포함)을 만들어서 처리하는 프로젝트에 대해서 질문드린적이 있습니다.

다들 FPGA를 권하셨지만

(당연히 FPGA 사용이 맞는 프로젝트지요)

하지만!

이론적으로 가능하다는 결론을 내고 과감히 MCU 로 도전하였고 2달 고생해서 성공한 것으로 보입니다.

아래 신호는 10Mbps 신호를 파싱해서 3.46us 만에 정상 응답하는 결과물입니다.

현재는 HSI 로 처리해서 데이터를 놓치는 경우가 많습니다. HSE 로 해보니 데이터 유실 비율이 확연히 줄어들어서, 노이즈 처리 잘하고 좋은 오실레이터를 사용해서 보드를 제작하면 될 것으로 생각됩니다.

물론 100% 패킷을 보장해야 된다던지 특수한 오류 처리를 해야 된다던지 하는 조건에는 미달하지만

현재 정도라면 이 프로토콜에서는 양호한 수준이라 생각됩니다.

그동안 검토한 내용은 아래와 같습니다.

1. 통신 주파수에 맞는 최고 클럭 MCU 를 찾자.

2. 개발보드 구매후 실제 패킷을 아날라이저로 보고 프로토콜 사양서를 참조하여 파싱 알고리즘 작성 및 검증

3. 제일 느린 통신 속도에서부터 하나씩 검증.

4. HSE 와 HSI 통신 파싱 에러율 검토

5. 응답 속도를 최대한 빠르게 하기위하여 CRC 알고리즘 재작성 및 파싱 알고리즘 최적화

6. 그냥 패킷을 전체 받고 나중에 계산하는 것이 아니라 한비트씩 받으면서 모든 연산 처리

7. 보낼때도 다 패킷을 만들고 보내는 것이 아니라 STX 부터 보내면서 데이터를 만들어 처리

8. 모든 보내고 받는 연산은 DMA 처리

9. HAL 라이브러리 거의 들어내고 레지스터 직접 연산 처리

남들이 가지 않는 길을 가서 굉장히 불안했었는데 나름 쾌감이 드는 프로젝트가 된거 같습니다.

무조건 STM32H7가 이 이정도 다 처리된다고 생각하시면 안되고

프로토콜의 여러가지 개구멍을 이용하여 처리하였으므로

일반적으로 다른 프로젝트에 적용하시면 안되니 주의바랍니다.

FPGA 쓰셔요~~~

+ Recent posts