Tập hợp một số câu hỏi phỏng vấn vị trí Lập Trình Nhúng. Các câu hỏi và đáp án sẽ được bổ sung theo thời gian.
Nếu các bạn có câu hỏi hoặc cách trả lời khác, vui lòng để lại ý kiến của bạn ở phần bình luận bên dưới.
Câu hỏi về lập trình C
Q1: Cho biến c, hãy set bit 4 của nó
A:
c |= 0x10;
Q2: Cho biến c, hãy clear bit 3 của nó.
A:
c &= ~0x048;
Q3: Define một hàm swap() đổi giá trị hai biến integer a và b.
A:
void swap (int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
Sử dụng hàm swap()
int a = 1, b = 4;
swap(&a, &b);
Q4: Cho đoạn code sau, kết quả in ra là gì?
char str_a[] = "Hello, World! I am newbie"; char *p = str_a; p += strlen("Hello, World!\n"); printf("%s", &p[-14] );
A: Kết quả in ra màn hình:
Hello, World! I am newbie
Ở dòng lệnh thứ 3, strlen("Hello, World!\n")
trả về 14, nên con trỏ p dịch tới 14 kí tự. Tiếp theo trong hàm printf
, &p[-14]
lấy lại địa chỉ của phần tử đầu tiên của mảng str_a
(dịch lùi 14 kí tự). Do đó kết quả in ra là nội dung mảng str_a
.
Q5: Cho đoạn code sau:
#define ABS(X) (X < 0 ? -X , X) int main() { int x = 5; result = x++; printf("result = %d\n", result); printf("x = %d\n", x); }
a. Khi biên dịch sẽ cảnh báo (warning) cái gì?
b. Kết quả in ra màn hình là gì?
A:
Câu a: Warning: main function do not return a value of type 'int' Câu b: result = 5 x = 6
Q6: Cách sử dụng con trỏ hàm (pointer to function)?
a. Cho một hàm func
trả về void
, có 2 tham số kiểu integer
b. Khai báo một con trỏ hàm để trỏ vô hàm func
.
c. Sử dụng con trỏ hàm vừa tạo để trỏ vô địa chỉ của hàm func
d. Gọi hàm func thông qua con trỏ hàm trên.
A:
Câu a: void func (int a, int b); Câu b: void (*fp) (int, int); // declare fp is a function pointer variable Câu c: fp = &func; // fp is a pointer to function func() hoặc fp = func; Câu d: (*fp)(4,5); // invoking func() using fp cũng có thể sử dụng tên con trỏ hàm mà không cần dấu * fp(4,5);
Xem: https://www.geeksforgeeks.org/function-pointer-in-c/
Lưu ý: Con Trỏ Hàm (Function Pointer) và Hàm Trả Về Con Trỏ (Function Returning Pointer)
void (*fun_ptr)(int); // declare a function pointer void *fun_ptr(int); // declare a function that returns void pointer
Q7: Cấu Trúc (Struct)
a. Sử dụng typedef struct
để định nghĩa (define) một struct
tên object_t gồm có 3 trường (field) – trường idx kiểu integer, trường len kiểu integer, và trường buf kiểu con trỏ character
b. Kích thước của object_t là bao nhiêu byte, giả sử với chip 32-bit.
c. Viết hàm object_t creat_object(int size);
trả về một structure object_t
có các field tương ứng có giá trị của parameter.
A:
typedef struct object_ST { int idx; // 4 bytes int len; // 4 bytes char* buf; // 4 bytes } object_t; // total = 12 bytes object_t creat_object(int index, int length) { if(size > 0) { obj.idx = index; obj.len = length; obj.buf = (char*)malloc(sizeof(char) * length); if(obj.buf != NULL) return obj; } return NULL; }
Q8: Ghi giá trị 0x12345678 vào thanh ghi có địa chỉ 0x2000, giả sử với chip 32-bit
A:
(*((volatile uint32_t *)0x2000)) = 0x12345678;
Q9: Định nghĩa macro thanh ghi I2C3_MSA_R có địa chỉ 0x40023000, sau đó gán giá trị 0x12345678 cho thanh ghi thông qua macro này.
A:
#define I2C3_MSA_R (*((volatile uint32_t *)0x40023000))
I2C3_MSA_R = 0x12345678;
Q10: What is the output of the following code?
struct pp
{
int x;
int y;
};
int main()
{
struct pp p1[] = {1, 2, 3, 4, 5, 6};
struct pp *ptr1 = p1;
printf("%d %d\n", ptr1->x, (ptr1 + 2)->x);
}
A. 1 5
B. 1 3
C. Compile-time error
D. None of the above
Answer: A
Q11: Consider the following source code:
int main()
{
FILE *fp = stdout;
int n;
fprintf(fp, "%d ", 45);
fflush(stdout);
fprintf(stderr, "%d", 65);
return 0;
}
What is the output:
A. 45 65
B. 65 45
C. 45
D. Compilation error
Answer: A
Q12: Consider the following source code:
void myfunction(char *q)
{
memcpy(q, "hello", 6);
}
int main()
{
char *dt;
myfunction(dt);
printf(dt);
}
What modifications are needed to display “hello” on the screen?
(Select all that apply)
A. No modifications are needed, “hello” will be displayed when the source is compiled and run.
B.
void myfunction(char *q)
{
memcpy(q, "hello", 6);
}
int main()
{
char *dt[8];
myfunction(dt);
printf(dt);
}
C.
void myfunction(char *q)
{
q = malloc(8);
memcpy(q, "hello", 6);
}
int main()
{
char *dt[8];
myfunction(dt);
printf(dt);
}
D.
void myfunction(char *q)
{
memcpy(q, "hello", 6);
}
int main()
{
char *dt = malloc(8);
myfunction(dt);
printf(dt);
}
Answer: A, B, D
A. Print hello
B. Print hello . But has warnings when compiling
C. Nothing to print
D. Print hello . But has warnings when compiling
Q: Biến Static được lưu ở phân vùng nào của bộ nhớ
A: Lưu trong phân vùng data của RAM. – Xem thêm Biến static trong C.
Q: Danh Sách Liên Kết (Linked List)
Viết code định nghĩa một danh sách liên kết đơn.
Q: Phân biệt Semaphore và Mutex
Q: Trình bày giao thức I2C
Q: Trình bày giao thức SPI
Q: RISC-V là gì?
Q: Phân biệt hàm malloc()
và calloc()
Q: Mô tả quá trình biên dịch, source files, header files, object files, linker, executable files
Q13: Cho mảng như sau:
int arr[10] = {9,7,5,8,4,0,6,2,1,3};
Hãy sắp xếp các phần tử trong mảng theo thứ tự từ nhỏ đến lớn.
Answer: sử dụng Selection Sort Algorithm – https://www.geeksforgeeks.org/selection-sort/
#include <stdio.h> void printArray(int *arr, int length) { for(int i = 0; i < length; i++) { printf("%d ", arr[i]); } printf("\n"); } void swap(int *a, int *b) { int temp = *b; *b = *a; *a = temp; } void selectionSort(int *arr, int length) { int min_i = 0; for(int i = 0; i < length; i++) { min_i = i; // Find the minimum number in unsorted array for(int j = i+1; j < length; j++) { if(arr[min_i] > arr[j]) { min_i = j; } } if(min_i != i) { swap(&arr[min_i], &arr[i]); } } } int main(void) { int arr[] = {9,7,5,8,4,0,6,2,1,3}; int length = sizeof(arr)/sizeof(arr[0]); printf("Unsorted array:\n"); printArray(arr, length); selectionSort(arr, length); printf("Sorted array:\n"); printArray(arr, length); return 0; }
Output:
Unsorted array 9 7 5 8 4 0 6 2 1 3 Sorted array 0 1 2 3 4 5 6 7 8 9
Q14: Consider the following source code:
#include <stdio.h> int main(void) { int i = 10; printf("%d ", sizeof(++i)); printf("%d", i); return 0; }
What is the output?
Answer:
4 10
Q15: Consider the following source code:
#include <stdio.h> int main(void) { int n = 0; if(n = printf("hello\n")) { printf("A. %d\n", n); } else { printf("B. %d\n", n); } return 0; }
What is the output?
Answer:
hello A. 6
Câu hỏi về bản thân (Mindset)
Q1. Câu hỏi về mức lương What are your salary expectations?
I want my salary to fit my qualifications and experience.
Tôi muốn một mức lương phù hợp với năng lực và kinh nghiệm của bản thân.
Câu trả lời này không chỉ cho thấy bạn không phải là một kẻ hám tiền, mà còn cho thấy một sự rõ ràng và minh bạch cùng tinh thần cầu tiến của bạn. Với một mức lương phù hợp với năng lực và hiệu quả công việc của bạn, chắc hẳn bạn sẽ luôn muốn nâng cao hiệu suất làm việc lên cao nhất để được hưởng một mức lương tốt nhất. Điều này sẽ ghi điểm rất nhiều trong mắt nhà tuyển dụng, đặc biệt với những người ở trong các tập đoàn đa quốc gia.
Đừng ngại thể hiện tham vọng và mong muốn của bản thân với công việc
Nguồn: 7 câu hỏi và trả lời phỏng vấn xin việc bằng tiếng Anh
Q2. Lý do rời bỏ công ty cũ: Why did you leave your job?
Câu hỏi này dành cho những bạn đã có kinh nghiệm làm việc nhưng bỏ chỗ cũ để xin việc ở chỗ mới. Một trong những điều nên làm khi trả lời phỏng vấn xin việc bằng Tiếng Anh chính là trả lời thật ở những câu hỏi nhạy cảm. Bạn cần phải trả lời thật lý do của mình, tuy nhiên tuyệt đối không được nói xấu chỗ làm cũ hay sếp cũ. Ví dụ:
The reason why I leave my job is because I found the old job boring and I want to find more challenges. I don’t want my feeling to affect the company, that’s why I left.
Lý do tôi nghỉ ở chỗ làm cũ vì tôi thấy nó chán và tôi muốn tìm thêm nhiều thử thách cho bản thân. Tôi không muốn vì cảm xúc này của tôi mà ảnh hưởng đến công ty, vậy nên tôi đã xin nghỉ việc.
Tuy nhiên, nếu kinh nghiệm ở chỗ làm cũ của bạn là chưa đến 2 năm, bạn tuyệt đối không nên sử dụng lý do này bởi người phỏng vấn sẽ rất dễ nghĩ là bạn “nhảy việc”. Bởi vậy, hãy đưa ra những lý do khác như:
Although the boss was very nice and the working environment was really suitable for me, I still didn’t like the job because the company was very far from my house. Everyday I wasted so much time travelling and it was very tiring. That’s why I left the job.
Dù sếp cũ của tôi rất tốt và môi trường làm việc rất phù hợp nhưng tôi vẫn không thích công việc đó bởi công ty quá xa nhà tôi. Mỗi ngày tôi tốn rất nhiều thời gian cho việc đi lại và việc này thật là mệt mỏi. Đó là lý do tôi nghỉ làm ở chỗ cũ.
Và hãy nhớ rằng, đây là câu hỏi về công việc cũ trong quá khứ, do đó bạn cần phải để ý cách phát âm của mình ở thì quá khứ nếu không sẽ rất dễ gây nhầm lẫn với người phỏng vấn.
Nguồn: 7 câu hỏi và trả lời phỏng vấn xin việc bằng tiếng Anh
..