• 카테고리

    질문 & 답변
  • 세부 분야

    임베디드 · IoT

  • 해결 여부

    미해결

안녕하세요~

21.11.14 18:30 작성 조회수 135

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
질문은 아닙니다. 매번 강의를 잘 보고 있습니다.데이터시트와 구글링 만으로도 충분히 가능은 하겠지만... 이렇게 깔끔하게 정리된 강의가 있다는 점에서 너무 좋네요~
 
처음 강의를 구매하고 FC컨트롤러를 구매한 것은 작년초반, 그러니까 드론강의가 한창 새로 올라오고 있을때였습니다. 기억하실지 모르겠습니다 ㅎㅎ fc 2개인가 3개인가를 회사에서 구매했었을거에요 ㅎㅎ
매번 업무에 밀려 하지 못하다가 본격적으로 시작한건 음...이제 3일정도 된것 같네요. 이렇게나 빨리 진행이 가능했던건 다 강사님 덕분이 아닐까 싶습니다.
 
제가 이 글을 쓰는 이유는.. 강의를 보면서 조금 보충이 되면 좋지 않을까 하는 부분들이 조금씩 있어서 도움이 될까 하는 마음에 주제넘게 끄적입니다. 부디 지적하는것으로는 바라보시지 않으셨으면 좋겠습니다.
 
1. 포인터를 인자로 전달받는 함수를 호출하면서 버퍼를 넘겨주실때
예를 들어서 telemetry_tx_buf 의 주소를 매개변수로 넘겨주실때
&telemetry_tx_buf[0] 이런식으로 표현을 하시는데 사실..배열을 선언할때 그 배열의 이름이 배열의 첫번째 변수의 주소를 가르키는 포인터이기에 telemetry_tx_buf를 넘겨주는것으로 충분합니다.
버퍼의 이름 자체가 첫 멤버의 주소이니까요. 이것이 문법상 더 매끄럽고 컴파일러에 따라 다르겠지만 최적화를 잘 하지 못하는 컴파일러에서는 미묘할지라도 성능에 차이가 납니다.
&telemetry_tx_buf[0]은 엄연히 따지면 배열의 첫 멤버주소를 알려주며 거기서 0번째 뒤의 멤버( =결국은 자기자신 )의 value( 주소가 아닌 실제 저장된 값 )찾은다음 다시 그 value의 주소를 찾는 과정으로 의미없는 연산을 하라는 의미가 됩니다.
 
2. cubeIDE는 문제가 되지 않는것 같지만.. 제가 알고있기로는 코드에 의해서 제어되는 것이 아니라 dma나 외부입력의 의해 변경될 수 있는 레지스터에 의해서만 그 값이 변하고, 유저가 코딩한 부분에서는 실질적으로는 읽기만 하고 쓰지는 않는 변수를 반복적으로 사용하거나 하는등 코드만 봤을 때 조건문 혹은 반복문에 쓰이거나 특정 변수에만 할당되는 경우 일부 컴파일러는 최적화하는 과정에서 이 변수를 지워버리거나 최악의 경우 일부 코드를 통째로 도려내버리는 경우가 있습니다.
이것을 방지하기 위해 c에서 명시적으로 이 변수는 내가 바꾸지 않아도언제든 변경될 수 있으니 컴파일러 너가 보기에 필요없어 보일지라도 최적화를 하지 마라는 의미의 volatile이 있지요.
여기선 저도 긴가민가 하긴 하지만 배터리 전압을 담는 battVolt 변수는 volatile float 타입으로 지정했으면 더 명확하지 않았을까! 이런 생각이 들었습니다.
 
3. 이번챕터는 저의 경우 it.c 파일내 인터럽트 핸들러 함수내에 카운터는 10으로 하나만 초기화하고, !(count % 20) 으로, 그리고 count == 110 으로 두고 count==110에 해당하면 10으로 리셋해주는 방식으로 두개의 조건이 10ms 어긋나도록 하여 메인함수에서는 if문 하나만 추가해주는 것으로 해결하였습니다. 이것 또한 사실 정석이 아닌것을 알고 정답이 아닌것을 알지만 이러한 방법도 좋지 않을까 해서 끄적였습니다 ㅎㅎ
 
 
저도 사실 C를 그렇게 잘하는 사람이 아니고..단순히 C자체를 업으로 하고 좋아해서 파고들다 보니 조막만한 지식을 공유하고 싶어서 아는체를 해 봤습니다.
마지막으로 좋은 강의 너무 잘 보고 있습니다. 감사합니다!

답변 2

·

답변을 작성해보세요.

0

박정식님의 프로필

박정식

질문자

2021.11.20

안녕하세요! 혹시나 도움될까 싶어서 글을 쓰고 난 후 사실 배워가는 주제에 너무 아는척 나선게 아닐까 걱정했었는데 좋은 의미로 받아주셨다니 다행입니다.

제가 이런걸 또 못참는 성격이라 괜히 또 이야기를 꺼내야 해서요...

 

네 지적이 맞는것 같습니다ㅜㅜ 다만 나쁜 의도로 이야기를 꺼낸것이 아니라 혹시라도 도움이 될까 이야기를 꺼낸 것이지 절대 비방이나 모욕 등 나쁜 의도로 이야기를 꺼낸것이 아니라는 의미에서 그렇게 썼는데 표현이 이상했네요..ㅎㅎ

 

