RTOS Embedded SW coding interview 후기들 2

  • #3610163
    Shine Bright 69.***.24.86 1530

    RTOS Embedded SW쪽은 일단 코딩 질문들이 간단합니다. 자주 나왔던 질문들을 리트 코드에서 찾아봤어요.
    계속 강조하지만 중요한건 코딩보다 설명하고 상대방을 이해 시키는 능력입니다. 일대일로 내가 짜는 코드를 실시간으로 보면서 코딩을 하고 있기 때문에, 코딩을 하면서 상대방에게 계속 설명을 해야 되고, 상대방이 뭐 이것 고쳐보자, 저것 최적화 해보자 라고 얘기하면 실시간으로 고쳐야 합니다.
    첫째도 영어, 둘째도 영어, 셋째도 영어예요.

    첫번째로 간단하게 bit 조작하는 문제 많이 냅니다.
    예를 들어서 unsigned int에서 1의 개수 구하기.
    Number of 1 Bits
    https://leetcode.com/problems/number-of-1-bits/

    두번째로 String으로 된 숫자를 Integer로 변환하기, 또는 그 반대
    String to Integer (atoi)
    https://leetcode.com/problems/string-to-integer-atoi/

    세번째로 Array Sort하기
    최적화 하지 말고 그냥 풀어보기,
    잘 풀면, 아마 최적화 할 수 있는 방법으로 풀어보라고 하겠죠. Merge Sort 알고리즘 하나 공부하심 될 것 같아요.
    Sort an Array
    https://leetcode.com/problems/sort-an-array/

    네번째로 Queue
    아무 Queue나 디자인 해보고 설명해 보라고,, ㅠㅠ
    보통 Circular Queue 많이 쓰니까, Circular Queue 디자인 해서 잘 설명할 수 있으면 될 것 같습니다.
    C++로 짰더니, 무슨 언어 쓴거냐고 물어보더라고요. OTL
    Design Circular Queue
    https://leetcode.com/problems/design-circular-queue/

    다섯번째로 Linked List 관련 문제
    비슷한 문제를 leetcode에서 못 찾았네요. 아래가 그나마 비슷함.
    Delete Node in a Linked List
    https://leetcode.com/problems/delete-node-in-a-linked-list/

    실제 문제는 다음과 같았습니다. 이것도 처음 list node 정의부터 해야 되겠죠. 한번 짜보세용.
    Singly Linked List를 하나 만들고, M값과 N값을 받아서, list에서 M개 건너뛰고 N개 지우고, 다시 M개 건너뛰고 N개 지우는 코드를 짜 보기
    예를 들어 Linked List에 Value 값이 1, 2, 3, 4, 5, 6, 7, 8, 9 이렇게 저장되어 있고, M이 2 N이 1이면 다음과 같은 결과값이 나와야 함.
    1 2 4 5 7 8

    그리고 몇몇 질문들,, 한번 댓글로 답을 달아봐 주세요.
    문제는 답을 맞추는게 중요한 것이 아닙니다. 인터뷰어가 뭘 알고 싶어하는지 숨은 의도를 찾아내야 되요. 기대 이상의 대답을 할 수 있어야 해요. 보통 그 팀에서 개발하면서 생길 수 있는 문제들이나 필요한 것들을 물어보는 경우가 있더라고요.

    1. 배열에 1부터 49까지 순서 상관없이 저장되어 있는데, 그 중 한 숫자가 빠졌다. 그 숫자를 찾아내는 방법은?

    2. 배열에 1부터 49까지 순서 상관없이 저장되어 있는데, 그 중 두 숫자가 빠졌다. 그 두 숫자를 찾아내는 방법은?

    본인이 짠 알고리즘의 time complexity랑 space complexity를 이야기 하고, 그것을 줄일 수 있는 알고리즘으로 optimize 해보기

    3. 다음과 같은 코드를 주고, 눈으로 보고 답을 이야기 해보라는 경우가 있었습니다.
    void main(){
    uint32_t num = 0x12345678;
    uint8_t* uc_ptr;
    uint32_t * ui_ptr = #

    uc_ptr = (uint8_t*) ui_ptr;
    uc_ptr++;
    printf(“0x%x\n”, *uc_ptr);
    }
    어떤 답변을 해야 할까요? 댓글 달아주시면 정답을 알려주겠습니다. 코드는 제가 대충 생각나는대로 적은겁니다.

    4. 다음 코드는 Int로 된 숫자를 Sring으로 변환해서 return하는 코드이다. 잘못 된 부분이 무엇일까?

    예 unsinged int 값이 45896이면 string “45896”으로 return 해야 됨.

    char* ConvertInt2Str(uint32_t num){
    char String[12];
    char* str = String;

    while(num){
    i = num % 10;
    *(str++) = i + ‘0’;
    num = num / 10;
    }
    return str;
    }

    5. String으로 8진수, 16진수, 10진수 등의 숫자를 받아서 integer 값으로 변환하시오.
    첫번째 parameter는 string, 두번째 parameter는 첫번째 숫자의 진수
    예 int Str2Int(“3456”, 10) // 3456 return
    int Str2Int(“45”, 16) // 4*16+5 return
    int Str2Int(“34”, 8) // 3*8+4 return

    아마 이 쉬운 문제들 빨리 빨리 잘 풀고 나면, 좀 더 어려운 문제를 더 냈을 지도 모르겠지만, 워낙 코딩해 놓고도 설명하는데 애를 먹어서 참 힘들었네용.
    그리고 중간 중간 Embedded System에 관한 질문들을 툭툭 던집니다.

    6. RTOS가 뭔지 설명해 보시오.

    7. RTOS에서 Task Switching이 일어날 때 OS가 하는 일이 무엇인지 설명해 보시오.

    8. Mutex에 대해서 설명해 보시오.

    9. Lower priority task가 mutex를 가지고 있는데 high priority task가 해당 mutex를 가지려고 할 때 발생할 수 있는 문제점 설명

    10. heap에 대해서 설명해 보시오. (데이터 구조의 heap이 아니라 메모리 영역에 stack, heap을 이야기 하는 것임)

    11. heap을 잘못 썼을 때 생길 수 있는 문제점 설명 (memory leakage)

    이런 질문들은 단순한 개념을 답변해주는 것보다는 그 외에 본인이 개발하면서 실제 그런 문제들이 언제 일어났었고 어떻게 해결했는지, 또는 그 문제들을 방지하기 위해서 어떤 방법을 사용했는지 잘 설명하면 좋을 것 같아요.

    • 호호 173.***.31.52

      자세한 후기 감사드립니다.
      행운이 가득하시길

    • a 64.***.218.106

      주로 엔트리나 쥬니어 레벨의 테스트 같습니다.
      시니어 이상되면…저런 문제를 잘 풀어서가 아니라..저런 문제는 온라인에서 코드 카피해서 쓸수도 있다라는 가정으로 잘 묻지 않습니다.
      그보다는 개발 환경 구축과 아케텍쳐에 대해 많이 묻습니다.

      예를 들면..

      이런 저런 애플리케이션을 만들려고 한다. 어떤 플랫폼을 추천하겠느냐… (embedded linux, rtos, or bare metal??)
      어떤 프로세서를 사용하겠느냐
      왜 그걸 사용하느냐
      IDE는 어떤걸 쓰겠느냐
      임베디드 리눅스 데몬 설치는 어떻게 하느냐
      패키지는 어떻게 만드느냐..
      임베디드 리눅스 빌드 시스템을 뭘 써봤냐… (Yocto, buildroot, etc)
      메모리 맵 관련
      펌웨어 엄그레이드 관련
      부트로더 관련 (uboot)
      세컨드 부르로더 매핑 관련
      프로토콜 관련 (modbus, i2c, tcpip, hart, canbus 등등 애플리케이션관 연동되는 특정 프로토콜들)

      이런 전체적인 개발 시스템과 아키텍쳐에 대해 묻습니다.

      • Shine Bright 69.***.24.86

        Board Bring Up쪽 주로 하시는 시스템쪽 엔지니어신것 같아 보이네요. 저는 좀 특수 분야라서 코딩 보다는 스펙을 얼마나 잘 아냐가 더 중요하기 때문에 Coding은 정말 간단하게 개념 위주로 물어보는 것 같았습니다.
        한번 문제에 대한 답을 풀어서 코딩으로 댓글 달아봐 주세요. 왜 인터뷰어가 저런 질문을 한것인지 댓글 달겠습니다.

    • 무의미 174.***.154.56

      자세한 후기 감사합니다. 시스템 레벨 프로그래밍에서 무난한 질문들입니다. new grad에게 저런거 물으면 스트러글 하는 친구들이 많아요. A사에서 인턴했다는데, bit의 개념이 없는 친구도 봤어요.

    • 98.***.8.171

      간단코딩 단골질문은 행렬곱하기도 있죠
      이차원 어레이 잘 핸들하는지 보는거죠