그리고 강사분께서 조금 더 쉽게 설명하고자 일부러 그렇게 표현하셨다는 말씀하신걸 보고 제가 강의하시는 분의 고민을 이해하지 못하고 나선점 우선 죄송하게 생각합니다. 그 말씀을 보고 다시 생각해보니 왜 코드를 그렇게 설명하셨는지 이해가 가더군요ㅎㅎ

 

1번 이야기에 관해 조금 더 자세하게 이야기 해주시길 요청해 주셨는데 이건 사실 경험적인 부분이고 명확하게 비교한 문서같은 것은 저에겐 없습니다

제가 이야기하고자 했던 것은 정확히 말씀드리면 컴파일러에 따라 디폴트로 셋팅된 옵티마이징 레벨이 다르기에 배열포인터를 넘겨주는 것(abcArray)과 배열원소의 주소를 넘겨주는것(&abcArray[0])이 어셈블러로 번역되었을때 코드가 다를 수 있다는 의미였습니다

물론 컴파일러가 성능이 우수하여 이것을 적절히 옵티마이징 해 준다면 실행성능에 차이가 없겠지만 컴파일러 자체의 성능이 그리 좋지 못하다면 위와 같은 결과가 나올수 있습니다

이런 차이가 두드러지는 것이 임베디드 혹은 펌웨어를 위한 크로스 컴파일러인 것으로 알고 있구요

물론 강사님이 어떤 의도로 코드를 짜신 건지 알고나니 제가 주제넘었다는 것을 깨달았습니다 혹시라도 언짢으신 부분이 있으셨다면 정말 죄송합니다

 

혹시나 이런 내용을 다룬 블로그 같은게 있나 싶어서 찾아봤는데 비슷한 이야기를 한 블로그가 있어서 링크 걸어둡니다

https://m.blog.naver.com/tipsware/221018587422

 

다시한번 너무 좋은지식 착한 가격에 풀어주셔서 너무 감사합니다! 앞으로도 많은 좋은 강의 기대하겠습니다!좋은 하루 되세요~

 

0

안녕하세요! 좋은 말씀 감사합니다.

저도 C언어를 쓰는 문법만 사용하고, 또 강의에서는 직관적이고 이해하기 쉬운 방법으로 코드 작성을 하기 때문에 강의용 코드는 최적화적인 관점에서는 좋은 코드가 아닙니다.

1. 배열명은 배열의 첫번째 원소의 주소인 것은 알고있습니다만 컴파일러에 따라 최적화를 다르게 한다는것은 처음 듣는 내용이네요~ 혹시 참고할만한 자료가 있으시면 알려주시면 감사하겠습니다!

배열 전달 시 배열 명으로 전달하면 코드만 봤을때 call by value 인지 call by reference인지 한눈에 알기 어렵습니다. 강의에서는 코드를 봤을때 직관적으로 이해되도록 설명하고 있기 때문에 &arr[0] 이런식으로 전달합니다.

2. 네 맞습니다. interrupt handler에서 사용되는 전역변수는 volatile로 선언되지 않으면 최적화되면서 사라질 수 있으나, 강의에서는 코드 최적화 레벨을 -0으로 하기 때문에 그 현상은 일어나지 않습니다. CubeIDE의 코드 최적화 레벨은 기본 -0으로 되어있습니다.

그 내용은 본 강의에서는 따로 언급하진 않았습니다. 

3. 싱크를 맞추기 위한 방법이 여러가지 있겠으나, 강의에서는 제가 판단했을때 이해하기 쉬운 방법을 선택합니다. 사실 이것도 주관적인거라서 어떤 것이 더 쉬울지는 수강하시는 분들에 따라 달라지겠죠. 방법이 하나만 있는것이 아니라서, 다양한 방법을 직접 시도해보는 것은 언제든 좋습니다.

 

마지막으로 "부디 지적하는것으로는 바라보시지 않으셨으면 좋겠습니다."라고 하셨는데, 올리신 글은 지적하는 것이 맞습니다. 그리고 지적하는 것이 잘못됐거나 나쁜 것은 아니라는 생각입니다.

근데 지적하는 사람들이 악의를 가지고 지적하거나 혹은 악의가 없더라도 받아들이는 사람이 기분나쁘게 지적하는 경우가 많기 때문에 건전한 논쟁이 잘 안되는 것이죠.

제 영상은 교육 영상이기 때문에 잘못된 것이 있다면 지적받고 수정해서 수강생 분들에게 정확한 정보를 제공해야 합니다. 앞으로 진행하시다가 잘못된 것이 있다면 언제든 글 올려주셔도 좋습니다.

그리고 1번의 경우 컴파일러마다 미묘한 성능차이가 난다고 말씀하셨는데, 어떤 미묘한 차이가 나는지도 설명해주시면 좋을 것 같습니다. 혹은 참고할만한 자료가 있으면 공유해주셔도 좋겠네요~ 다른 수강생 분들도 보실 수 있을테니까요.

좋은 지적 감사합니다!